svc-infra 0.1.513__tar.gz → 0.1.672__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.
Potentially problematic release.
This version of svc-infra might be problematic. Click here for more details.
- svc_infra-0.1.672/PKG-INFO +160 -0
- svc_infra-0.1.672/README.md +80 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/pyproject.toml +31 -2
- svc_infra-0.1.672/src/svc_infra/apf_payments/README.md +732 -0
- svc_infra-0.1.672/src/svc_infra/apf_payments/alembic.py +11 -0
- svc_infra-0.1.672/src/svc_infra/apf_payments/models.py +339 -0
- svc_infra-0.1.672/src/svc_infra/apf_payments/provider/__init__.py +4 -0
- svc_infra-0.1.672/src/svc_infra/apf_payments/provider/aiydan.py +797 -0
- svc_infra-0.1.672/src/svc_infra/apf_payments/provider/base.py +270 -0
- svc_infra-0.1.672/src/svc_infra/apf_payments/provider/registry.py +31 -0
- svc_infra-0.1.672/src/svc_infra/apf_payments/provider/stripe.py +873 -0
- svc_infra-0.1.672/src/svc_infra/apf_payments/schemas.py +333 -0
- svc_infra-0.1.672/src/svc_infra/apf_payments/service.py +892 -0
- svc_infra-0.1.672/src/svc_infra/apf_payments/settings.py +67 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/__init__.py +6 -0
- svc_infra-0.1.672/src/svc_infra/api/fastapi/admin/__init__.py +3 -0
- svc_infra-0.1.672/src/svc_infra/api/fastapi/admin/add.py +231 -0
- svc_infra-0.1.672/src/svc_infra/api/fastapi/apf_payments/router.py +1082 -0
- svc_infra-0.1.672/src/svc_infra/api/fastapi/apf_payments/setup.py +73 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/auth/add.py +15 -6
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/auth/gaurd.py +67 -5
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/auth/routers/oauth_router.py +92 -37
- svc_infra-0.1.672/src/svc_infra/api/fastapi/auth/routers/session_router.py +63 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/auth/settings.py +2 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/auth/state.py +1 -1
- svc_infra-0.1.672/src/svc_infra/api/fastapi/billing/router.py +64 -0
- svc_infra-0.1.672/src/svc_infra/api/fastapi/billing/setup.py +19 -0
- svc_infra-0.1.672/src/svc_infra/api/fastapi/cache/add.py +18 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/db/nosql/mongo/add.py +33 -27
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/db/sql/add.py +40 -18
- svc_infra-0.1.672/src/svc_infra/api/fastapi/db/sql/crud_router.py +310 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/db/sql/session.py +16 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/db/sql/users.py +13 -1
- svc_infra-0.1.672/src/svc_infra/api/fastapi/dependencies/ratelimit.py +116 -0
- svc_infra-0.1.672/src/svc_infra/api/fastapi/docs/add.py +160 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/docs/landing.py +1 -1
- svc_infra-0.1.672/src/svc_infra/api/fastapi/docs/scoped.py +254 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/dual/router.py +48 -1
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/dx.py +3 -3
- svc_infra-0.1.672/src/svc_infra/api/fastapi/http/concurrency.py +14 -0
- svc_infra-0.1.672/src/svc_infra/api/fastapi/http/conditional.py +33 -0
- svc_infra-0.1.672/src/svc_infra/api/fastapi/http/deprecation.py +21 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/middleware/errors/handlers.py +45 -7
- svc_infra-0.1.672/src/svc_infra/api/fastapi/middleware/graceful_shutdown.py +87 -0
- svc_infra-0.1.672/src/svc_infra/api/fastapi/middleware/idempotency.py +123 -0
- svc_infra-0.1.672/src/svc_infra/api/fastapi/middleware/idempotency_store.py +187 -0
- svc_infra-0.1.672/src/svc_infra/api/fastapi/middleware/optimistic_lock.py +37 -0
- svc_infra-0.1.672/src/svc_infra/api/fastapi/middleware/ratelimit.py +126 -0
- svc_infra-0.1.672/src/svc_infra/api/fastapi/middleware/ratelimit_store.py +84 -0
- svc_infra-0.1.672/src/svc_infra/api/fastapi/middleware/request_id.py +37 -0
- svc_infra-0.1.672/src/svc_infra/api/fastapi/middleware/request_size_limit.py +36 -0
- svc_infra-0.1.672/src/svc_infra/api/fastapi/middleware/timeout.py +180 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/openapi/mutators.py +687 -15
- svc_infra-0.1.672/src/svc_infra/api/fastapi/ops/add.py +73 -0
- svc_infra-0.1.672/src/svc_infra/api/fastapi/pagination.py +363 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/paths/prefix.py +0 -1
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/routers/ping.py +1 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/setup.py +60 -15
- svc_infra-0.1.672/src/svc_infra/api/fastapi/tenancy/add.py +19 -0
- svc_infra-0.1.672/src/svc_infra/api/fastapi/tenancy/context.py +112 -0
- svc_infra-0.1.672/src/svc_infra/api/fastapi/versioned.py +101 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/app/README.md +5 -5
- svc_infra-0.1.672/src/svc_infra/billing/__init__.py +23 -0
- svc_infra-0.1.672/src/svc_infra/billing/async_service.py +147 -0
- svc_infra-0.1.672/src/svc_infra/billing/jobs.py +230 -0
- svc_infra-0.1.672/src/svc_infra/billing/models.py +131 -0
- svc_infra-0.1.672/src/svc_infra/billing/quotas.py +101 -0
- svc_infra-0.1.672/src/svc_infra/billing/schemas.py +33 -0
- svc_infra-0.1.672/src/svc_infra/billing/service.py +115 -0
- svc_infra-0.1.672/src/svc_infra/bundled_docs/README.md +5 -0
- svc_infra-0.1.672/src/svc_infra/bundled_docs/__init__.py +1 -0
- svc_infra-0.1.672/src/svc_infra/bundled_docs/getting-started.md +6 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/cache/__init__.py +4 -0
- svc_infra-0.1.672/src/svc_infra/cache/add.py +158 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/cache/backend.py +5 -2
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/cache/decorators.py +19 -1
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/cache/keys.py +24 -4
- svc_infra-0.1.672/src/svc_infra/cli/__init__.py +59 -0
- svc_infra-0.1.672/src/svc_infra/cli/__main__.py +4 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/cli/cmds/__init__.py +10 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/cli/cmds/db/nosql/mongo/mongo_cmds.py +4 -3
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/cli/cmds/db/nosql/mongo/mongo_scaffold_cmds.py +4 -4
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/cli/cmds/db/sql/alembic_cmds.py +120 -14
- svc_infra-0.1.672/src/svc_infra/cli/cmds/db/sql/sql_export_cmds.py +80 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/cli/cmds/db/sql/sql_scaffold_cmds.py +5 -4
- svc_infra-0.1.672/src/svc_infra/cli/cmds/docs/docs_cmds.py +140 -0
- svc_infra-0.1.672/src/svc_infra/cli/cmds/dx/__init__.py +12 -0
- svc_infra-0.1.672/src/svc_infra/cli/cmds/dx/dx_cmds.py +99 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/cli/cmds/help.py +4 -0
- svc_infra-0.1.672/src/svc_infra/cli/cmds/jobs/__init__.py +1 -0
- svc_infra-0.1.672/src/svc_infra/cli/cmds/jobs/jobs_cmds.py +43 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/cli/cmds/obs/obs_cmds.py +4 -3
- svc_infra-0.1.672/src/svc_infra/cli/cmds/sdk/sdk_cmds.py +102 -0
- svc_infra-0.1.672/src/svc_infra/data/add.py +61 -0
- svc_infra-0.1.672/src/svc_infra/data/backup.py +53 -0
- svc_infra-0.1.672/src/svc_infra/data/erasure.py +45 -0
- svc_infra-0.1.672/src/svc_infra/data/fixtures.py +40 -0
- svc_infra-0.1.672/src/svc_infra/data/retention.py +55 -0
- svc_infra-0.1.672/src/svc_infra/db/inbox.py +67 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/db/nosql/mongo/README.md +13 -13
- svc_infra-0.1.672/src/svc_infra/db/outbox.py +104 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/db/sql/apikey.py +1 -1
- svc_infra-0.1.672/src/svc_infra/db/sql/authref.py +61 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/db/sql/core.py +2 -2
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/db/sql/repository.py +52 -12
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/db/sql/resource.py +5 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/db/sql/scaffold.py +16 -4
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/db/sql/templates/models_schemas/auth/models.py.tmpl +7 -56
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/db/sql/templates/models_schemas/auth/schemas.py.tmpl +1 -1
- svc_infra-0.1.672/src/svc_infra/db/sql/templates/setup/env_async.py.tmpl +386 -0
- svc_infra-0.1.672/src/svc_infra/db/sql/templates/setup/env_sync.py.tmpl +431 -0
- svc_infra-0.1.672/src/svc_infra/db/sql/tenant.py +79 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/db/sql/utils.py +18 -4
- svc_infra-0.1.672/src/svc_infra/db/sql/versioning.py +14 -0
- svc_infra-0.1.672/src/svc_infra/docs/acceptance-matrix.md +88 -0
- svc_infra-0.1.672/src/svc_infra/docs/acceptance.md +44 -0
- svc_infra-0.1.672/src/svc_infra/docs/admin.md +425 -0
- svc_infra-0.1.672/src/svc_infra/docs/adr/0002-background-jobs-and-scheduling.md +40 -0
- svc_infra-0.1.672/src/svc_infra/docs/adr/0003-webhooks-framework.md +24 -0
- svc_infra-0.1.672/src/svc_infra/docs/adr/0004-tenancy-model.md +42 -0
- svc_infra-0.1.672/src/svc_infra/docs/adr/0005-data-lifecycle.md +86 -0
- svc_infra-0.1.672/src/svc_infra/docs/adr/0006-ops-slos-and-metrics.md +47 -0
- svc_infra-0.1.672/src/svc_infra/docs/adr/0007-docs-and-sdks.md +83 -0
- svc_infra-0.1.672/src/svc_infra/docs/adr/0008-billing-primitives.md +143 -0
- svc_infra-0.1.672/src/svc_infra/docs/adr/0009-acceptance-harness.md +40 -0
- svc_infra-0.1.672/src/svc_infra/docs/adr/0010-timeouts-and-resource-limits.md +54 -0
- svc_infra-0.1.672/src/svc_infra/docs/adr/0011-admin-scope-and-impersonation.md +73 -0
- svc_infra-0.1.672/src/svc_infra/docs/adr/0012-generic-file-storage.md +498 -0
- svc_infra-0.1.672/src/svc_infra/docs/api.md +215 -0
- svc_infra-0.1.672/src/svc_infra/docs/auth.md +11 -0
- svc_infra-0.1.672/src/svc_infra/docs/billing.md +190 -0
- svc_infra-0.1.672/src/svc_infra/docs/cache.md +76 -0
- svc_infra-0.1.672/src/svc_infra/docs/cli.md +74 -0
- svc_infra-0.1.672/src/svc_infra/docs/contributing.md +34 -0
- svc_infra-0.1.672/src/svc_infra/docs/data-lifecycle.md +52 -0
- svc_infra-0.1.672/src/svc_infra/docs/database.md +14 -0
- svc_infra-0.1.672/src/svc_infra/docs/docs-and-sdks.md +62 -0
- svc_infra-0.1.672/src/svc_infra/docs/documents.md +697 -0
- svc_infra-0.1.672/src/svc_infra/docs/environment.md +114 -0
- svc_infra-0.1.672/src/svc_infra/docs/getting-started.md +63 -0
- svc_infra-0.1.672/src/svc_infra/docs/idempotency.md +111 -0
- svc_infra-0.1.672/src/svc_infra/docs/jobs.md +67 -0
- svc_infra-0.1.672/src/svc_infra/docs/observability.md +16 -0
- svc_infra-0.1.672/src/svc_infra/docs/ops.md +37 -0
- svc_infra-0.1.672/src/svc_infra/docs/rate-limiting.md +125 -0
- svc_infra-0.1.672/src/svc_infra/docs/repo-review.md +48 -0
- svc_infra-0.1.672/src/svc_infra/docs/security.md +176 -0
- svc_infra-0.1.672/src/svc_infra/docs/storage.md +982 -0
- svc_infra-0.1.672/src/svc_infra/docs/tenancy.md +35 -0
- svc_infra-0.1.672/src/svc_infra/docs/timeouts-and-resource-limits.md +147 -0
- svc_infra-0.1.672/src/svc_infra/docs/versioned-integrations.md +146 -0
- svc_infra-0.1.672/src/svc_infra/docs/webhooks.md +112 -0
- svc_infra-0.1.672/src/svc_infra/documents/__init__.py +100 -0
- svc_infra-0.1.672/src/svc_infra/documents/add.py +258 -0
- svc_infra-0.1.672/src/svc_infra/documents/ease.py +233 -0
- svc_infra-0.1.672/src/svc_infra/documents/models.py +114 -0
- svc_infra-0.1.672/src/svc_infra/documents/storage.py +262 -0
- svc_infra-0.1.672/src/svc_infra/dx/add.py +63 -0
- svc_infra-0.1.672/src/svc_infra/dx/changelog.py +74 -0
- svc_infra-0.1.672/src/svc_infra/dx/checks.py +67 -0
- svc_infra-0.1.672/src/svc_infra/http/__init__.py +13 -0
- svc_infra-0.1.672/src/svc_infra/http/client.py +72 -0
- svc_infra-0.1.672/src/svc_infra/jobs/builtins/outbox_processor.py +38 -0
- svc_infra-0.1.672/src/svc_infra/jobs/builtins/webhook_delivery.py +90 -0
- svc_infra-0.1.672/src/svc_infra/jobs/easy.py +32 -0
- svc_infra-0.1.672/src/svc_infra/jobs/loader.py +45 -0
- svc_infra-0.1.672/src/svc_infra/jobs/queue.py +81 -0
- svc_infra-0.1.672/src/svc_infra/jobs/redis_queue.py +191 -0
- svc_infra-0.1.672/src/svc_infra/jobs/runner.py +75 -0
- svc_infra-0.1.672/src/svc_infra/jobs/scheduler.py +41 -0
- svc_infra-0.1.672/src/svc_infra/jobs/worker.py +40 -0
- svc_infra-0.1.672/src/svc_infra/mcp/svc_infra_mcp.py +124 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/obs/README.md +2 -0
- svc_infra-0.1.672/src/svc_infra/obs/add.py +115 -0
- svc_infra-0.1.672/src/svc_infra/obs/grafana/dashboards/http-overview.json +45 -0
- svc_infra-0.1.672/src/svc_infra/obs/metrics/__init__.py +53 -0
- svc_infra-0.1.672/src/svc_infra/obs/metrics.py +52 -0
- svc_infra-0.1.672/src/svc_infra/obs/templates/sidecars/k8s/__init__.py +0 -0
- svc_infra-0.1.672/src/svc_infra/obs/templates/sidecars/railway/__init__.py +0 -0
- svc_infra-0.1.672/src/svc_infra/py.typed +0 -0
- svc_infra-0.1.672/src/svc_infra/security/add.py +201 -0
- svc_infra-0.1.672/src/svc_infra/security/audit.py +130 -0
- svc_infra-0.1.672/src/svc_infra/security/audit_service.py +73 -0
- svc_infra-0.1.672/src/svc_infra/security/headers.py +52 -0
- svc_infra-0.1.672/src/svc_infra/security/hibp.py +95 -0
- svc_infra-0.1.672/src/svc_infra/security/jwt_rotation.py +53 -0
- svc_infra-0.1.672/src/svc_infra/security/lockout.py +96 -0
- svc_infra-0.1.672/src/svc_infra/security/models.py +265 -0
- svc_infra-0.1.672/src/svc_infra/security/oauth_models.py +59 -0
- svc_infra-0.1.672/src/svc_infra/security/org_invites.py +128 -0
- svc_infra-0.1.672/src/svc_infra/security/passwords.py +77 -0
- svc_infra-0.1.672/src/svc_infra/security/permissions.py +149 -0
- svc_infra-0.1.672/src/svc_infra/security/session.py +98 -0
- svc_infra-0.1.672/src/svc_infra/security/signed_cookies.py +80 -0
- svc_infra-0.1.672/src/svc_infra/storage/__init__.py +93 -0
- svc_infra-0.1.672/src/svc_infra/storage/add.py +250 -0
- svc_infra-0.1.672/src/svc_infra/storage/backends/__init__.py +11 -0
- svc_infra-0.1.672/src/svc_infra/storage/backends/local.py +331 -0
- svc_infra-0.1.672/src/svc_infra/storage/backends/memory.py +214 -0
- svc_infra-0.1.672/src/svc_infra/storage/backends/s3.py +329 -0
- svc_infra-0.1.672/src/svc_infra/storage/base.py +239 -0
- svc_infra-0.1.672/src/svc_infra/storage/easy.py +182 -0
- svc_infra-0.1.672/src/svc_infra/storage/settings.py +193 -0
- svc_infra-0.1.672/src/svc_infra/webhooks/__init__.py +16 -0
- svc_infra-0.1.672/src/svc_infra/webhooks/add.py +322 -0
- svc_infra-0.1.672/src/svc_infra/webhooks/fastapi.py +37 -0
- svc_infra-0.1.672/src/svc_infra/webhooks/router.py +55 -0
- svc_infra-0.1.672/src/svc_infra/webhooks/service.py +67 -0
- svc_infra-0.1.672/src/svc_infra/webhooks/signing.py +30 -0
- svc_infra-0.1.513/PKG-INFO +0 -78
- svc_infra-0.1.513/README.md +0 -3
- svc_infra-0.1.513/src/svc_infra/api/fastapi/cache/add.py +0 -14
- svc_infra-0.1.513/src/svc_infra/api/fastapi/db/sql/crud_router.py +0 -148
- svc_infra-0.1.513/src/svc_infra/cli/__init__.py +0 -35
- svc_infra-0.1.513/src/svc_infra/db/sql/templates/setup/env_async.py.tmpl +0 -246
- svc_infra-0.1.513/src/svc_infra/db/sql/templates/setup/env_sync.py.tmpl +0 -261
- svc_infra-0.1.513/src/svc_infra/mcp/svc_infra_mcp.py +0 -67
- svc_infra-0.1.513/src/svc_infra/obs/add.py +0 -68
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/__init__.py +0 -0
- {svc_infra-0.1.513/src/svc_infra/api → svc_infra-0.1.672/src/svc_infra/apf_payments}/__init__.py +0 -0
- {svc_infra-0.1.513/src/svc_infra/api/fastapi/auth → svc_infra-0.1.672/src/svc_infra/api}/__init__.py +0 -0
- {svc_infra-0.1.513/src/svc_infra/api/fastapi/auth/mfa → svc_infra-0.1.672/src/svc_infra/api/fastapi/apf_payments}/__init__.py +0 -0
- {svc_infra-0.1.513/src/svc_infra/api/fastapi/auth/routers → svc_infra-0.1.672/src/svc_infra/api/fastapi/auth}/__init__.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/auth/_cookies.py +0 -0
- {svc_infra-0.1.513/src/svc_infra/api/fastapi/cache → svc_infra-0.1.672/src/svc_infra/api/fastapi/auth/mfa}/__init__.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/auth/mfa/models.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/auth/mfa/pre_auth.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/auth/mfa/router.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/auth/mfa/security.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/auth/mfa/utils.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/auth/mfa/verify.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/auth/policy.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/auth/providers.py +0 -0
- {svc_infra-0.1.513/src/svc_infra/api/fastapi/db/nosql/mongo → svc_infra-0.1.672/src/svc_infra/api/fastapi/auth/routers}/__init__.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/auth/routers/account.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/auth/routers/apikey_router.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/auth/security.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/auth/sender.py +0 -0
- {svc_infra-0.1.513/src/svc_infra/api/fastapi/docs → svc_infra-0.1.672/src/svc_infra/api/fastapi/cache}/__init__.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/db/__init__.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/db/http.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/db/nosql/__init__.py +0 -0
- {svc_infra-0.1.513/src/svc_infra/api/fastapi/middleware → svc_infra-0.1.672/src/svc_infra/api/fastapi/db/nosql/mongo}/__init__.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/db/nosql/mongo/crud_router.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/db/nosql/mongo/health.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/db/sql/README.md +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/db/sql/__init__.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/db/sql/health.py +0 -0
- {svc_infra-0.1.513/src/svc_infra/api/fastapi/middleware/errors → svc_infra-0.1.672/src/svc_infra/api/fastapi/docs}/__init__.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/dual/__init__.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/dual/dualize.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/dual/protected.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/dual/public.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/dual/utils.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/ease.py +0 -0
- {svc_infra-0.1.513/src/svc_infra/api/fastapi/openapi → svc_infra-0.1.672/src/svc_infra/api/fastapi/http}/__init__.py +0 -0
- {svc_infra-0.1.513/src/svc_infra/api/fastapi/paths → svc_infra-0.1.672/src/svc_infra/api/fastapi/middleware}/__init__.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/middleware/debug.py +0 -0
- {svc_infra-0.1.513/src/svc_infra/cli/cmds/db → svc_infra-0.1.672/src/svc_infra/api/fastapi/middleware/errors}/__init__.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/middleware/errors/catchall.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/middleware/errors/exceptions.py +0 -0
- {svc_infra-0.1.513/src/svc_infra/cli/cmds/db/nosql → svc_infra-0.1.672/src/svc_infra/api/fastapi/openapi}/__init__.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/openapi/apply.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/openapi/conventions.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/openapi/models.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/openapi/pipeline.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/openapi/responses.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/openapi/security.py +0 -0
- {svc_infra-0.1.513/src/svc_infra/cli/cmds/db/nosql/mongo → svc_infra-0.1.672/src/svc_infra/api/fastapi/paths}/__init__.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/paths/auth.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/paths/generic.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/paths/user.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/api/fastapi/routers/__init__.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/app/__init__.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/app/env.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/app/logging/__init__.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/app/logging/add.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/app/logging/filter.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/app/logging/formats.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/app/root.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/cache/README.md +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/cache/demo.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/cache/recache.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/cache/resources.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/cache/tags.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/cache/ttl.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/cache/utils.py +0 -0
- {svc_infra-0.1.513/src/svc_infra/cli/cmds/db/sql → svc_infra-0.1.672/src/svc_infra/cli/cmds/db}/__init__.py +0 -0
- {svc_infra-0.1.513/src/svc_infra/cli/cmds/obs → svc_infra-0.1.672/src/svc_infra/cli/cmds/db/nosql}/__init__.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/cli/cmds/db/nosql/mongo/README.md +0 -0
- {svc_infra-0.1.513/src/svc_infra/cli/foundation → svc_infra-0.1.672/src/svc_infra/cli/cmds/db/nosql/mongo}/__init__.py +0 -0
- {svc_infra-0.1.513/src/svc_infra/db → svc_infra-0.1.672/src/svc_infra/cli/cmds/db/sql}/__init__.py +0 -0
- {svc_infra-0.1.513/src/svc_infra/db/nosql/mongo → svc_infra-0.1.672/src/svc_infra/cli/cmds/obs}/__init__.py +0 -0
- {svc_infra-0.1.513/src/svc_infra/db/nosql/mongo/templates → svc_infra-0.1.672/src/svc_infra/cli/cmds/sdk}/__init__.py +0 -0
- {svc_infra-0.1.513/src/svc_infra/db/sql/templates/models_schemas → svc_infra-0.1.672/src/svc_infra/cli/foundation}/__init__.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/cli/foundation/runner.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/cli/foundation/typer_bootstrap.py +0 -0
- {svc_infra-0.1.513/src/svc_infra/db/sql/templates/setup → svc_infra-0.1.672/src/svc_infra/db}/__init__.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/db/crud_schema.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/db/nosql/__init__.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/db/nosql/base.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/db/nosql/constants.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/db/nosql/core.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/db/nosql/indexes.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/db/nosql/management.py +0 -0
- {svc_infra-0.1.513/src/svc_infra/mcp → svc_infra-0.1.672/src/svc_infra/db/nosql/mongo}/__init__.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/db/nosql/mongo/client.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/db/nosql/mongo/settings.py +0 -0
- {svc_infra-0.1.513/src/svc_infra/obs/metrics → svc_infra-0.1.672/src/svc_infra/db/nosql/mongo/templates}/__init__.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/db/nosql/mongo/templates/documents.py.tmpl +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/db/nosql/mongo/templates/resources.py.tmpl +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/db/nosql/mongo/templates/schemas.py.tmpl +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/db/nosql/repository.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/db/nosql/resource.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/db/nosql/scaffold.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/db/nosql/service.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/db/nosql/service_with_hooks.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/db/nosql/types.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/db/nosql/utils.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/db/sql/README.md +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/db/sql/__init__.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/db/sql/base.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/db/sql/constants.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/db/sql/management.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/db/sql/service.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/db/sql/service_with_hooks.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/db/sql/templates/__init__.py +0 -0
- {svc_infra-0.1.513/src/svc_infra/obs/providers → svc_infra-0.1.672/src/svc_infra/db/sql/templates/models_schemas}/__init__.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/db/sql/templates/models_schemas/entity/models.py.tmpl +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/db/sql/templates/models_schemas/entity/schemas.py.tmpl +0 -0
- {svc_infra-0.1.513/src/svc_infra/obs/providers/compose_cloud → svc_infra-0.1.672/src/svc_infra/db/sql/templates/setup}/__init__.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/db/sql/templates/setup/alembic.ini.tmpl +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/db/sql/templates/setup/script.py.mako.tmpl +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/db/sql/types.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/db/sql/uniq.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/db/sql/uniq_hooks.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/db/utils.py +0 -0
- {svc_infra-0.1.513/src/svc_infra/obs/providers/compose_cloud/templates → svc_infra-0.1.672/src/svc_infra/mcp}/__init__.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/obs/__init__.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/obs/cloud_dash.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/obs/metrics/asgi.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/obs/metrics/base.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/obs/metrics/http.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/obs/metrics/sqlalchemy.py +0 -0
- {svc_infra-0.1.513/src/svc_infra/obs/providers/grafana → svc_infra-0.1.672/src/svc_infra/obs/providers}/__init__.py +0 -0
- {svc_infra-0.1.513/src/svc_infra/obs/providers/grafana/dashboards → svc_infra-0.1.672/src/svc_infra/obs/providers/compose_cloud}/__init__.py +0 -0
- {svc_infra-0.1.513/src/svc_infra/obs/providers/grafana → svc_infra-0.1.672/src/svc_infra/obs/providers/compose_cloud}/templates/__init__.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/obs/providers/compose_cloud/templates/agent.yaml.tmpl +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/obs/providers/compose_cloud/templates/docker-compose.cloud.yml.tmpl +0 -0
- {svc_infra-0.1.513/src/svc_infra/obs/providers/grafana/templates/provisioning → svc_infra-0.1.672/src/svc_infra/obs/providers/grafana}/__init__.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/obs/providers/grafana/dashboards/00_overview.json +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/obs/providers/grafana/dashboards/10_http.json +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/obs/providers/grafana/dashboards/20_db.json +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/obs/providers/grafana/dashboards/30_runtime.json +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/obs/providers/grafana/dashboards/40_clients.json +0 -0
- {svc_infra-0.1.513/src/svc_infra/obs/templates/sidecars → svc_infra-0.1.672/src/svc_infra/obs/providers/grafana/dashboards}/__init__.py +0 -0
- {svc_infra-0.1.513/src/svc_infra/obs/templates/sidecars/compose → svc_infra-0.1.672/src/svc_infra/obs/providers/grafana/templates}/__init__.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/obs/providers/grafana/templates/docker-compose.yml.tmpl +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/obs/providers/grafana/templates/prometheus.yml.tmpl +0 -0
- {svc_infra-0.1.513/src/svc_infra/obs/templates/sidecars/fly → svc_infra-0.1.672/src/svc_infra/obs/providers/grafana/templates/provisioning}/__init__.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/obs/providers/grafana/templates/provisioning/dashboards.yml +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/obs/providers/grafana/templates/provisioning/datasource.yml +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/obs/settings.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/obs/templates/grafana_dashboard.json +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/obs/templates/prometheus_rules.yml +0 -0
- {svc_infra-0.1.513/src/svc_infra/obs/templates/sidecars/k8s → svc_infra-0.1.672/src/svc_infra/obs/templates/sidecars}/__init__.py +0 -0
- {svc_infra-0.1.513/src/svc_infra/obs/templates/sidecars/railway → svc_infra-0.1.672/src/svc_infra/obs/templates/sidecars/compose}/__init__.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/obs/templates/sidecars/compose/agent.yaml +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/obs/templates/sidecars/compose/docker-compose.yml +0 -0
- /svc_infra-0.1.513/src/svc_infra/py.typed → /svc_infra-0.1.672/src/svc_infra/obs/templates/sidecars/fly/__init__.py +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/obs/templates/sidecars/fly/agent.yaml +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/obs/templates/sidecars/fly/fly.toml.fragment +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/obs/templates/sidecars/k8s/configmap.yaml +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/obs/templates/sidecars/k8s/deployment.yaml +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/obs/templates/sidecars/railway/Dockerfile +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/obs/templates/sidecars/railway/README.md +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/obs/templates/sidecars/railway/agent.yaml +0 -0
- {svc_infra-0.1.513 → svc_infra-0.1.672}/src/svc_infra/utils.py +0 -0
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
Metadata-Version: 2.3
|
|
2
|
+
Name: svc-infra
|
|
3
|
+
Version: 0.1.672
|
|
4
|
+
Summary: Infrastructure for building and deploying prod-ready services
|
|
5
|
+
License: MIT
|
|
6
|
+
Keywords: fastapi,sqlalchemy,alembic,auth,infra,async,pydantic
|
|
7
|
+
Author: Ali Khatami
|
|
8
|
+
Author-email: aliikhatami94@gmail.com
|
|
9
|
+
Requires-Python: >=3.11,<4.0
|
|
10
|
+
Classifier: Development Status :: 4 - Beta
|
|
11
|
+
Classifier: Framework :: FastAPI
|
|
12
|
+
Classifier: Intended Audience :: Developers
|
|
13
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
18
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
19
|
+
Classifier: Typing :: Typed
|
|
20
|
+
Provides-Extra: duckdb
|
|
21
|
+
Provides-Extra: metrics
|
|
22
|
+
Provides-Extra: mssql
|
|
23
|
+
Provides-Extra: mysql
|
|
24
|
+
Provides-Extra: pg
|
|
25
|
+
Provides-Extra: pg2
|
|
26
|
+
Provides-Extra: redshift
|
|
27
|
+
Provides-Extra: s3
|
|
28
|
+
Provides-Extra: snowflake
|
|
29
|
+
Provides-Extra: sqlite
|
|
30
|
+
Requires-Dist: adyen (>=13.4.0,<14.0.0)
|
|
31
|
+
Requires-Dist: ai-infra (>=0.1.63,<0.2.0)
|
|
32
|
+
Requires-Dist: aioboto3 (>=13.0.0,<14.0.0) ; extra == "s3"
|
|
33
|
+
Requires-Dist: aiofiles (>=24.1.0,<25.0.0)
|
|
34
|
+
Requires-Dist: aiosqlite (>=0.20.0,<0.21.0) ; extra == "sqlite"
|
|
35
|
+
Requires-Dist: alembic (>=1.13.2,<2.0.0)
|
|
36
|
+
Requires-Dist: asyncpg (>=0.30.0,<0.31.0) ; extra == "pg"
|
|
37
|
+
Requires-Dist: authlib (>=1.6.2,<2.0.0)
|
|
38
|
+
Requires-Dist: cashews[redis] (>=7.4.1,<8.0.0)
|
|
39
|
+
Requires-Dist: duckdb (>=1.1.3,<2.0.0) ; extra == "duckdb"
|
|
40
|
+
Requires-Dist: email-validator (>=2.2.0,<3.0.0)
|
|
41
|
+
Requires-Dist: fastapi (>=0.116.1,<0.117.0)
|
|
42
|
+
Requires-Dist: fastapi-users-db-sqlalchemy (>=7.0.0,<8.0.0)
|
|
43
|
+
Requires-Dist: fastapi-users[oauth] (>=14.0.1,<15.0.0)
|
|
44
|
+
Requires-Dist: greenlet (>=3,<4)
|
|
45
|
+
Requires-Dist: httpx (>=0.28.1,<0.29.0)
|
|
46
|
+
Requires-Dist: httpx-oauth (>=0.16.1,<0.17.0)
|
|
47
|
+
Requires-Dist: itsdangerous (>=2.2.0,<3.0.0)
|
|
48
|
+
Requires-Dist: mcp (>=1.13.0,<2.0.0)
|
|
49
|
+
Requires-Dist: motor (>=3.7.1,<4.0.0)
|
|
50
|
+
Requires-Dist: mysqlclient (>=2.2.4,<3.0.0) ; extra == "mysql"
|
|
51
|
+
Requires-Dist: opentelemetry-exporter-otlp (>=1.36.0,<2.0.0)
|
|
52
|
+
Requires-Dist: opentelemetry-instrumentation-fastapi (>=0.57b0,<0.58)
|
|
53
|
+
Requires-Dist: opentelemetry-instrumentation-httpx (>=0.57b0,<0.58)
|
|
54
|
+
Requires-Dist: opentelemetry-instrumentation-requests (>=0.57b0,<0.58)
|
|
55
|
+
Requires-Dist: opentelemetry-instrumentation-sqlalchemy (>=0.57b0,<0.58)
|
|
56
|
+
Requires-Dist: opentelemetry-propagator-b3 (>=1.36.0,<2.0.0)
|
|
57
|
+
Requires-Dist: opentelemetry-sdk (>=1.36.0,<2.0.0)
|
|
58
|
+
Requires-Dist: passlib[bcrypt] (>=1.7.4,<2.0.0)
|
|
59
|
+
Requires-Dist: pre-commit (>=4.3.0,<5.0.0)
|
|
60
|
+
Requires-Dist: prometheus-client (>=0.22.1,<0.23.0) ; extra == "metrics"
|
|
61
|
+
Requires-Dist: psycopg2-binary (>=2.9.10,<3.0.0) ; extra == "pg2"
|
|
62
|
+
Requires-Dist: psycopg[binary] (>=3.2.10,<4.0.0) ; extra == "pg"
|
|
63
|
+
Requires-Dist: pydantic-settings (>=2.10.1,<3.0.0)
|
|
64
|
+
Requires-Dist: pymysql (>=1.1.1,<2.0.0) ; extra == "mysql"
|
|
65
|
+
Requires-Dist: pyodbc (>=5.1.0,<6.0.0) ; extra == "mssql"
|
|
66
|
+
Requires-Dist: pyotp (>=2.9.0,<3.0.0)
|
|
67
|
+
Requires-Dist: python-dotenv (>=1.1.1,<2.0.0)
|
|
68
|
+
Requires-Dist: redis (>=6.4.0,<7.0.0)
|
|
69
|
+
Requires-Dist: redshift-connector (>=2.0.918,<3.0.0) ; extra == "redshift"
|
|
70
|
+
Requires-Dist: snowflake-connector-python (>=3.12.0,<4.0.0) ; extra == "snowflake"
|
|
71
|
+
Requires-Dist: sqlalchemy[asyncio] (>=2.0.43,<3.0.0)
|
|
72
|
+
Requires-Dist: stripe (>=13.0.1,<14.0.0)
|
|
73
|
+
Requires-Dist: typer (>=0.16.1,<0.17.0)
|
|
74
|
+
Project-URL: Documentation, https://github.com/your-org/svc-infra#readme
|
|
75
|
+
Project-URL: Homepage, https://github.com/your-org/svc-infra
|
|
76
|
+
Project-URL: Issues, https://github.com/your-org/svc-infra/issues
|
|
77
|
+
Project-URL: Repository, https://github.com/your-org/svc-infra
|
|
78
|
+
Description-Content-Type: text/markdown
|
|
79
|
+
|
|
80
|
+
# svc-infra
|
|
81
|
+
|
|
82
|
+
[](https://pypi.org/project/svc-infra/)
|
|
83
|
+
[](.)
|
|
84
|
+
|
|
85
|
+
svc-infra packages the shared building blocks we use to ship production FastAPI services fast—HTTP APIs with secure auth, durable persistence, background execution, cache, observability, and webhook plumbing that all share the same batteries-included defaults.
|
|
86
|
+
|
|
87
|
+
## Helper index
|
|
88
|
+
|
|
89
|
+
| Area | What it covers | Guide |
|
|
90
|
+
| --- | --- | --- |
|
|
91
|
+
| Getting Started | Overview and entry points | [This page](src/svc_infra/docs/getting-started.md) |
|
|
92
|
+
| Environment | Feature switches and env vars | [Environment](src/svc_infra/docs/environment.md) |
|
|
93
|
+
| API | FastAPI bootstrap, middleware, docs wiring | [API guide](src/svc_infra/docs/api.md) |
|
|
94
|
+
| Auth | Sessions, OAuth/OIDC, MFA, SMTP delivery | [Auth](src/svc_infra/docs/auth.md) |
|
|
95
|
+
| Security | Password policy, lockout, signed cookies, headers | [Security](src/svc_infra/docs/security.md) |
|
|
96
|
+
| Database | SQL + Mongo wiring, Alembic helpers, inbox/outbox patterns | [Database](src/svc_infra/docs/database.md) |
|
|
97
|
+
| Storage | File storage with S3, local, memory backends | [Storage](src/svc_infra/docs/storage.md) |
|
|
98
|
+
| Documents | Generic document management with metadata | [Documents](src/svc_infra/docs/documents.md) |
|
|
99
|
+
| Tenancy | Multi-tenant boundaries and helpers | [Tenancy](src/svc_infra/docs/tenancy.md) |
|
|
100
|
+
| Idempotency | Idempotent endpoints and middleware | [Idempotency](src/svc_infra/docs/idempotency.md) |
|
|
101
|
+
| Rate Limiting | Middleware, dependency limiter, headers | [Rate limiting](src/svc_infra/docs/rate-limiting.md) |
|
|
102
|
+
| Cache | cashews decorators, namespace management, TTL helpers | [Cache](src/svc_infra/docs/cache.md) |
|
|
103
|
+
| Jobs | JobQueue, scheduler, CLI worker | [Jobs](src/svc_infra/docs/jobs.md) |
|
|
104
|
+
| Observability | Prometheus, Grafana, OpenTelemetry | [Observability](src/svc_infra/docs/observability.md) |
|
|
105
|
+
| Ops | Probes, breakers, SLOs & dashboards | [Ops](src/svc_infra/docs/ops.md) |
|
|
106
|
+
| Webhooks | Subscription store, signing, retry worker | [Webhooks](src/svc_infra/docs/webhooks.md) |
|
|
107
|
+
| CLI | Command groups for sql/mongo/obs/docs/dx/sdk/jobs | [CLI](src/svc_infra/docs/cli.md) |
|
|
108
|
+
| Docs & SDKs | Publishing docs, generating SDKs | [Docs & SDKs](src/svc_infra/docs/docs-and-sdks.md) |
|
|
109
|
+
| Acceptance | Acceptance harness and flows | [Acceptance](src/svc_infra/docs/acceptance.md), [Matrix](src/svc_infra/docs/acceptance-matrix.md) |
|
|
110
|
+
| Contributing | Dev setup and quality gates | [Contributing](src/svc_infra/docs/contributing.md) |
|
|
111
|
+
| Repo Review | Checklist for releasing/PRs | [Repo review](src/svc_infra/docs/repo-review.md) |
|
|
112
|
+
| Data Lifecycle | Fixtures, retention, erasure, backups | [Data lifecycle](src/svc_infra/docs/data-lifecycle.md) |
|
|
113
|
+
|
|
114
|
+
## Quick Start with Template Example
|
|
115
|
+
|
|
116
|
+
See **ALL** svc-infra features working together in a complete example:
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
# One-time setup (from repo root)
|
|
120
|
+
make setup-template # Scaffolds models, runs migrations
|
|
121
|
+
|
|
122
|
+
# Run the example server
|
|
123
|
+
make run-template # Starts at http://localhost:8001
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
See [`examples/README.md`](examples/README.md) for full documentation and manual setup options.
|
|
127
|
+
|
|
128
|
+
## Minimal FastAPI bootstrap
|
|
129
|
+
|
|
130
|
+
```python
|
|
131
|
+
from fastapi import Depends
|
|
132
|
+
from svc_infra.api.fastapi.ease import easy_service_app
|
|
133
|
+
from svc_infra.api.fastapi.db.sql.add import add_sql_db
|
|
134
|
+
from svc_infra.cache import init_cache
|
|
135
|
+
from svc_infra.jobs.easy import easy_jobs
|
|
136
|
+
from svc_infra.webhooks.fastapi import require_signature
|
|
137
|
+
|
|
138
|
+
app = easy_service_app(name="Billing", release="1.2.3")
|
|
139
|
+
add_sql_db(app) # reads SQL_URL / DB_* envs
|
|
140
|
+
init_cache() # honors CACHE_PREFIX / CACHE_VERSION
|
|
141
|
+
queue, scheduler = easy_jobs() # switches via JOBS_DRIVER / REDIS_URL
|
|
142
|
+
|
|
143
|
+
@app.post("/webhooks/billing")
|
|
144
|
+
async def handle_webhook(payload = Depends(require_signature(lambda: ["current", "next"]))):
|
|
145
|
+
queue.enqueue("process-billing-webhook", payload)
|
|
146
|
+
return {"status": "queued"}
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
## Environment switches
|
|
150
|
+
|
|
151
|
+
- **API** – toggle logging/observability and docs exposure with `ENABLE_LOGGING`, `LOG_LEVEL`, `LOG_FORMAT`, `ENABLE_OBS`, `METRICS_PATH`, `OBS_SKIP_PATHS`, and `CORS_ALLOW_ORIGINS`. 【F:src/svc_infra/api/fastapi/ease.py†L67-L111】【F:src/svc_infra/api/fastapi/setup.py†L47-L88】
|
|
152
|
+
- **Auth** – configure JWT secrets, SMTP, cookies, and policy using the `AUTH_…` settings family (e.g., `AUTH_JWT__SECRET`, `AUTH_SMTP_HOST`, `AUTH_SESSION_COOKIE_SECURE`). 【F:src/svc_infra/api/fastapi/auth/settings.py†L23-L91】
|
|
153
|
+
- **Database** – set connection URLs or components via `SQL_URL`/`SQL_URL_FILE`, `DB_DIALECT`, `DB_HOST`, `DB_USER`, `DB_PASSWORD`, plus Mongo knobs like `MONGO_URL`, `MONGO_DB`, and `MONGO_URL_FILE`. 【F:src/svc_infra/api/fastapi/db/sql/add.py†L55-L114】【F:src/svc_infra/db/sql/utils.py†L85-L206】【F:src/svc_infra/db/nosql/mongo/settings.py†L9-L13】【F:src/svc_infra/db/nosql/utils.py†L56-L113】
|
|
154
|
+
- **Storage** – choose backend with `STORAGE_BACKEND` (local, s3, memory) and configure with `STORAGE_S3_BUCKET`, `STORAGE_S3_REGION`, `STORAGE_BASE_PATH`, or auto-detect from `RAILWAY_VOLUME_MOUNT_PATH` / AWS credentials. 【F:src/svc_infra/storage/settings.py】【F:src/svc_infra/docs/storage.md】
|
|
155
|
+
- **Jobs** – choose the queue backend with `JOBS_DRIVER` and provide Redis via `REDIS_URL`; interval schedules can be declared with `JOBS_SCHEDULE_JSON`. 【F:src/svc_infra/jobs/easy.py†L11-L27】【F:src/svc_infra/docs/jobs.md†L11-L48】
|
|
156
|
+
- **Cache** – namespace keys and lifetimes through `CACHE_PREFIX`, `CACHE_VERSION`, and TTL overrides `CACHE_TTL_DEFAULT`, `CACHE_TTL_SHORT`, `CACHE_TTL_LONG`. 【F:src/svc_infra/cache/README.md†L20-L173】【F:src/svc_infra/cache/ttl.py†L26-L55】
|
|
157
|
+
- **Observability** – turn metrics on/off or adjust scrape paths with `ENABLE_OBS`, `METRICS_PATH`, `OBS_SKIP_PATHS`, and Prometheus/Grafana flags like `SVC_INFRA_DISABLE_PROMETHEUS`, `SVC_INFRA_RATE_WINDOW`, `SVC_INFRA_DASHBOARD_REFRESH`, `SVC_INFRA_DASHBOARD_RANGE`. 【F:src/svc_infra/api/fastapi/ease.py†L67-L111】【F:src/svc_infra/obs/metrics/asgi.py†L49-L206】【F:src/svc_infra/obs/cloud_dash.py†L85-L108】
|
|
158
|
+
- **Webhooks** – reuse the jobs envs (`JOBS_DRIVER`, `REDIS_URL`) for the delivery worker and queue configuration. 【F:src/svc_infra/docs/webhooks.md†L32-L53】
|
|
159
|
+
- **Security** – enforce password policy, MFA, and rotation with auth prefixes such as `AUTH_PASSWORD_MIN_LENGTH`, `AUTH_PASSWORD_REQUIRE_SYMBOL`, `AUTH_JWT__SECRET`, and `AUTH_JWT__OLD_SECRETS`. 【F:src/svc_infra/docs/security.md†L24-L70】
|
|
160
|
+
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# svc-infra
|
|
2
|
+
|
|
3
|
+
[](https://pypi.org/project/svc-infra/)
|
|
4
|
+
[](.)
|
|
5
|
+
|
|
6
|
+
svc-infra packages the shared building blocks we use to ship production FastAPI services fast—HTTP APIs with secure auth, durable persistence, background execution, cache, observability, and webhook plumbing that all share the same batteries-included defaults.
|
|
7
|
+
|
|
8
|
+
## Helper index
|
|
9
|
+
|
|
10
|
+
| Area | What it covers | Guide |
|
|
11
|
+
| --- | --- | --- |
|
|
12
|
+
| Getting Started | Overview and entry points | [This page](src/svc_infra/docs/getting-started.md) |
|
|
13
|
+
| Environment | Feature switches and env vars | [Environment](src/svc_infra/docs/environment.md) |
|
|
14
|
+
| API | FastAPI bootstrap, middleware, docs wiring | [API guide](src/svc_infra/docs/api.md) |
|
|
15
|
+
| Auth | Sessions, OAuth/OIDC, MFA, SMTP delivery | [Auth](src/svc_infra/docs/auth.md) |
|
|
16
|
+
| Security | Password policy, lockout, signed cookies, headers | [Security](src/svc_infra/docs/security.md) |
|
|
17
|
+
| Database | SQL + Mongo wiring, Alembic helpers, inbox/outbox patterns | [Database](src/svc_infra/docs/database.md) |
|
|
18
|
+
| Storage | File storage with S3, local, memory backends | [Storage](src/svc_infra/docs/storage.md) |
|
|
19
|
+
| Documents | Generic document management with metadata | [Documents](src/svc_infra/docs/documents.md) |
|
|
20
|
+
| Tenancy | Multi-tenant boundaries and helpers | [Tenancy](src/svc_infra/docs/tenancy.md) |
|
|
21
|
+
| Idempotency | Idempotent endpoints and middleware | [Idempotency](src/svc_infra/docs/idempotency.md) |
|
|
22
|
+
| Rate Limiting | Middleware, dependency limiter, headers | [Rate limiting](src/svc_infra/docs/rate-limiting.md) |
|
|
23
|
+
| Cache | cashews decorators, namespace management, TTL helpers | [Cache](src/svc_infra/docs/cache.md) |
|
|
24
|
+
| Jobs | JobQueue, scheduler, CLI worker | [Jobs](src/svc_infra/docs/jobs.md) |
|
|
25
|
+
| Observability | Prometheus, Grafana, OpenTelemetry | [Observability](src/svc_infra/docs/observability.md) |
|
|
26
|
+
| Ops | Probes, breakers, SLOs & dashboards | [Ops](src/svc_infra/docs/ops.md) |
|
|
27
|
+
| Webhooks | Subscription store, signing, retry worker | [Webhooks](src/svc_infra/docs/webhooks.md) |
|
|
28
|
+
| CLI | Command groups for sql/mongo/obs/docs/dx/sdk/jobs | [CLI](src/svc_infra/docs/cli.md) |
|
|
29
|
+
| Docs & SDKs | Publishing docs, generating SDKs | [Docs & SDKs](src/svc_infra/docs/docs-and-sdks.md) |
|
|
30
|
+
| Acceptance | Acceptance harness and flows | [Acceptance](src/svc_infra/docs/acceptance.md), [Matrix](src/svc_infra/docs/acceptance-matrix.md) |
|
|
31
|
+
| Contributing | Dev setup and quality gates | [Contributing](src/svc_infra/docs/contributing.md) |
|
|
32
|
+
| Repo Review | Checklist for releasing/PRs | [Repo review](src/svc_infra/docs/repo-review.md) |
|
|
33
|
+
| Data Lifecycle | Fixtures, retention, erasure, backups | [Data lifecycle](src/svc_infra/docs/data-lifecycle.md) |
|
|
34
|
+
|
|
35
|
+
## Quick Start with Template Example
|
|
36
|
+
|
|
37
|
+
See **ALL** svc-infra features working together in a complete example:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
# One-time setup (from repo root)
|
|
41
|
+
make setup-template # Scaffolds models, runs migrations
|
|
42
|
+
|
|
43
|
+
# Run the example server
|
|
44
|
+
make run-template # Starts at http://localhost:8001
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
See [`examples/README.md`](examples/README.md) for full documentation and manual setup options.
|
|
48
|
+
|
|
49
|
+
## Minimal FastAPI bootstrap
|
|
50
|
+
|
|
51
|
+
```python
|
|
52
|
+
from fastapi import Depends
|
|
53
|
+
from svc_infra.api.fastapi.ease import easy_service_app
|
|
54
|
+
from svc_infra.api.fastapi.db.sql.add import add_sql_db
|
|
55
|
+
from svc_infra.cache import init_cache
|
|
56
|
+
from svc_infra.jobs.easy import easy_jobs
|
|
57
|
+
from svc_infra.webhooks.fastapi import require_signature
|
|
58
|
+
|
|
59
|
+
app = easy_service_app(name="Billing", release="1.2.3")
|
|
60
|
+
add_sql_db(app) # reads SQL_URL / DB_* envs
|
|
61
|
+
init_cache() # honors CACHE_PREFIX / CACHE_VERSION
|
|
62
|
+
queue, scheduler = easy_jobs() # switches via JOBS_DRIVER / REDIS_URL
|
|
63
|
+
|
|
64
|
+
@app.post("/webhooks/billing")
|
|
65
|
+
async def handle_webhook(payload = Depends(require_signature(lambda: ["current", "next"]))):
|
|
66
|
+
queue.enqueue("process-billing-webhook", payload)
|
|
67
|
+
return {"status": "queued"}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Environment switches
|
|
71
|
+
|
|
72
|
+
- **API** – toggle logging/observability and docs exposure with `ENABLE_LOGGING`, `LOG_LEVEL`, `LOG_FORMAT`, `ENABLE_OBS`, `METRICS_PATH`, `OBS_SKIP_PATHS`, and `CORS_ALLOW_ORIGINS`. 【F:src/svc_infra/api/fastapi/ease.py†L67-L111】【F:src/svc_infra/api/fastapi/setup.py†L47-L88】
|
|
73
|
+
- **Auth** – configure JWT secrets, SMTP, cookies, and policy using the `AUTH_…` settings family (e.g., `AUTH_JWT__SECRET`, `AUTH_SMTP_HOST`, `AUTH_SESSION_COOKIE_SECURE`). 【F:src/svc_infra/api/fastapi/auth/settings.py†L23-L91】
|
|
74
|
+
- **Database** – set connection URLs or components via `SQL_URL`/`SQL_URL_FILE`, `DB_DIALECT`, `DB_HOST`, `DB_USER`, `DB_PASSWORD`, plus Mongo knobs like `MONGO_URL`, `MONGO_DB`, and `MONGO_URL_FILE`. 【F:src/svc_infra/api/fastapi/db/sql/add.py†L55-L114】【F:src/svc_infra/db/sql/utils.py†L85-L206】【F:src/svc_infra/db/nosql/mongo/settings.py†L9-L13】【F:src/svc_infra/db/nosql/utils.py†L56-L113】
|
|
75
|
+
- **Storage** – choose backend with `STORAGE_BACKEND` (local, s3, memory) and configure with `STORAGE_S3_BUCKET`, `STORAGE_S3_REGION`, `STORAGE_BASE_PATH`, or auto-detect from `RAILWAY_VOLUME_MOUNT_PATH` / AWS credentials. 【F:src/svc_infra/storage/settings.py】【F:src/svc_infra/docs/storage.md】
|
|
76
|
+
- **Jobs** – choose the queue backend with `JOBS_DRIVER` and provide Redis via `REDIS_URL`; interval schedules can be declared with `JOBS_SCHEDULE_JSON`. 【F:src/svc_infra/jobs/easy.py†L11-L27】【F:src/svc_infra/docs/jobs.md†L11-L48】
|
|
77
|
+
- **Cache** – namespace keys and lifetimes through `CACHE_PREFIX`, `CACHE_VERSION`, and TTL overrides `CACHE_TTL_DEFAULT`, `CACHE_TTL_SHORT`, `CACHE_TTL_LONG`. 【F:src/svc_infra/cache/README.md†L20-L173】【F:src/svc_infra/cache/ttl.py†L26-L55】
|
|
78
|
+
- **Observability** – turn metrics on/off or adjust scrape paths with `ENABLE_OBS`, `METRICS_PATH`, `OBS_SKIP_PATHS`, and Prometheus/Grafana flags like `SVC_INFRA_DISABLE_PROMETHEUS`, `SVC_INFRA_RATE_WINDOW`, `SVC_INFRA_DASHBOARD_REFRESH`, `SVC_INFRA_DASHBOARD_RANGE`. 【F:src/svc_infra/api/fastapi/ease.py†L67-L111】【F:src/svc_infra/obs/metrics/asgi.py†L49-L206】【F:src/svc_infra/obs/cloud_dash.py†L85-L108】
|
|
79
|
+
- **Webhooks** – reuse the jobs envs (`JOBS_DRIVER`, `REDIS_URL`) for the delivery worker and queue configuration. 【F:src/svc_infra/docs/webhooks.md†L32-L53】
|
|
80
|
+
- **Security** – enforce password policy, MFA, and rotation with auth prefixes such as `AUTH_PASSWORD_MIN_LENGTH`, `AUTH_PASSWORD_REQUIRE_SYMBOL`, `AUTH_JWT__SECRET`, and `AUTH_JWT__OLD_SECRETS`. 【F:src/svc_infra/docs/security.md†L24-L70】
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "svc-infra"
|
|
3
|
-
version = "0.1.
|
|
3
|
+
version = "0.1.672"
|
|
4
4
|
description = "Infrastructure for building and deploying prod-ready services"
|
|
5
5
|
authors = ["Ali Khatami <aliikhatami94@gmail.com>"]
|
|
6
6
|
license = "MIT"
|
|
@@ -12,7 +12,8 @@ include = [
|
|
|
12
12
|
"src/svc_infra/db/templates/**/*",
|
|
13
13
|
"src/svc_infra/obs/templates/**/*",
|
|
14
14
|
"src/svc_infra/obs/grafana/templates/**/*",
|
|
15
|
-
"src/svc_infra/obs/grafana/dashboards/**/*"
|
|
15
|
+
"src/svc_infra/obs/grafana/dashboards/**/*",
|
|
16
|
+
"src/svc_infra/docs/**/*"
|
|
16
17
|
]
|
|
17
18
|
|
|
18
19
|
classifiers = [
|
|
@@ -67,6 +68,10 @@ redshift-connector = { version = "^2.0.918", optional = true }
|
|
|
67
68
|
duckdb = { version = "^1.1.3", optional = true }
|
|
68
69
|
# (Removed hard psycopg2)
|
|
69
70
|
|
|
71
|
+
# Storage
|
|
72
|
+
aiofiles = "^24.1.0"
|
|
73
|
+
aioboto3 = { version = "^13.0.0", optional = true }
|
|
74
|
+
|
|
70
75
|
# Other infra deps
|
|
71
76
|
mcp = "^1.13.0"
|
|
72
77
|
ai-infra = "^0.1.63"
|
|
@@ -86,6 +91,8 @@ redis = "^6.4.0"
|
|
|
86
91
|
cashews = {extras = ["redis"], version = "^7.4.1"}
|
|
87
92
|
itsdangerous = "^2.2.0"
|
|
88
93
|
pyotp = "^2.9.0"
|
|
94
|
+
stripe = "^13.0.1"
|
|
95
|
+
adyen = "^13.4.0"
|
|
89
96
|
|
|
90
97
|
[tool.poetry.extras]
|
|
91
98
|
# Postgres v3
|
|
@@ -99,6 +106,7 @@ snowflake = ["snowflake-connector-python"]
|
|
|
99
106
|
redshift = ["redshift-connector"]
|
|
100
107
|
duckdb = ["duckdb"]
|
|
101
108
|
metrics = ["prometheus-client"]
|
|
109
|
+
s3 = ["aioboto3"]
|
|
102
110
|
|
|
103
111
|
[tool.poetry.group.dev.dependencies]
|
|
104
112
|
pytest = "^8.3.2"
|
|
@@ -106,6 +114,11 @@ pytest-asyncio = "^0.23.8"
|
|
|
106
114
|
ruff = "^0.6.9"
|
|
107
115
|
mypy = "^1.11.2"
|
|
108
116
|
types-requests = "^2.32.0.20241016"
|
|
117
|
+
pytest-mock = "^3.15.1"
|
|
118
|
+
httpx = "^0.28.1"
|
|
119
|
+
fakeredis = "^2.27.0"
|
|
120
|
+
moto = {extras = ["s3"], version = "^5.0.0"}
|
|
121
|
+
aiosqlite = "^0.20.0" # Required for acceptance tests using SQLite
|
|
109
122
|
|
|
110
123
|
[tool.poetry.scripts]
|
|
111
124
|
svc-infra = "svc_infra.cli:main"
|
|
@@ -115,6 +128,22 @@ testpaths = ["tests"]
|
|
|
115
128
|
python_files = ["test_*.py", "*_test.py"]
|
|
116
129
|
python_classes = ["Test*",]
|
|
117
130
|
python_functions = ["test_*"]
|
|
131
|
+
markers = [
|
|
132
|
+
"acceptance: End-to-end acceptance tests running against the acceptance app or BASE_URL",
|
|
133
|
+
"unit: Unit tests",
|
|
134
|
+
"security: Security and auth hardening tests",
|
|
135
|
+
"ratelimit: Rate limiting and abuse protection tests",
|
|
136
|
+
"concurrency: Idempotency and concurrency control tests",
|
|
137
|
+
"jobs: Background jobs and scheduling tests",
|
|
138
|
+
"webhooks: Webhooks framework tests",
|
|
139
|
+
"billing: Billing primitives tests",
|
|
140
|
+
"tenancy: Tenancy isolation and enforcement tests",
|
|
141
|
+
"data_lifecycle: Data lifecycle (fixtures, retention, erasure, backups)",
|
|
142
|
+
"ops: SLOs & Ops tests (probes, breaker, instrumentation)",
|
|
143
|
+
"dx: Developer experience and quality gates tests",
|
|
144
|
+
"admin: Admin scope and impersonation tests",
|
|
145
|
+
"storage: File storage system tests",
|
|
146
|
+
]
|
|
118
147
|
filterwarnings = [
|
|
119
148
|
"ignore:The `route` decorator is deprecated:DeprecationWarning:starlette.*",
|
|
120
149
|
]
|