spaps-server-quickstart 0.6.0__tar.gz → 0.6.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.
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/CHANGELOG.md +7 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/PKG-INFO +4 -4
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/README.md +1 -1
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/docs/UPGRADING.md +10 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/pyproject.toml +3 -3
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/__init__.py +1 -1
- spaps_server_quickstart-0.6.1/src/spaps_server_quickstart/openapi_auth.py +229 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/spaps_app.py +26 -0
- spaps_server_quickstart-0.6.1/tests/contracts/test_manifest_fastapi_script.py +82 -0
- spaps_server_quickstart-0.6.1/tests/contracts/test_openapi_auth_metadata.py +189 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/contracts/test_sdk_docs_parity_script.py +156 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/.gitignore +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/.python-version +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/TM-002-IMPLEMENTATION.md +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/docs/MIGRATION_GUIDE.md +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/docs/TDD_PLAN.md +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/docs/TM-ENV-001-checklist.md +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/docs/TM-ENV-001-email-environment-safety.md +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/docs/feature-plans/INDEX.md +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/docs/feature-plans/_archived/diff-mvp-plan.md +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/docs/feature-plans/security-audit-remediation-2026q1/AUDIT_REPORT.md +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/docs/feature-plans/security-audit-remediation-2026q1/README.md +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/docs/feature-plans/security-audit-remediation-2026q1/backend.md +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/docs/feature-plans/security-audit-remediation-2026q1/flows.md +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/docs/feature-plans/security-audit-remediation-2026q1/frontend.md +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/docs/feature-plans/security-audit-remediation-2026q1/plan.md +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/docs/feature-plans/security-audit-remediation-2026q1/schema.mmd +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/docs/feature-plans/security-audit-remediation-2026q1/shared.md +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/docs/feature-plans/trust-invariants-kernel/README.md +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/docs/feature-plans/trust-invariants-kernel/backend.md +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/docs/feature-plans/trust-invariants-kernel/describe-wave-1-principal-proxy-reuse.md +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/docs/feature-plans/trust-invariants-kernel/flows.md +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/docs/feature-plans/trust-invariants-kernel/frontend.md +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/docs/feature-plans/trust-invariants-kernel/plan.md +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/docs/feature-plans/trust-invariants-kernel/schema.mmd +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/docs/feature-plans/trust-invariants-kernel/shared.md +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/docs/messaging-broker-plan.md +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/docs/security-audit-remediation-2026q1-tm007-tm008.md +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/scripts/release.sh +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/alembic/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/alembic/naming.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/api/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/api/dependencies.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/api/domains/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/api/domains/health_router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/api/domains/metrics_router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/api/health.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/api/router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/app_factory.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/auth/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/auth/cookies.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/auth/dependencies.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/auth_channels.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/db/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/db/alembic_status.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/db/migration_runner.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/db/session.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/_common/clients.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/_common/pagination.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/_db/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/_db/base.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/_db/model_registry.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/_db/orm_helpers.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/_db/rls.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/_db/types.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/affiliate_referrals/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/affiliate_referrals/errors.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/affiliate_referrals/models.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/affiliate_referrals/repository.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/affiliate_referrals/router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/affiliate_referrals/schemas.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/affiliate_referrals/service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/agent_approvals/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/agent_approvals/authz.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/agent_approvals/errors.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/agent_approvals/models.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/agent_approvals/repository.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/agent_approvals/router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/agent_approvals/schemas.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/agent_approvals/service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/app_links/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/app_links/errors.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/app_links/models.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/app_links/repository.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/app_links/router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/app_links/schemas.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/app_links/service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/applications/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/applications/blueprints.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/applications/models.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/applications/repository.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/applications/router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/applications/schemas.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/applications/service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/audit/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/audit/errors.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/audit/models.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/audit/repository.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/audit/retention.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/audit/router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/audit/schemas.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/audit/service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/audit/tasks.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/auth/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/auth/repository.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/auth/router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/auth/schemas.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/auth/service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/billing_accounts/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/billing_accounts/models.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/billing_accounts/repository.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/billing_accounts/resolver.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/billing_accounts/router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/billing_accounts/schemas.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/billing_accounts/service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/cfo/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/cfo/errors.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/cfo/models.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/cfo/quickbooks.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/cfo/repository.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/cfo/router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/cfo/schemas.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/cfo/service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/cfo_roles/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/cfo_roles/errors.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/cfo_roles/me_router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/cfo_roles/router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/cfo_roles/schemas.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/cfo_roles/service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/crypto/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/crypto/errors.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/crypto/models.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/crypto/repository.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/crypto/router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/crypto/schemas.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/crypto/service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/dayrate/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/dayrate/errors.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/dayrate/models.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/dayrate/pricing.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/dayrate/repository.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/dayrate/router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/dayrate/schemas.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/dayrate/service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/dev/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/dev/router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/dev/schemas.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/dev/service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/device_flow/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/device_flow/repository.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/device_flow/router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/device_flow/schemas.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/device_flow/service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/device_flow/store.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/docs/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/docs/discovery.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/docs/errors.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/docs/models.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/docs/repository.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/docs/router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/docs/schemas.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/docs/service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/email/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/email/config.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/email/errors.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/email/mailgun.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/email/models.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/email/repository.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/email/router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/email/schemas.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/email/service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/entitlements/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/entitlements/errors.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/entitlements/models.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/entitlements/repository.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/entitlements/router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/entitlements/schemas.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/entitlements/service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/errors.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/events.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/hosted_assets/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/hosted_assets/errors.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/hosted_assets/models.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/hosted_assets/storage.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/issue_reporting_platform/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/issue_reporting_platform/errors.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/issue_reporting_platform/models.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/issue_reporting_platform/repository.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/issue_reporting_platform/router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/issue_reporting_platform/schemas.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/issue_reporting_platform/service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/notifications/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/notifications/models.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/notifications/repository.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/notifications/router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/notifications/schemas.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/notifications/service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/notifications/tasks.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/policies/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/policies/errors.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/policies/evaluator.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/policies/models.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/policies/repository.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/policies/router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/policies/schemas.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/policies/service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/realtime/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/realtime/router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/realtime/schemas.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/realtime/service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/redirects.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/secure_messages/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/secure_messages/encryption.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/secure_messages/errors.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/secure_messages/models.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/secure_messages/repository.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/secure_messages/router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/secure_messages/schemas.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/secure_messages/service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/security/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/security/errors.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/security/models.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/security/repository.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/security/router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/security/schemas.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/security/service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/self_service/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/self_service/errors.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/self_service/router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/self_service/schemas.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/self_service/service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/sessions/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/sessions/admin_detection.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/sessions/blacklist_service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/sessions/jwt_service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/sessions/models.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/sessions/nonce_service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/sessions/password_service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/sessions/repository.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/sessions/router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/sessions/schemas.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/sessions/service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/skill_evals/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/skill_evals/errors.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/skill_evals/models.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/skill_evals/repository.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/skill_evals/router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/skill_evals/schemas.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/skill_evals/service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/stripe/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/stripe/errors.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/stripe/guest_checkout.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/stripe/models.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/stripe/repository.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/stripe/router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/stripe/schemas.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/stripe/service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/stripe/tasks.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/stripe/webhook_handler.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/support_telemetry_platform/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/support_telemetry_platform/errors.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/support_telemetry_platform/models.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/support_telemetry_platform/repository.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/support_telemetry_platform/router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/support_telemetry_platform/schemas.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/support_telemetry_platform/service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/usage_control/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/usage_control/errors.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/usage_control/models.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/usage_control/repository.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/usage_control/router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/usage_control/schemas.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/usage_control/service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/users/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/users/models.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/users/repository.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/users/router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/users/schemas.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/users/service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/wallets/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/wallets/addressing.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/wallets/chains/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/wallets/chains/dispatcher.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/wallets/chains/ethereum.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/wallets/chains/solana.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/wallets/models.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/wallets/repository.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/wallets/router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/wallets/schemas.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/wallets/service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/webhooks/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/webhooks/delivery.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/webhooks/destination_security.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/webhooks/errors.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/webhooks/models.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/webhooks/repository.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/webhooks/router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/webhooks/schemas.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/webhooks/service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/webhooks/signing.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/webhooks/tasks.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/whitelist/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/whitelist/models.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/whitelist/repository.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/whitelist/router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/whitelist/schemas.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/whitelist/service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/x402/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/x402/adapter.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/x402/constants.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/x402/errors.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/x402/models.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/x402/repository.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/x402/router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/x402/schemas.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/x402/security.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/domains/x402/service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/local_mode/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/local_mode/middleware.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/local_mode/personas.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/logging.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/middleware/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/middleware/api_key.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/middleware/client_ip.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/middleware/envelope.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/middleware/error_handler.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/middleware/jwt_auth.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/middleware/key_scope.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/middleware/local_mode.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/middleware/origin_validation.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/middleware/rate_limiting.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/middleware/security_headers.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/middleware/spaps_deps.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/middleware.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/money/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/rbac/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/schemas/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/schemas/health.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/sdk/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/sdk/_ttl_cache.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/sdk/admin_token_cache.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/sdk/feature_evaluator.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/sdk/role_hierarchy.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/sdk/server_clients.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/sdk/trusted_service_middleware.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/secure_messaging.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/seeds/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/seeds/cli.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/seeds/schemas.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/seeds/validator.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/settings.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/spaps_settings.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/startup.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/tasks/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/tasks/celery_factory.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/tasks/health.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/tasks/notifications.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/.pre-commit-config.yaml +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/alembic/env.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/alembic/script.py.mako +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/alembic/versions/.gitkeep +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/alembic.ini +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/docs/templates/API_DOCUMENTATION_TEMPLATE.md +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/docs/templates/DEBUG_REPORT_TEMPLATE.md +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/docs/templates/OPERATIONS_PLAYBOOK_TEMPLATE.md +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/domains/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/domains/admin/router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/domains/auth/local_routes.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/domains/users/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/domains/users/models.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/domains/users/repository.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/domains/users/router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/domains/users/schemas.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/domains/users/service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/operations/.env.production.example +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/operations/.githooks/pre-push +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/operations/.github/workflows/deploy.yml +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/operations/.github/workflows/rollback.yml +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/operations/Makefile +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/operations/deploy/deploy.sh +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/operations/deploy/docker-compose.migration.yml +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/operations/deploy/post-deploy-verify.sh +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/operations/deploy/pre-deploy-checks.sh +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/operations/docker-compose.prod.yml +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/operations/scripts/backup-db.sh +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/operations/scripts/dev/await_db.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/operations/scripts/dev/fetch-prod-db.sh +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/operations/scripts/dev/local-debug-loop.sh +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/operations/scripts/dev/start-db.sh +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/operations/scripts/dev/stop-db.sh +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/operations/scripts/new-migration.sh +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/operations/scripts/prepush.sh +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/operations/scripts/restore-db.sh +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/scripts/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/scripts/seeds/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/scripts/seeds/data/users.yaml +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/scripts/seeds/schemas/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/scripts/seeds/schemas/users.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/tests/README.md +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/tests/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/tests/api/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/tests/api/test_health.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/tests/api/test_users_auth.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/tests/conftest.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/tests/domains/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/tests/domains/example/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/tests/domains/example/conftest.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/tests/domains/users/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/tests/domains/users/conftest.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/tests/integration/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/tests/integration/test_db_connectivity.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/tests/unit/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/templates/tests/unit/test_settings.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/testing.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/tools/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/src/spaps_server_quickstart/tools/dependency_alignment.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/templates/Makefile +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/templates/docker-compose.yml +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/templates/operations/.env.production.example +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/templates/operations/.github/workflows/deploy.yml +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/templates/operations/Makefile +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/templates/operations/deploy/deploy.sh +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/templates/operations/deploy/post-deploy-verify.sh +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/templates/operations/deploy/pre-deploy-checks.sh +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/templates/operations/deploy/reverse-proxy/README.md +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/templates/operations/deploy/reverse-proxy/certs/.gitkeep +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/templates/operations/deploy/reverse-proxy/docker-compose.yml +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/templates/operations/deploy/reverse-proxy/nginx.conf +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/templates/operations/deploy/reverse-proxy/sites-available/.gitkeep +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/templates/operations/deploy/reverse-proxy/sites-enabled/.gitkeep +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/templates/operations/deploy/reverse-proxy/static/.gitkeep +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/templates/operations/deploy/reverse-proxy/up.sh +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/templates/operations/docker-compose.dev.yml +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/templates/operations/docker-compose.prod.yml +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/templates/operations/scripts/dev/await_db.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/templates/operations/scripts/dev/local-debug-loop.sh +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/templates/operations/scripts/dev/start-db.sh +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/templates/operations/scripts/dev/stop-db.sh +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/templates/tests/conftest.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/conftest.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/contracts/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/contracts/test_app_factory_contract.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/contracts/test_auth_contract.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/contracts/test_celery_contract.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/contracts/test_db_contract.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/contracts/test_dependencies_contract.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/contracts/test_error_copy_contract.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/contracts/test_golden_app_pack.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/contracts/test_health_contract.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/contracts/test_manifest_parity.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/contracts/test_oss_hygiene_script.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/contracts/test_pagination_contract.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/contracts/test_router_contract.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/contracts/test_settings_contract.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/contracts/test_x402_devnet_prereq_script.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/contracts/test_x402_mainnet_billing_sql_script.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/contracts/test_x402_mainnet_db_script.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/contracts/test_x402_mainnet_env_script.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/contracts/test_x402_mainnet_evidence_script.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/contracts/test_x402_mainnet_live_script.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/contracts/test_x402_production_deployment_script.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/_db/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/_db/test_orm_helpers.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/affiliate_referrals/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/affiliate_referrals/test_repository.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/affiliate_referrals/test_router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/affiliate_referrals/test_schemas.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/affiliate_referrals/test_service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/agent_approvals/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/agent_approvals/test_authz.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/agent_approvals/test_authz_wiring.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/agent_approvals/test_callback_url_validation.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/agent_approvals/test_repository.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/agent_approvals/test_router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/agent_approvals/test_service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/app_links/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/app_links/test_blueprints.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/app_links/test_router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/app_links/test_service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/applications/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/applications/test_blueprints.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/applications/test_repository.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/applications/test_router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/applications/test_service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/audit/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/audit/test_repository.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/audit/test_retention.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/audit/test_router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/audit/test_service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/auth/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/auth/test_refresh_token_anomaly.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/auth/test_repository.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/auth/test_router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/auth/test_service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/auth/test_user_enumeration_timing.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/billing_accounts/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/billing_accounts/test_repository.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/billing_accounts/test_resolver.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/billing_accounts/test_router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/cfo/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/cfo/test_repository.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/cfo/test_router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/cfo/test_service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/cfo_roles/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/cfo_roles/test_router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/cfo_roles/test_service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/conftest.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/crypto/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/crypto/test_repository.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/crypto/test_router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/crypto/test_service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/dayrate/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/dayrate/test_allotment_service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/dayrate/test_booking_policy_service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/dayrate/test_booking_routes.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/dayrate/test_enhanced_booking_service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/dayrate/test_pricing.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/dayrate/test_repository.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/dayrate/test_router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/dayrate/test_service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/dev/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/dev/test_router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/dev/test_service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/device_flow/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/device_flow/test_router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/device_flow/test_service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/device_flow/test_store.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/docs/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/docs/test_repository.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/docs/test_router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/docs/test_service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/email/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/email/test_config.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/email/test_env_safety.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/email/test_repository.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/email/test_router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/email/test_service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/entitlements/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/entitlements/test_repository.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/entitlements/test_router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/entitlements/test_service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/hosted_assets/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/hosted_assets/test_storage.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/issue_reporting_platform/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/issue_reporting_platform/test_repository.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/issue_reporting_platform/test_router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/issue_reporting_platform/test_service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/notifications/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/notifications/test_models.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/notifications/test_repository.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/notifications/test_router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/notifications/test_service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/policies/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/policies/test_evaluator.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/policies/test_repository.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/policies/test_router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/policies/test_service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/realtime/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/realtime/test_service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/secure_messages/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/secure_messages/test_encryption.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/secure_messages/test_repository.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/secure_messages/test_router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/secure_messages/test_service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/secure_messages/test_tm013_security.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/security/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/security/test_repository.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/security/test_router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/security/test_service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/self_service/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/self_service/test_router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/sessions/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/sessions/test_admin_detection.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/sessions/test_repository.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/sessions/test_router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/sessions/test_service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/skill_evals/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/skill_evals/test_dogfood_workflow.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/skill_evals/test_router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/skill_evals/test_service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/stripe/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/stripe/test_guest_checkout.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/stripe/test_repository.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/stripe/test_router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/stripe/test_service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/stripe/test_subscription_application_scoping.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/stripe/test_tasks.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/stripe/test_webhook_handler.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/stripe/test_webhook_hardening.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/support_telemetry_platform/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/support_telemetry_platform/test_repository.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/support_telemetry_platform/test_router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/support_telemetry_platform/test_service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/test_redirects.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/test_smoke.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/usage_control/test_repository.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/usage_control/test_router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/usage_control/test_service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/users/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/users/test_repository.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/users/test_router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/users/test_service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/wallets/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/wallets/test_addressing.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/wallets/test_chains.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/wallets/test_legacy_routes_tenant_binding.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/wallets/test_repository.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/wallets/test_router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/wallets/test_service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/webhooks/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/webhooks/test_delivery.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/webhooks/test_destination_security.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/webhooks/test_repository.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/webhooks/test_router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/webhooks/test_service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/webhooks/test_signing.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/webhooks/test_tasks.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/whitelist/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/whitelist/test_repository.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/whitelist/test_router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/whitelist/test_service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/x402/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/x402/test_facilitator_adapter.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/x402/test_money_contract.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/x402/test_router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/domains/x402/test_service.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/middleware/__init__.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/middleware/test_api_key.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/middleware/test_client_ip.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/middleware/test_envelope.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/middleware/test_error_envelope_v1.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/middleware/test_jwt_auth.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/middleware/test_key_scope.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/middleware/test_local_mode.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/middleware/test_origin_validation.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/middleware/test_rate_limiting.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/middleware/test_security_headers.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/middleware/test_spaps_deps.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/seeds/test_cli.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/test_alembic_naming.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/test_alembic_path_bootstrap.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/test_api_naming_guard.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/test_api_router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/test_app_factory.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/test_auth.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/test_auth_channels.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/test_auth_cookies.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/test_auth_dependencies.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/test_bcrypt_compat.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/test_db_session.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/test_dependency_alignment.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/test_dev_data_pipeline.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/test_environment_safety.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/test_health_router.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/test_imports.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/test_local_mode.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/test_logging.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/test_middleware.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/test_migration_runner.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/test_migration_status.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/test_operations_templates.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/test_package_metadata.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/test_primitive_guardrails.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/test_rbac.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/test_readme_snippets.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/test_sdk.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/test_secure_messaging.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/test_seed_validation.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/test_session_autocommit.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/test_sessions_blacklist.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/test_sessions_jwt.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/test_sessions_nonce.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/test_sessions_password.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/test_settings.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/test_spaps_app.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/test_startup_validation.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/tests/test_tasks.py +0 -0
- {spaps_server_quickstart-0.6.0 → spaps_server_quickstart-0.6.1}/todo.md +0 -0
|
@@ -6,6 +6,13 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [0.6.1] - 2026-06-01
|
|
10
|
+
|
|
11
|
+
### Changed
|
|
12
|
+
|
|
13
|
+
- Relaxed the FastAPI upper bound to `<0.120` so downstream services can adopt FastAPI 0.119 and Starlette security fixes.
|
|
14
|
+
- Relaxed the `cryptography` upper bound to `<46.0` so downstream services can resolve CVE-fixed releases without local pip-audit ignores.
|
|
15
|
+
|
|
9
16
|
## [0.6.0] - 2026-05-29
|
|
10
17
|
|
|
11
18
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: spaps-server-quickstart
|
|
3
|
-
Version: 0.6.
|
|
3
|
+
Version: 0.6.1
|
|
4
4
|
Summary: Shared FastAPI/Celery scaffolding for Sweet Potato service backends.
|
|
5
5
|
Project-URL: Homepage, https://api.sweetpotato.dev
|
|
6
6
|
Project-URL: Repository, https://github.com/sweet-potato/spaps
|
|
@@ -21,10 +21,10 @@ Requires-Dist: asyncpg<0.31,>=0.30.0
|
|
|
21
21
|
Requires-Dist: bcrypt<6.0,>=4.0.0
|
|
22
22
|
Requires-Dist: botocore<2.0,>=1.35.0
|
|
23
23
|
Requires-Dist: celery<6.0,>=5.5.3
|
|
24
|
-
Requires-Dist: cryptography<
|
|
24
|
+
Requires-Dist: cryptography<46.0,>=42.0.0
|
|
25
25
|
Requires-Dist: email-validator<3.0,>=2.1.0
|
|
26
26
|
Requires-Dist: eth-account<1.0,>=0.13.0
|
|
27
|
-
Requires-Dist: fastapi<0.
|
|
27
|
+
Requires-Dist: fastapi<0.120,>=0.118.0
|
|
28
28
|
Requires-Dist: greenlet<4.0,>=3.0.3
|
|
29
29
|
Requires-Dist: httpx<0.29,>=0.28.1
|
|
30
30
|
Requires-Dist: orjson<4.0,>=3.10.0
|
|
@@ -295,7 +295,7 @@ From the repository root: `make pytest`, `make lint`, `make typecheck`, `make py
|
|
|
295
295
|
## Metadata
|
|
296
296
|
|
|
297
297
|
- `package_name`: `spaps-server-quickstart`
|
|
298
|
-
- `latest_version`: `0.
|
|
298
|
+
- `latest_version`: `0.6.1`
|
|
299
299
|
- `minimum_runtime`: `Python >=3.12`
|
|
300
300
|
- `api_base_url`: `https://api.sweetpotato.dev`
|
|
301
301
|
|
|
@@ -216,7 +216,7 @@ From the repository root: `make pytest`, `make lint`, `make typecheck`, `make py
|
|
|
216
216
|
## Metadata
|
|
217
217
|
|
|
218
218
|
- `package_name`: `spaps-server-quickstart`
|
|
219
|
-
- `latest_version`: `0.
|
|
219
|
+
- `latest_version`: `0.6.1`
|
|
220
220
|
- `minimum_runtime`: `Python >=3.12`
|
|
221
221
|
- `api_base_url`: `https://api.sweetpotato.dev`
|
|
222
222
|
|
|
@@ -4,6 +4,16 @@ When `spaps-server-quickstart` publishes new releases, dependent services (e.g.
|
|
|
4
4
|
`consumer_server`, `ingredient_server`) need a predictable upgrade cadence. Follow this
|
|
5
5
|
checklist whenever we cut a release or adopt a newer version downstream.
|
|
6
6
|
|
|
7
|
+
## 0.6.1
|
|
8
|
+
|
|
9
|
+
This is a dependency-bound patch release only. It permits FastAPI 0.119.x
|
|
10
|
+
(including compatible Starlette security fixes) and `cryptography` 45.x without
|
|
11
|
+
requiring any SPAPS application-code migration.
|
|
12
|
+
|
|
13
|
+
Downstream services should refresh their dependency lockfile after bumping
|
|
14
|
+
`spaps-server-quickstart` to 0.6.1, then run their normal lint, typecheck, test,
|
|
15
|
+
and security-audit gates.
|
|
16
|
+
|
|
7
17
|
## For the Quickstart Maintainer (Publishing a Release)
|
|
8
18
|
|
|
9
19
|
1. **Triage changes** – confirm whether the release is a patch, minor, or major bump.
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "spaps-server-quickstart"
|
|
7
|
-
version = "0.6.
|
|
7
|
+
version = "0.6.1"
|
|
8
8
|
description = "Shared FastAPI/Celery scaffolding for Sweet Potato service backends."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.12"
|
|
@@ -23,7 +23,7 @@ classifiers = [
|
|
|
23
23
|
"Topic :: Internet :: WWW/HTTP",
|
|
24
24
|
]
|
|
25
25
|
dependencies = [
|
|
26
|
-
"fastapi>=0.118.0,<0.
|
|
26
|
+
"fastapi>=0.118.0,<0.120",
|
|
27
27
|
"uvicorn[standard]>=0.37.0,<0.38",
|
|
28
28
|
"sqlalchemy>=2.0.30,<3.0",
|
|
29
29
|
"asyncpg>=0.30.0,<0.31",
|
|
@@ -55,7 +55,7 @@ dependencies = [
|
|
|
55
55
|
# Phase 3-4: Stripe + Entitlements
|
|
56
56
|
"stripe>=8.0.0,<12.0",
|
|
57
57
|
# Phase 7: PII Encryption (AES-256-GCM + HKDF-SHA256)
|
|
58
|
-
"cryptography>=42.0.0,<
|
|
58
|
+
"cryptography>=42.0.0,<46.0",
|
|
59
59
|
]
|
|
60
60
|
|
|
61
61
|
[project.optional-dependencies]
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
"""OpenAPI authentication metadata for the SPAPS route contract."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from collections.abc import Iterable
|
|
6
|
+
from copy import deepcopy
|
|
7
|
+
from typing import Any
|
|
8
|
+
|
|
9
|
+
from fastapi.routing import APIRoute
|
|
10
|
+
|
|
11
|
+
from .middleware.key_scope import is_endpoint_allowed_for_publishable
|
|
12
|
+
|
|
13
|
+
OPENAPI_AUTH_EXTENSION = "x-spaps-auth"
|
|
14
|
+
|
|
15
|
+
SPAPS_SECURITY_SCHEMES: dict[str, dict[str, Any]] = {
|
|
16
|
+
"SpapsApiKey": {
|
|
17
|
+
"type": "apiKey",
|
|
18
|
+
"in": "header",
|
|
19
|
+
"name": "X-API-Key",
|
|
20
|
+
"description": "Generic SPAPS application API key. Prefer the more specific publishable or secret-key schemes when an operation declares them.",
|
|
21
|
+
},
|
|
22
|
+
"SpapsPublishableKey": {
|
|
23
|
+
"type": "apiKey",
|
|
24
|
+
"in": "header",
|
|
25
|
+
"name": "X-API-Key",
|
|
26
|
+
"description": "Browser-safe SPAPS publishable key (`spaps_pub_*`). Requires an allowed Origin and route/method scope.",
|
|
27
|
+
},
|
|
28
|
+
"SpapsSecretKey": {
|
|
29
|
+
"type": "apiKey",
|
|
30
|
+
"in": "header",
|
|
31
|
+
"name": "X-API-Key",
|
|
32
|
+
"description": "Server-side SPAPS secret or legacy application key (`spaps_sec_*` or migrated `spaps_*`). Never expose this key in browser code.",
|
|
33
|
+
},
|
|
34
|
+
"BearerJWT": {
|
|
35
|
+
"type": "http",
|
|
36
|
+
"scheme": "bearer",
|
|
37
|
+
"bearerFormat": "JWT",
|
|
38
|
+
"description": "SPAPS user access token carried as `Authorization: Bearer <jwt>`.",
|
|
39
|
+
},
|
|
40
|
+
"StripeWebhookSignature": {
|
|
41
|
+
"type": "apiKey",
|
|
42
|
+
"in": "header",
|
|
43
|
+
"name": "stripe-signature",
|
|
44
|
+
"description": "Stripe webhook signature header verified against the configured Stripe webhook secret.",
|
|
45
|
+
},
|
|
46
|
+
"MailgunWebhookSignature": {
|
|
47
|
+
"type": "http",
|
|
48
|
+
"scheme": "mailgun-signature",
|
|
49
|
+
"description": "Mailgun webhook signature payload verified against the configured Mailgun signing key.",
|
|
50
|
+
},
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
PROVIDER_SIGNATURE_ROUTES: dict[tuple[str, str], tuple[str, str]] = {
|
|
54
|
+
("POST", "/api/stripe/webhooks"): (
|
|
55
|
+
"StripeWebhookSignature",
|
|
56
|
+
"stripe_webhook_signature",
|
|
57
|
+
),
|
|
58
|
+
("POST", "/api/stripe/webhooks/{billing_account_id}"): (
|
|
59
|
+
"StripeWebhookSignature",
|
|
60
|
+
"stripe_webhook_signature",
|
|
61
|
+
),
|
|
62
|
+
("POST", "/api/webhooks/mailgun/events"): (
|
|
63
|
+
"MailgunWebhookSignature",
|
|
64
|
+
"mailgun_webhook_signature",
|
|
65
|
+
),
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def dependency_call_names(route: APIRoute) -> set[str]:
|
|
70
|
+
"""Return all dependency call names for a route, including nested dependencies."""
|
|
71
|
+
|
|
72
|
+
names: set[str] = set()
|
|
73
|
+
|
|
74
|
+
def walk(dependant: Any) -> None:
|
|
75
|
+
for dependency in getattr(dependant, "dependencies", []):
|
|
76
|
+
call = getattr(dependency, "call", None)
|
|
77
|
+
name = getattr(call, "__name__", None)
|
|
78
|
+
if name:
|
|
79
|
+
names.add(name)
|
|
80
|
+
walk(dependency)
|
|
81
|
+
|
|
82
|
+
walk(route.dependant)
|
|
83
|
+
return names
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def _route_path(route: APIRoute) -> str:
|
|
87
|
+
return getattr(route, "path_format", route.path)
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def _route_accepts_publishable_key(route: APIRoute, method: str) -> bool:
|
|
91
|
+
return is_endpoint_allowed_for_publishable(
|
|
92
|
+
_route_path(route),
|
|
93
|
+
None,
|
|
94
|
+
method=method,
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def _application_key_schemes(route: APIRoute, method: str) -> tuple[list[str], str]:
|
|
99
|
+
if _route_accepts_publishable_key(route, method):
|
|
100
|
+
return ["SpapsPublishableKey", "SpapsSecretKey"], "publishable_or_secret"
|
|
101
|
+
return ["SpapsSecretKey"], "secret"
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def route_auth_metadata(route: APIRoute, method: str) -> dict[str, Any]:
|
|
105
|
+
"""Classify a FastAPI route into machine-readable SPAPS auth metadata."""
|
|
106
|
+
|
|
107
|
+
method = method.upper()
|
|
108
|
+
path = _route_path(route)
|
|
109
|
+
provider_signature = PROVIDER_SIGNATURE_ROUTES.get((method, path))
|
|
110
|
+
if provider_signature is not None:
|
|
111
|
+
scheme, auth_type = provider_signature
|
|
112
|
+
return {
|
|
113
|
+
"auth_type": auth_type,
|
|
114
|
+
"required": True,
|
|
115
|
+
"schemes": [scheme],
|
|
116
|
+
"provider_signature": {"required": True, "scheme": scheme},
|
|
117
|
+
"api_key": {"required": False, "accepted": []},
|
|
118
|
+
"jwt": {"required": False, "optional": False},
|
|
119
|
+
"roles": [],
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
dependencies = dependency_call_names(route)
|
|
123
|
+
if "get_application" not in dependencies:
|
|
124
|
+
return {
|
|
125
|
+
"auth_type": "public",
|
|
126
|
+
"required": False,
|
|
127
|
+
"schemes": [],
|
|
128
|
+
"api_key": {"required": False, "accepted": []},
|
|
129
|
+
"jwt": {"required": False, "optional": False},
|
|
130
|
+
"roles": [],
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
key_schemes, key_type = _application_key_schemes(route, method)
|
|
134
|
+
roles: list[str] = []
|
|
135
|
+
jwt_required = False
|
|
136
|
+
jwt_optional = False
|
|
137
|
+
auth_type = "application"
|
|
138
|
+
|
|
139
|
+
if "require_super_admin_user" in dependencies:
|
|
140
|
+
roles = ["super_admin"]
|
|
141
|
+
jwt_required = True
|
|
142
|
+
auth_type = "super_admin"
|
|
143
|
+
elif "require_admin_user" in dependencies:
|
|
144
|
+
roles = ["admin"]
|
|
145
|
+
jwt_required = True
|
|
146
|
+
auth_type = "admin"
|
|
147
|
+
elif "get_current_user" in dependencies:
|
|
148
|
+
roles = ["user"]
|
|
149
|
+
jwt_required = True
|
|
150
|
+
auth_type = "user"
|
|
151
|
+
elif "get_optional_user" in dependencies:
|
|
152
|
+
jwt_optional = True
|
|
153
|
+
auth_type = "application_optional_user"
|
|
154
|
+
|
|
155
|
+
schemes = [*key_schemes]
|
|
156
|
+
if jwt_required:
|
|
157
|
+
schemes.append("BearerJWT")
|
|
158
|
+
return {
|
|
159
|
+
"auth_type": auth_type,
|
|
160
|
+
"required": True,
|
|
161
|
+
"schemes": schemes,
|
|
162
|
+
"api_key": {
|
|
163
|
+
"required": True,
|
|
164
|
+
"accepted": ["publishable", "secret"] if key_type == "publishable_or_secret" else ["secret"],
|
|
165
|
+
},
|
|
166
|
+
"jwt": {"required": jwt_required, "optional": jwt_optional},
|
|
167
|
+
"roles": roles,
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
def operation_security(metadata: dict[str, Any]) -> list[dict[str, list[Any]]]:
|
|
172
|
+
"""Translate SPAPS auth metadata into OpenAPI security requirements."""
|
|
173
|
+
|
|
174
|
+
if not metadata["required"]:
|
|
175
|
+
return []
|
|
176
|
+
|
|
177
|
+
provider_signature = metadata.get("provider_signature")
|
|
178
|
+
if provider_signature:
|
|
179
|
+
return [{str(provider_signature["scheme"]): []}]
|
|
180
|
+
|
|
181
|
+
api_key = metadata.get("api_key", {})
|
|
182
|
+
key_types = list(api_key.get("accepted", []))
|
|
183
|
+
key_schemes = (
|
|
184
|
+
["SpapsPublishableKey", "SpapsSecretKey"]
|
|
185
|
+
if "publishable" in key_types
|
|
186
|
+
else ["SpapsSecretKey"]
|
|
187
|
+
)
|
|
188
|
+
|
|
189
|
+
requirements: list[dict[str, list[Any]]] = []
|
|
190
|
+
for scheme in key_schemes:
|
|
191
|
+
requirement: dict[str, list[Any]] = {scheme: []}
|
|
192
|
+
if metadata.get("jwt", {}).get("required"):
|
|
193
|
+
requirement["BearerJWT"] = []
|
|
194
|
+
requirements.append(requirement)
|
|
195
|
+
return requirements
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
def _route_methods(route: APIRoute) -> Iterable[str]:
|
|
199
|
+
for method in sorted(route.methods or []):
|
|
200
|
+
if method.upper() not in {"HEAD", "OPTIONS"}:
|
|
201
|
+
yield method.upper()
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
def apply_openapi_auth_metadata(
|
|
205
|
+
schema: dict[str, Any],
|
|
206
|
+
routes: Iterable[Any],
|
|
207
|
+
) -> dict[str, Any]:
|
|
208
|
+
"""Attach SPAPS security schemes and operation auth metadata to a schema."""
|
|
209
|
+
|
|
210
|
+
components = schema.setdefault("components", {})
|
|
211
|
+
security_schemes = components.setdefault("securitySchemes", {})
|
|
212
|
+
for name, scheme in SPAPS_SECURITY_SCHEMES.items():
|
|
213
|
+
security_schemes[name] = deepcopy(scheme)
|
|
214
|
+
|
|
215
|
+
paths = schema.setdefault("paths", {})
|
|
216
|
+
for route in routes:
|
|
217
|
+
if not isinstance(route, APIRoute) or not route.include_in_schema:
|
|
218
|
+
continue
|
|
219
|
+
path = _route_path(route)
|
|
220
|
+
operations = paths.get(path, {})
|
|
221
|
+
for method in _route_methods(route):
|
|
222
|
+
operation = operations.get(method.lower())
|
|
223
|
+
if operation is None:
|
|
224
|
+
continue
|
|
225
|
+
metadata = route_auth_metadata(route, method)
|
|
226
|
+
operation["security"] = operation_security(metadata)
|
|
227
|
+
operation[OPENAPI_AUTH_EXTENSION] = metadata
|
|
228
|
+
|
|
229
|
+
return schema
|
|
@@ -16,6 +16,7 @@ from collections.abc import AsyncGenerator
|
|
|
16
16
|
from contextlib import asynccontextmanager
|
|
17
17
|
|
|
18
18
|
from fastapi import FastAPI
|
|
19
|
+
from fastapi.openapi.utils import get_openapi
|
|
19
20
|
from fastapi.responses import ORJSONResponse
|
|
20
21
|
from sqlalchemy import text
|
|
21
22
|
|
|
@@ -111,12 +112,36 @@ from .middleware.envelope import ResponseEnvelopeMiddleware
|
|
|
111
112
|
from .middleware.error_handler import install_error_handlers
|
|
112
113
|
from .middleware.rate_limiting import RateLimitMiddleware
|
|
113
114
|
from .middleware.security_headers import SecurityHeadersMiddleware
|
|
115
|
+
from .openapi_auth import apply_openapi_auth_metadata
|
|
114
116
|
from .spaps_settings import SpapsSettings, get_spaps_settings
|
|
115
117
|
from .startup import startup_checks
|
|
116
118
|
|
|
117
119
|
logger = logging.getLogger(__name__)
|
|
118
120
|
|
|
119
121
|
|
|
122
|
+
def _install_openapi_auth_metadata(app: FastAPI) -> None:
|
|
123
|
+
"""Generate OpenAPI once, then attach SPAPS auth metadata from route dependencies."""
|
|
124
|
+
|
|
125
|
+
def custom_openapi() -> dict:
|
|
126
|
+
if app.openapi_schema:
|
|
127
|
+
return app.openapi_schema
|
|
128
|
+
|
|
129
|
+
schema = get_openapi(
|
|
130
|
+
title=app.title,
|
|
131
|
+
version=app.version,
|
|
132
|
+
openapi_version=app.openapi_version,
|
|
133
|
+
summary=app.summary,
|
|
134
|
+
description=app.description,
|
|
135
|
+
routes=app.routes,
|
|
136
|
+
tags=app.openapi_tags,
|
|
137
|
+
servers=app.servers,
|
|
138
|
+
)
|
|
139
|
+
app.openapi_schema = apply_openapi_auth_metadata(schema, app.routes)
|
|
140
|
+
return app.openapi_schema
|
|
141
|
+
|
|
142
|
+
app.openapi = custom_openapi # type: ignore[method-assign]
|
|
143
|
+
|
|
144
|
+
|
|
120
145
|
async def _validate_tm013_pii_startup_invariant(
|
|
121
146
|
settings: SpapsSettings,
|
|
122
147
|
db_resources: DatabaseResources,
|
|
@@ -365,6 +390,7 @@ def create_spaps_app(
|
|
|
365
390
|
|
|
366
391
|
# Include routers
|
|
367
392
|
app.include_router(api_router)
|
|
393
|
+
_install_openapi_auth_metadata(app)
|
|
368
394
|
|
|
369
395
|
# Store references on app.state for health checks and dependency injection
|
|
370
396
|
app.state.db_resources = db_resources
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import importlib.util
|
|
4
|
+
import sys
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
from types import ModuleType
|
|
7
|
+
|
|
8
|
+
import pytest
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def _load_script() -> ModuleType:
|
|
12
|
+
repo_root = Path(__file__).resolve().parents[4]
|
|
13
|
+
script_path = repo_root / "scripts" / "validate_manifest_fastapi.py"
|
|
14
|
+
spec = importlib.util.spec_from_file_location("validate_manifest_fastapi", script_path)
|
|
15
|
+
assert spec is not None
|
|
16
|
+
assert spec.loader is not None
|
|
17
|
+
module = importlib.util.module_from_spec(spec)
|
|
18
|
+
sys.modules[spec.name] = module
|
|
19
|
+
spec.loader.exec_module(module)
|
|
20
|
+
return module
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
SCRIPT = _load_script()
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def test_non_manifest_app_routes_fail_closed_except_framework_allowlist() -> None:
|
|
27
|
+
realtime_source = SCRIPT.REPO_ROOT / "packages/python-server-quickstart/src/spaps_server_quickstart/domains/realtime/router.py"
|
|
28
|
+
app_routes = {
|
|
29
|
+
("GET", "/docs"): SCRIPT.AppRoute(method="GET", path="/docs"),
|
|
30
|
+
("POST", "/api/realtime/ws-ticket"): SCRIPT.AppRoute(
|
|
31
|
+
method="POST",
|
|
32
|
+
path="/api/realtime/ws-ticket",
|
|
33
|
+
file=realtime_source,
|
|
34
|
+
line=18,
|
|
35
|
+
),
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
missing = SCRIPT._non_manifest_app_routes(app_routes, manifest_pairs=set())
|
|
39
|
+
|
|
40
|
+
assert [route.method + " " + route.path for route in missing] == ["POST /api/realtime/ws-ticket"]
|
|
41
|
+
assert missing[0].source_label() == (
|
|
42
|
+
"packages/python-server-quickstart/src/spaps_server_quickstart/domains/realtime/router.py:18"
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def test_manifest_path_normalization_matches_fastapi_parameters() -> None:
|
|
47
|
+
assert SCRIPT._normalize_path("/api/items/{itemId}") == "/api/items/{item_id}"
|
|
48
|
+
assert SCRIPT._normalize_path("/api/items/{item_id:int}/") == "/api/items/{item_id}"
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def test_main_fails_on_duplicate_manifest_endpoints(
|
|
52
|
+
monkeypatch: pytest.MonkeyPatch,
|
|
53
|
+
capsys: pytest.CaptureFixture[str],
|
|
54
|
+
) -> None:
|
|
55
|
+
monkeypatch.setattr(
|
|
56
|
+
SCRIPT,
|
|
57
|
+
"_load_manifest_endpoint_entries",
|
|
58
|
+
lambda: (2, [("GET", "/api/items"), ("GET", "/api/items")]),
|
|
59
|
+
)
|
|
60
|
+
monkeypatch.setattr(
|
|
61
|
+
SCRIPT,
|
|
62
|
+
"_extract_app_routes",
|
|
63
|
+
lambda: {("GET", "/api/items"): SCRIPT.AppRoute(method="GET", path="/api/items")},
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
assert SCRIPT.main() == 1
|
|
67
|
+
assert "Duplicate endpoints in manifest" in capsys.readouterr().out
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def test_main_fails_on_framework_routes_declared_in_manifest(
|
|
71
|
+
monkeypatch: pytest.MonkeyPatch,
|
|
72
|
+
capsys: pytest.CaptureFixture[str],
|
|
73
|
+
) -> None:
|
|
74
|
+
monkeypatch.setattr(SCRIPT, "_load_manifest_endpoint_entries", lambda: (1, [("GET", "/docs")]))
|
|
75
|
+
monkeypatch.setattr(
|
|
76
|
+
SCRIPT,
|
|
77
|
+
"_extract_app_routes",
|
|
78
|
+
lambda: {("GET", "/docs"): SCRIPT.AppRoute(method="GET", path="/docs")},
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
assert SCRIPT.main() == 1
|
|
82
|
+
assert "Framework-only routes should not be listed in manifest" in capsys.readouterr().out
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
"""Contract tests for SPAPS OpenAPI authentication metadata."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import importlib.util
|
|
6
|
+
import os
|
|
7
|
+
import sys
|
|
8
|
+
from copy import deepcopy
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
from types import ModuleType
|
|
11
|
+
from typing import Any
|
|
12
|
+
from unittest.mock import MagicMock, patch
|
|
13
|
+
|
|
14
|
+
import pytest
|
|
15
|
+
|
|
16
|
+
from spaps_server_quickstart.openapi_auth import (
|
|
17
|
+
SPAPS_SECURITY_SCHEMES,
|
|
18
|
+
apply_openapi_auth_metadata,
|
|
19
|
+
)
|
|
20
|
+
from spaps_server_quickstart.spaps_app import create_spaps_app
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def _load_validator_script() -> ModuleType:
|
|
24
|
+
repo_root = Path(__file__).resolve().parents[4]
|
|
25
|
+
script_path = repo_root / "scripts" / "validate_openapi_auth_metadata.py"
|
|
26
|
+
spec = importlib.util.spec_from_file_location(
|
|
27
|
+
"validate_openapi_auth_metadata",
|
|
28
|
+
script_path,
|
|
29
|
+
)
|
|
30
|
+
assert spec is not None
|
|
31
|
+
assert spec.loader is not None
|
|
32
|
+
module = importlib.util.module_from_spec(spec)
|
|
33
|
+
sys.modules[spec.name] = module
|
|
34
|
+
spec.loader.exec_module(module)
|
|
35
|
+
return module
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
VALIDATOR_SCRIPT = _load_validator_script()
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
@pytest.fixture(scope="module")
|
|
42
|
+
def _openapi_schema() -> dict[str, Any]:
|
|
43
|
+
os.environ["SPAPS_ENV"] = "test"
|
|
44
|
+
with patch("spaps_server_quickstart.spaps_app.DatabaseResources") as mock_db:
|
|
45
|
+
mock_db.return_value = MagicMock()
|
|
46
|
+
return create_spaps_app().openapi()
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def _operation(schema: dict[str, Any], method: str, path: str) -> dict[str, Any]:
|
|
50
|
+
return schema["paths"][path][method.lower()]
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def _validator_issues(schema: dict[str, Any]) -> list[str]:
|
|
54
|
+
return VALIDATOR_SCRIPT.validate_schema(schema, VALIDATOR_SCRIPT._build_app_routes())
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def test_openapi_declares_spaps_security_schemes(_openapi_schema: dict[str, Any]) -> None:
|
|
58
|
+
schema = _openapi_schema
|
|
59
|
+
security_schemes = schema["components"]["securitySchemes"]
|
|
60
|
+
assert "SpapsApiKey" in security_schemes
|
|
61
|
+
assert security_schemes["SpapsApiKey"]["name"] == "X-API-Key"
|
|
62
|
+
assert "SpapsPublishableKey" in security_schemes
|
|
63
|
+
assert "SpapsSecretKey" in security_schemes
|
|
64
|
+
assert "BearerJWT" in security_schemes
|
|
65
|
+
assert "StripeWebhookSignature" in security_schemes
|
|
66
|
+
assert "MailgunWebhookSignature" in security_schemes
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def test_apply_openapi_auth_metadata_overwrites_stale_security_schemes() -> None:
|
|
70
|
+
schema: dict[str, Any] = {
|
|
71
|
+
"components": {
|
|
72
|
+
"securitySchemes": {
|
|
73
|
+
"SpapsSecretKey": {"type": "apiKey", "in": "header", "name": "X-WRONG"}
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
"paths": {},
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
apply_openapi_auth_metadata(schema, routes=[])
|
|
80
|
+
|
|
81
|
+
secret_key_scheme = schema["components"]["securitySchemes"]["SpapsSecretKey"]
|
|
82
|
+
assert secret_key_scheme == SPAPS_SECURITY_SCHEMES["SpapsSecretKey"]
|
|
83
|
+
assert secret_key_scheme is not SPAPS_SECURITY_SCHEMES["SpapsSecretKey"]
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def test_app_openapi_cache_preserves_auth_metadata() -> None:
|
|
87
|
+
os.environ["SPAPS_ENV"] = "test"
|
|
88
|
+
with patch("spaps_server_quickstart.spaps_app.DatabaseResources") as mock_db:
|
|
89
|
+
mock_db.return_value = MagicMock()
|
|
90
|
+
app = create_spaps_app()
|
|
91
|
+
|
|
92
|
+
first_schema = app.openapi()
|
|
93
|
+
second_schema = app.openapi()
|
|
94
|
+
|
|
95
|
+
assert second_schema is first_schema
|
|
96
|
+
assert _operation(second_schema, "GET", "/health")["x-spaps-auth"]["auth_type"] == "public"
|
|
97
|
+
assert _operation(second_schema, "POST", "/api/auth/login")["security"] == [
|
|
98
|
+
{"SpapsPublishableKey": []},
|
|
99
|
+
{"SpapsSecretKey": []},
|
|
100
|
+
]
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
def test_validator_rejects_security_scheme_drift(_openapi_schema: dict[str, Any]) -> None:
|
|
104
|
+
schema = deepcopy(_openapi_schema)
|
|
105
|
+
schema["components"]["securitySchemes"]["SpapsSecretKey"]["name"] = "X-WRONG"
|
|
106
|
+
|
|
107
|
+
issues = _validator_issues(schema)
|
|
108
|
+
|
|
109
|
+
assert any("SpapsSecretKey security scheme=" in issue for issue in issues)
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def test_validator_rejects_nested_auth_metadata_drift(_openapi_schema: dict[str, Any]) -> None:
|
|
113
|
+
schema = deepcopy(_openapi_schema)
|
|
114
|
+
operation = _operation(schema, "GET", "/api/auth/user")
|
|
115
|
+
operation["x-spaps-auth"]["roles"] = []
|
|
116
|
+
|
|
117
|
+
issues = _validator_issues(schema)
|
|
118
|
+
|
|
119
|
+
assert any(
|
|
120
|
+
"GET /api/auth/user x-spaps-auth=" in issue and "'roles': ['user']" in issue
|
|
121
|
+
for issue in issues
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
def test_public_routes_are_explicitly_marked_public(_openapi_schema: dict[str, Any]) -> None:
|
|
126
|
+
schema = _openapi_schema
|
|
127
|
+
operation = _operation(schema, "GET", "/health")
|
|
128
|
+
|
|
129
|
+
assert operation["security"] == []
|
|
130
|
+
assert operation["x-spaps-auth"]["auth_type"] == "public"
|
|
131
|
+
assert operation["x-spaps-auth"]["required"] is False
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def test_publishable_application_route_exposes_key_options(_openapi_schema: dict[str, Any]) -> None:
|
|
135
|
+
schema = _openapi_schema
|
|
136
|
+
operation = _operation(schema, "POST", "/api/auth/login")
|
|
137
|
+
|
|
138
|
+
assert operation["security"] == [
|
|
139
|
+
{"SpapsPublishableKey": []},
|
|
140
|
+
{"SpapsSecretKey": []},
|
|
141
|
+
]
|
|
142
|
+
assert operation["x-spaps-auth"]["auth_type"] == "application"
|
|
143
|
+
assert operation["x-spaps-auth"]["api_key"]["accepted"] == ["publishable", "secret"]
|
|
144
|
+
assert operation["x-spaps-auth"]["jwt"] == {"required": False, "optional": False}
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
def test_user_route_requires_key_and_bearer_jwt(_openapi_schema: dict[str, Any]) -> None:
|
|
148
|
+
schema = _openapi_schema
|
|
149
|
+
operation = _operation(schema, "GET", "/api/auth/user")
|
|
150
|
+
|
|
151
|
+
assert operation["security"] == [
|
|
152
|
+
{"SpapsPublishableKey": [], "BearerJWT": []},
|
|
153
|
+
{"SpapsSecretKey": [], "BearerJWT": []},
|
|
154
|
+
]
|
|
155
|
+
assert operation["x-spaps-auth"]["auth_type"] == "user"
|
|
156
|
+
assert operation["x-spaps-auth"]["roles"] == ["user"]
|
|
157
|
+
assert operation["x-spaps-auth"]["jwt"]["required"] is True
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
def test_admin_and_super_admin_routes_expose_role_metadata(
|
|
161
|
+
_openapi_schema: dict[str, Any],
|
|
162
|
+
) -> None:
|
|
163
|
+
schema = _openapi_schema
|
|
164
|
+
admin_operation = _operation(schema, "GET", "/api/admin/billing/verify")
|
|
165
|
+
super_admin_operation = _operation(schema, "POST", "/api/admin/billing/attach")
|
|
166
|
+
|
|
167
|
+
assert admin_operation["security"] == [{"SpapsSecretKey": [], "BearerJWT": []}]
|
|
168
|
+
assert admin_operation["x-spaps-auth"]["auth_type"] == "admin"
|
|
169
|
+
assert admin_operation["x-spaps-auth"]["roles"] == ["admin"]
|
|
170
|
+
|
|
171
|
+
assert super_admin_operation["security"] == [{"SpapsSecretKey": [], "BearerJWT": []}]
|
|
172
|
+
assert super_admin_operation["x-spaps-auth"]["auth_type"] == "super_admin"
|
|
173
|
+
assert super_admin_operation["x-spaps-auth"]["roles"] == ["super_admin"]
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
def test_provider_webhook_routes_expose_signature_metadata(
|
|
177
|
+
_openapi_schema: dict[str, Any],
|
|
178
|
+
) -> None:
|
|
179
|
+
schema = _openapi_schema
|
|
180
|
+
stripe_operation = _operation(schema, "POST", "/api/stripe/webhooks")
|
|
181
|
+
mailgun_operation = _operation(schema, "POST", "/api/webhooks/mailgun/events")
|
|
182
|
+
|
|
183
|
+
assert stripe_operation["security"] == [{"StripeWebhookSignature": []}]
|
|
184
|
+
assert stripe_operation["x-spaps-auth"]["auth_type"] == "stripe_webhook_signature"
|
|
185
|
+
assert stripe_operation["x-spaps-auth"]["provider_signature"]["required"] is True
|
|
186
|
+
|
|
187
|
+
assert mailgun_operation["security"] == [{"MailgunWebhookSignature": []}]
|
|
188
|
+
assert mailgun_operation["x-spaps-auth"]["auth_type"] == "mailgun_webhook_signature"
|
|
189
|
+
assert mailgun_operation["x-spaps-auth"]["provider_signature"]["required"] is True
|