svc-infra 0.1.688__tar.gz → 1.0.5__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.688 → svc_infra-1.0.5}/PKG-INFO +70 -60
- {svc_infra-0.1.688 → svc_infra-1.0.5}/README.md +15 -9
- svc_infra-1.0.5/pyproject.toml +242 -0
- svc_infra-1.0.5/src/svc_infra/__init__.py +59 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/apf_payments/models.py +68 -38
- svc_infra-1.0.5/src/svc_infra/apf_payments/provider/__init__.py +4 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/apf_payments/provider/aiydan.py +39 -23
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/apf_payments/provider/base.py +8 -3
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/apf_payments/provider/registry.py +3 -5
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/apf_payments/provider/stripe.py +74 -52
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/apf_payments/schemas.py +84 -83
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/apf_payments/service.py +27 -16
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/apf_payments/settings.py +12 -11
- svc_infra-1.0.5/src/svc_infra/api/__init__.py +61 -0
- svc_infra-1.0.5/src/svc_infra/api/fastapi/__init__.py +65 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/admin/add.py +25 -16
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/apf_payments/router.py +44 -33
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/apf_payments/setup.py +10 -7
- svc_infra-1.0.5/src/svc_infra/api/fastapi/auth/__init__.py +65 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/_cookies.py +1 -3
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/add.py +14 -11
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/gaurd.py +30 -18
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/mfa/models.py +3 -4
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/mfa/pre_auth.py +13 -9
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/mfa/router.py +9 -8
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/mfa/security.py +4 -7
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/mfa/utils.py +5 -3
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/policy.py +0 -1
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/providers.py +3 -3
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/routers/apikey_router.py +19 -21
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/routers/oauth_router.py +78 -42
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/routers/session_router.py +6 -5
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/security.py +25 -15
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/sender.py +5 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/settings.py +18 -19
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/state.py +5 -4
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/ws_security.py +3 -3
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/billing/router.py +15 -8
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/db/__init__.py +5 -1
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/db/http.py +10 -9
- svc_infra-1.0.5/src/svc_infra/api/fastapi/db/nosql/__init__.py +46 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/db/nosql/mongo/add.py +3 -4
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/db/nosql/mongo/crud_router.py +39 -21
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/db/sql/__init__.py +5 -1
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/db/sql/add.py +25 -10
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/db/sql/crud_router.py +57 -44
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/db/sql/session.py +3 -2
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/db/sql/users.py +18 -9
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/dependencies/ratelimit.py +26 -14
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/docs/add.py +12 -9
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/docs/landing.py +5 -5
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/docs/scoped.py +38 -34
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/dual/dualize.py +2 -2
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/dual/protected.py +19 -14
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/dual/router.py +18 -8
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/ease.py +55 -7
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/http/concurrency.py +2 -1
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/http/conditional.py +2 -2
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/middleware/debug.py +4 -1
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/middleware/errors/exceptions.py +2 -5
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/middleware/errors/handlers.py +9 -7
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/middleware/graceful_shutdown.py +13 -5
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/middleware/idempotency.py +8 -5
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/middleware/idempotency_store.py +14 -14
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/middleware/optimistic_lock.py +4 -2
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/middleware/ratelimit.py +14 -15
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/middleware/ratelimit_store.py +32 -6
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/middleware/request_size_limit.py +3 -3
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/middleware/timeout.py +38 -8
- svc_infra-1.0.5/src/svc_infra/api/fastapi/object_router.py +1060 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/openapi/apply.py +4 -3
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/openapi/conventions.py +13 -6
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/openapi/mutators.py +31 -18
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/openapi/pipeline.py +2 -2
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/openapi/responses.py +4 -6
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/openapi/security.py +1 -1
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/ops/add.py +6 -6
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/pagination.py +44 -31
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/routers/__init__.py +16 -10
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/setup.py +24 -15
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/tenancy/add.py +3 -2
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/tenancy/context.py +11 -10
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/versioned.py +3 -2
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/app/__init__.py +3 -1
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/app/env.py +70 -4
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/app/logging/add.py +10 -2
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/app/logging/filter.py +1 -1
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/app/logging/formats.py +13 -5
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/app/root.py +3 -3
- svc_infra-1.0.5/src/svc_infra/billing/__init__.py +40 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/billing/async_service.py +28 -8
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/billing/jobs.py +19 -18
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/billing/models.py +31 -16
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/billing/quotas.py +5 -5
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/billing/schemas.py +7 -6
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/cache/__init__.py +17 -5
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/cache/add.py +19 -10
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/cache/backend.py +4 -5
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/cache/decorators.py +75 -38
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/cache/demo.py +2 -2
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/cache/keys.py +2 -2
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/cache/recache.py +26 -27
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/cache/resources.py +6 -5
- svc_infra-1.0.5/src/svc_infra/cache/tags.py +52 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/cache/ttl.py +2 -3
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/cache/utils.py +4 -3
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/cli/__init__.py +12 -0
- svc_infra-1.0.5/src/svc_infra/cli/cmds/__init__.py +55 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/db/nosql/mongo/mongo_cmds.py +14 -11
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/db/nosql/mongo/mongo_scaffold_cmds.py +5 -6
- svc_infra-1.0.5/src/svc_infra/cli/cmds/db/ops_cmds.py +267 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/db/sql/alembic_cmds.py +19 -20
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/db/sql/sql_export_cmds.py +12 -12
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/db/sql/sql_scaffold_cmds.py +10 -10
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/docs/docs_cmds.py +6 -7
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/dx/dx_cmds.py +15 -4
- svc_infra-1.0.5/src/svc_infra/cli/cmds/health/__init__.py +179 -0
- svc_infra-1.0.5/src/svc_infra/cli/cmds/health/health_cmds.py +8 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/jobs/jobs_cmds.py +1 -2
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/obs/obs_cmds.py +27 -10
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/cli/foundation/runner.py +4 -5
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/cli/foundation/typer_bootstrap.py +1 -2
- svc_infra-1.0.5/src/svc_infra/data/__init__.py +83 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/data/add.py +7 -7
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/data/backup.py +11 -8
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/data/erasure.py +4 -3
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/data/fixtures.py +7 -5
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/data/retention.py +9 -8
- svc_infra-1.0.5/src/svc_infra/db/__init__.py +15 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/db/crud_schema.py +14 -13
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/db/nosql/__init__.py +2 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/db/nosql/constants.py +1 -1
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/db/nosql/core.py +19 -5
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/db/nosql/indexes.py +12 -9
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/db/nosql/management.py +4 -4
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/db/nosql/mongo/client.py +21 -4
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/db/nosql/mongo/settings.py +1 -1
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/db/nosql/repository.py +46 -27
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/db/nosql/resource.py +28 -16
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/db/nosql/scaffold.py +14 -12
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/db/nosql/service.py +2 -1
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/db/nosql/service_with_hooks.py +4 -3
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/db/nosql/utils.py +4 -4
- svc_infra-1.0.5/src/svc_infra/db/ops.py +380 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/db/outbox.py +15 -14
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/db/sql/apikey.py +34 -15
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/db/sql/authref.py +8 -6
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/db/sql/constants.py +5 -1
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/db/sql/core.py +13 -13
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/db/sql/management.py +5 -6
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/db/sql/repository.py +48 -22
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/db/sql/resource.py +14 -13
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/db/sql/scaffold.py +11 -11
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/db/sql/service.py +2 -1
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/db/sql/service_with_hooks.py +4 -3
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/db/sql/tenant.py +2 -1
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/db/sql/uniq.py +8 -7
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/db/sql/uniq_hooks.py +12 -11
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/db/sql/utils.py +87 -43
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/db/utils.py +3 -3
- svc_infra-1.0.5/src/svc_infra/deploy/__init__.py +531 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/documents/add.py +14 -9
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/documents/ease.py +8 -8
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/documents/models.py +3 -3
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/documents/storage.py +10 -10
- svc_infra-1.0.5/src/svc_infra/dx/__init__.py +58 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/dx/changelog.py +2 -2
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/dx/checks.py +3 -2
- svc_infra-1.0.5/src/svc_infra/exceptions.py +141 -0
- svc_infra-1.0.5/src/svc_infra/health/__init__.py +863 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/http/client.py +38 -9
- svc_infra-1.0.5/src/svc_infra/jobs/__init__.py +79 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/jobs/builtins/outbox_processor.py +2 -2
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/jobs/builtins/webhook_delivery.py +4 -1
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/jobs/easy.py +1 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/jobs/loader.py +8 -4
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/jobs/queue.py +37 -12
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/jobs/redis_queue.py +84 -33
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/jobs/runner.py +5 -5
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/jobs/scheduler.py +5 -5
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/jobs/worker.py +1 -1
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/loaders/__init__.py +5 -5
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/loaders/base.py +6 -5
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/loaders/github.py +3 -3
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/loaders/models.py +2 -2
- svc_infra-1.0.5/src/svc_infra/logging/__init__.py +375 -0
- svc_infra-1.0.5/src/svc_infra/mcp/__init__.py +82 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/mcp/svc_infra_mcp.py +5 -4
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/obs/add.py +17 -7
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/obs/cloud_dash.py +2 -1
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/obs/metrics/__init__.py +6 -7
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/obs/metrics/asgi.py +8 -7
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/obs/metrics/base.py +13 -13
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/obs/metrics/http.py +3 -3
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/obs/metrics/sqlalchemy.py +14 -13
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/obs/metrics.py +9 -8
- svc_infra-1.0.5/src/svc_infra/resilience/__init__.py +44 -0
- svc_infra-1.0.5/src/svc_infra/resilience/circuit_breaker.py +328 -0
- svc_infra-1.0.5/src/svc_infra/resilience/retry.py +289 -0
- svc_infra-1.0.5/src/svc_infra/security/__init__.py +167 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/security/add.py +18 -6
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/security/audit.py +97 -18
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/security/audit_service.py +10 -9
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/security/hibp.py +7 -4
- svc_infra-1.0.5/src/svc_infra/security/jwt_rotation.py +102 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/security/lockout.py +23 -16
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/security/models.py +55 -42
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/security/oauth_models.py +25 -11
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/security/org_invites.py +12 -12
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/security/passwords.py +3 -3
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/security/permissions.py +30 -7
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/security/session.py +7 -8
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/security/signed_cookies.py +26 -6
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/storage/add.py +4 -4
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/storage/backends/local.py +10 -10
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/storage/backends/memory.py +3 -4
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/storage/backends/s3.py +17 -12
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/storage/base.py +2 -2
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/storage/easy.py +3 -4
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/storage/settings.py +14 -14
- svc_infra-1.0.5/src/svc_infra/testing/__init__.py +682 -0
- svc_infra-1.0.5/src/svc_infra/utils.py +188 -0
- svc_infra-1.0.5/src/svc_infra/webhooks/__init__.py +69 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/webhooks/add.py +57 -52
- svc_infra-1.0.5/src/svc_infra/webhooks/encryption.py +115 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/webhooks/fastapi.py +1 -1
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/webhooks/router.py +3 -3
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/webhooks/service.py +9 -7
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/webhooks/signing.py +10 -6
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/websocket/add.py +3 -3
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/websocket/client.py +5 -3
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/websocket/manager.py +6 -5
- svc_infra-0.1.688/pyproject.toml +0 -154
- svc_infra-0.1.688/src/svc_infra/__init__.py +0 -28
- svc_infra-0.1.688/src/svc_infra/apf_payments/provider/__init__.py +0 -4
- svc_infra-0.1.688/src/svc_infra/api/fastapi/__init__.py +0 -31
- svc_infra-0.1.688/src/svc_infra/api/fastapi/db/nosql/__init__.py +0 -8
- svc_infra-0.1.688/src/svc_infra/billing/__init__.py +0 -23
- svc_infra-0.1.688/src/svc_infra/billing/service.py +0 -115
- svc_infra-0.1.688/src/svc_infra/cache/tags.py +0 -77
- svc_infra-0.1.688/src/svc_infra/cli/cmds/__init__.py +0 -28
- svc_infra-0.1.688/src/svc_infra/obs/templates/sidecars/compose/__init__.py +0 -0
- svc_infra-0.1.688/src/svc_infra/obs/templates/sidecars/fly/__init__.py +0 -0
- svc_infra-0.1.688/src/svc_infra/obs/templates/sidecars/k8s/__init__.py +0 -0
- svc_infra-0.1.688/src/svc_infra/obs/templates/sidecars/railway/__init__.py +0 -0
- svc_infra-0.1.688/src/svc_infra/security/jwt_rotation.py +0 -53
- svc_infra-0.1.688/src/svc_infra/utils.py +0 -23
- svc_infra-0.1.688/src/svc_infra/webhooks/__init__.py +0 -16
- {svc_infra-0.1.688 → svc_infra-1.0.5}/LICENSE +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/apf_payments/README.md +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/apf_payments/__init__.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/apf_payments/alembic.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/admin/__init__.py +0 -0
- {svc_infra-0.1.688/src/svc_infra/api → svc_infra-1.0.5/src/svc_infra/api/fastapi/apf_payments}/__init__.py +0 -0
- {svc_infra-0.1.688/src/svc_infra/api/fastapi/apf_payments → svc_infra-1.0.5/src/svc_infra/api/fastapi/auth/mfa}/__init__.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/mfa/verify.py +0 -0
- {svc_infra-0.1.688/src/svc_infra/api/fastapi/auth → svc_infra-1.0.5/src/svc_infra/api/fastapi/auth/routers}/__init__.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/routers/account.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/billing/setup.py +0 -0
- {svc_infra-0.1.688/src/svc_infra/api/fastapi/auth/mfa → svc_infra-1.0.5/src/svc_infra/api/fastapi/cache}/__init__.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/cache/add.py +0 -0
- {svc_infra-0.1.688/src/svc_infra/api/fastapi/auth/routers → svc_infra-1.0.5/src/svc_infra/api/fastapi/db/nosql/mongo}/__init__.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/db/nosql/mongo/health.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/db/sql/README.md +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/db/sql/health.py +0 -0
- {svc_infra-0.1.688/src/svc_infra/api/fastapi/cache → svc_infra-1.0.5/src/svc_infra/api/fastapi/docs}/__init__.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/dual/__init__.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/dual/public.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/dual/utils.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/dx.py +0 -0
- {svc_infra-0.1.688/src/svc_infra/api/fastapi/db/nosql/mongo → svc_infra-1.0.5/src/svc_infra/api/fastapi/http}/__init__.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/http/deprecation.py +0 -0
- {svc_infra-0.1.688/src/svc_infra/api/fastapi/docs → svc_infra-1.0.5/src/svc_infra/api/fastapi/middleware}/__init__.py +0 -0
- {svc_infra-0.1.688/src/svc_infra/api/fastapi/http → svc_infra-1.0.5/src/svc_infra/api/fastapi/middleware/errors}/__init__.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/middleware/errors/catchall.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/middleware/request_id.py +0 -0
- {svc_infra-0.1.688/src/svc_infra/api/fastapi/middleware → svc_infra-1.0.5/src/svc_infra/api/fastapi/openapi}/__init__.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/openapi/models.py +0 -0
- {svc_infra-0.1.688/src/svc_infra/api/fastapi/middleware/errors → svc_infra-1.0.5/src/svc_infra/api/fastapi/paths}/__init__.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/paths/auth.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/paths/generic.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/paths/prefix.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/paths/user.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/routers/ping.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/app/README.md +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/app/logging/__init__.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/bundled_docs/README.md +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/bundled_docs/__init__.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/bundled_docs/getting-started.md +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/cache/README.md +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/cli/__main__.py +0 -0
- {svc_infra-0.1.688/src/svc_infra/api/fastapi/openapi → svc_infra-1.0.5/src/svc_infra/cli/cmds/db}/__init__.py +0 -0
- {svc_infra-0.1.688/src/svc_infra/api/fastapi/paths → svc_infra-1.0.5/src/svc_infra/cli/cmds/db/nosql}/__init__.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/db/nosql/mongo/README.md +0 -0
- {svc_infra-0.1.688/src/svc_infra/cli/cmds/db → svc_infra-1.0.5/src/svc_infra/cli/cmds/db/nosql/mongo}/__init__.py +0 -0
- {svc_infra-0.1.688/src/svc_infra/cli/cmds/db/nosql → svc_infra-1.0.5/src/svc_infra/cli/cmds/db/sql}/__init__.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/dx/__init__.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/help.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/jobs/__init__.py +0 -0
- {svc_infra-0.1.688/src/svc_infra/cli/cmds/db/nosql/mongo → svc_infra-1.0.5/src/svc_infra/cli/cmds/obs}/__init__.py +0 -0
- {svc_infra-0.1.688/src/svc_infra/cli/cmds/db/sql → svc_infra-1.0.5/src/svc_infra/cli/cmds/sdk}/__init__.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/sdk/sdk_cmds.py +0 -0
- {svc_infra-0.1.688/src/svc_infra/cli/cmds/obs → svc_infra-1.0.5/src/svc_infra/cli/foundation}/__init__.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/db/inbox.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/db/nosql/base.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/db/nosql/mongo/README.md +0 -0
- {svc_infra-0.1.688/src/svc_infra/cli/cmds/sdk → svc_infra-1.0.5/src/svc_infra/db/nosql/mongo}/__init__.py +0 -0
- {svc_infra-0.1.688/src/svc_infra/cli/foundation → svc_infra-1.0.5/src/svc_infra/db/nosql/mongo/templates}/__init__.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/db/nosql/mongo/templates/documents.py.tmpl +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/db/nosql/mongo/templates/resources.py.tmpl +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/db/nosql/mongo/templates/schemas.py.tmpl +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/db/nosql/types.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/db/sql/README.md +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/db/sql/__init__.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/db/sql/base.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/db/sql/templates/__init__.py +0 -0
- {svc_infra-0.1.688/src/svc_infra/db → svc_infra-1.0.5/src/svc_infra/db/sql/templates/models_schemas}/__init__.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/db/sql/templates/models_schemas/auth/models.py.tmpl +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/db/sql/templates/models_schemas/auth/schemas.py.tmpl +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/db/sql/templates/models_schemas/entity/models.py.tmpl +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/db/sql/templates/models_schemas/entity/schemas.py.tmpl +0 -0
- {svc_infra-0.1.688/src/svc_infra/db/nosql/mongo → svc_infra-1.0.5/src/svc_infra/db/sql/templates/setup}/__init__.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/db/sql/templates/setup/alembic.ini.tmpl +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/db/sql/templates/setup/env_async.py.tmpl +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/db/sql/templates/setup/env_sync.py.tmpl +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/db/sql/templates/setup/script.py.mako.tmpl +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/db/sql/types.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/db/sql/versioning.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/documents/__init__.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/dx/add.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/http/__init__.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/loaders/url.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/obs/README.md +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/obs/__init__.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/obs/grafana/dashboards/http-overview.json +0 -0
- {svc_infra-0.1.688/src/svc_infra/db/nosql/mongo/templates → svc_infra-1.0.5/src/svc_infra/obs/providers}/__init__.py +0 -0
- {svc_infra-0.1.688/src/svc_infra/db/sql/templates/models_schemas → svc_infra-1.0.5/src/svc_infra/obs/providers/compose_cloud}/__init__.py +0 -0
- {svc_infra-0.1.688/src/svc_infra/db/sql/templates/setup → svc_infra-1.0.5/src/svc_infra/obs/providers/compose_cloud/templates}/__init__.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/obs/providers/compose_cloud/templates/agent.yaml.tmpl +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/obs/providers/compose_cloud/templates/docker-compose.cloud.yml.tmpl +0 -0
- {svc_infra-0.1.688/src/svc_infra/mcp → svc_infra-1.0.5/src/svc_infra/obs/providers/grafana}/__init__.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/obs/providers/grafana/dashboards/00_overview.json +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/obs/providers/grafana/dashboards/10_http.json +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/obs/providers/grafana/dashboards/20_db.json +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/obs/providers/grafana/dashboards/30_runtime.json +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/obs/providers/grafana/dashboards/40_clients.json +0 -0
- {svc_infra-0.1.688/src/svc_infra/obs/providers → svc_infra-1.0.5/src/svc_infra/obs/providers/grafana/dashboards}/__init__.py +0 -0
- {svc_infra-0.1.688/src/svc_infra/obs/providers/compose_cloud → svc_infra-1.0.5/src/svc_infra/obs/providers/grafana/templates}/__init__.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/obs/providers/grafana/templates/docker-compose.yml.tmpl +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/obs/providers/grafana/templates/prometheus.yml.tmpl +0 -0
- {svc_infra-0.1.688/src/svc_infra/obs/providers/compose_cloud/templates → svc_infra-1.0.5/src/svc_infra/obs/providers/grafana/templates/provisioning}/__init__.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/obs/providers/grafana/templates/provisioning/dashboards.yml +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/obs/providers/grafana/templates/provisioning/datasource.yml +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/obs/settings.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/obs/templates/grafana_dashboard.json +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/obs/templates/prometheus_rules.yml +0 -0
- {svc_infra-0.1.688/src/svc_infra/obs/providers/grafana → svc_infra-1.0.5/src/svc_infra/obs/templates/sidecars}/__init__.py +0 -0
- {svc_infra-0.1.688/src/svc_infra/obs/providers/grafana/dashboards → svc_infra-1.0.5/src/svc_infra/obs/templates/sidecars/compose}/__init__.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/obs/templates/sidecars/compose/agent.yaml +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/obs/templates/sidecars/compose/docker-compose.yml +0 -0
- {svc_infra-0.1.688/src/svc_infra/obs/providers/grafana/templates → svc_infra-1.0.5/src/svc_infra/obs/templates/sidecars/fly}/__init__.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/obs/templates/sidecars/fly/agent.yaml +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/obs/templates/sidecars/fly/fly.toml.fragment +0 -0
- {svc_infra-0.1.688/src/svc_infra/obs/providers/grafana/templates/provisioning → svc_infra-1.0.5/src/svc_infra/obs/templates/sidecars/k8s}/__init__.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/obs/templates/sidecars/k8s/configmap.yaml +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/obs/templates/sidecars/k8s/deployment.yaml +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/obs/templates/sidecars/railway/Dockerfile +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/obs/templates/sidecars/railway/README.md +0 -0
- {svc_infra-0.1.688/src/svc_infra/obs/templates/sidecars → svc_infra-1.0.5/src/svc_infra/obs/templates/sidecars/railway}/__init__.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/obs/templates/sidecars/railway/agent.yaml +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/py.typed +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/security/headers.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/storage/__init__.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/storage/backends/__init__.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/websocket/__init__.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/websocket/config.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/websocket/easy.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/websocket/exceptions.py +0 -0
- {svc_infra-0.1.688 → svc_infra-1.0.5}/src/svc_infra/websocket/models.py +0 -0
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: svc-infra
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 1.0.5
|
|
4
4
|
Summary: Infrastructure for building and deploying prod-ready services
|
|
5
5
|
License: MIT
|
|
6
6
|
Keywords: fastapi,sqlalchemy,alembic,auth,infra,async,pydantic
|
|
7
7
|
Author: Ali Khatami
|
|
8
8
|
Author-email: aliikhatami94@gmail.com
|
|
9
9
|
Requires-Python: >=3.11,<4.0
|
|
10
|
-
Classifier: Development Status ::
|
|
10
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
11
11
|
Classifier: Framework :: FastAPI
|
|
12
12
|
Classifier: Intended Audience :: Developers
|
|
13
13
|
Classifier: License :: OSI Approved :: MIT License
|
|
@@ -16,79 +16,89 @@ Classifier: Programming Language :: Python :: 3.11
|
|
|
16
16
|
Classifier: Programming Language :: Python :: 3.12
|
|
17
17
|
Classifier: Programming Language :: Python :: 3.13
|
|
18
18
|
Classifier: Programming Language :: Python :: 3 :: Only
|
|
19
|
+
Classifier: Topic :: Internet :: WWW/HTTP :: HTTP Servers
|
|
20
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
19
21
|
Classifier: Typing :: Typed
|
|
22
|
+
Provides-Extra: adyen
|
|
20
23
|
Provides-Extra: duckdb
|
|
21
24
|
Provides-Extra: metrics
|
|
25
|
+
Provides-Extra: mongodb
|
|
22
26
|
Provides-Extra: mssql
|
|
23
27
|
Provides-Extra: mysql
|
|
28
|
+
Provides-Extra: payments
|
|
24
29
|
Provides-Extra: pg
|
|
25
30
|
Provides-Extra: pg2
|
|
26
31
|
Provides-Extra: redshift
|
|
27
32
|
Provides-Extra: s3
|
|
28
33
|
Provides-Extra: snowflake
|
|
29
34
|
Provides-Extra: sqlite
|
|
30
|
-
|
|
31
|
-
Requires-Dist:
|
|
32
|
-
Requires-Dist: aioboto3 (>=
|
|
33
|
-
Requires-Dist: aiofiles (>=24.
|
|
34
|
-
Requires-Dist: aiosqlite (>=0.
|
|
35
|
-
Requires-Dist: alembic (>=1.13.
|
|
36
|
-
Requires-Dist: asyncpg (>=0.
|
|
37
|
-
Requires-Dist: authlib (>=1.
|
|
38
|
-
Requires-Dist: cashews[redis] (>=7.
|
|
39
|
-
Requires-Dist: duckdb (>=
|
|
40
|
-
Requires-Dist: email-validator (>=2.
|
|
41
|
-
Requires-Dist: fastapi (>=0.
|
|
42
|
-
Requires-Dist: fastapi-users-db-sqlalchemy (>=7.0.0
|
|
43
|
-
Requires-Dist: fastapi-users[oauth] (>=14.0.
|
|
44
|
-
Requires-Dist: greenlet (>=3
|
|
45
|
-
Requires-Dist: httpx (>=0.
|
|
46
|
-
Requires-Dist: httpx-oauth (>=0.
|
|
47
|
-
Requires-Dist: itsdangerous (>=2.
|
|
48
|
-
Requires-Dist: mcp (>=1.
|
|
49
|
-
Requires-Dist: motor (>=3.
|
|
50
|
-
Requires-Dist: mysqlclient (>=2.2.
|
|
51
|
-
Requires-Dist: opentelemetry-exporter-otlp (>=1.
|
|
52
|
-
Requires-Dist: opentelemetry-instrumentation-fastapi (>=0.
|
|
53
|
-
Requires-Dist: opentelemetry-instrumentation-httpx (>=0.
|
|
54
|
-
Requires-Dist: opentelemetry-instrumentation-requests (>=0.
|
|
55
|
-
Requires-Dist: opentelemetry-instrumentation-sqlalchemy (>=0.
|
|
56
|
-
Requires-Dist: opentelemetry-propagator-b3 (>=1.
|
|
57
|
-
Requires-Dist: opentelemetry-sdk (>=1.
|
|
58
|
-
Requires-Dist: passlib[bcrypt] (>=1.7.4
|
|
59
|
-
Requires-Dist:
|
|
60
|
-
Requires-Dist:
|
|
61
|
-
Requires-Dist:
|
|
62
|
-
Requires-Dist:
|
|
63
|
-
Requires-Dist:
|
|
64
|
-
Requires-Dist:
|
|
65
|
-
Requires-Dist:
|
|
66
|
-
Requires-Dist:
|
|
67
|
-
Requires-Dist:
|
|
68
|
-
Requires-Dist:
|
|
69
|
-
Requires-Dist:
|
|
70
|
-
Requires-Dist:
|
|
71
|
-
Requires-Dist:
|
|
72
|
-
Requires-Dist:
|
|
73
|
-
Requires-Dist:
|
|
74
|
-
|
|
75
|
-
Project-URL:
|
|
76
|
-
Project-URL:
|
|
77
|
-
Project-URL:
|
|
78
|
-
Project-URL: Repository, https://github.com/your-org/svc-infra
|
|
35
|
+
Provides-Extra: stripe
|
|
36
|
+
Requires-Dist: adyen (>=10.0.0) ; extra == "payments" or extra == "adyen"
|
|
37
|
+
Requires-Dist: aioboto3 (>=12.0.0) ; extra == "s3"
|
|
38
|
+
Requires-Dist: aiofiles (>=24.0.0)
|
|
39
|
+
Requires-Dist: aiosqlite (>=0.19.0) ; extra == "sqlite"
|
|
40
|
+
Requires-Dist: alembic (>=1.13.0)
|
|
41
|
+
Requires-Dist: asyncpg (>=0.29.0) ; extra == "pg"
|
|
42
|
+
Requires-Dist: authlib (>=1.0.0)
|
|
43
|
+
Requires-Dist: cashews[redis] (>=7.0)
|
|
44
|
+
Requires-Dist: duckdb (>=0.10.0) ; extra == "duckdb"
|
|
45
|
+
Requires-Dist: email-validator (>=2.0.0)
|
|
46
|
+
Requires-Dist: fastapi (>=0.110.0)
|
|
47
|
+
Requires-Dist: fastapi-users-db-sqlalchemy (>=7.0.0)
|
|
48
|
+
Requires-Dist: fastapi-users[oauth] (>=14.0.0)
|
|
49
|
+
Requires-Dist: greenlet (>=3.0)
|
|
50
|
+
Requires-Dist: httpx (>=0.25.0)
|
|
51
|
+
Requires-Dist: httpx-oauth (>=0.15.0)
|
|
52
|
+
Requires-Dist: itsdangerous (>=2.0.0)
|
|
53
|
+
Requires-Dist: mcp (>=1.0.0)
|
|
54
|
+
Requires-Dist: motor (>=3.0.0) ; extra == "mongodb"
|
|
55
|
+
Requires-Dist: mysqlclient (>=2.2.0) ; extra == "mysql"
|
|
56
|
+
Requires-Dist: opentelemetry-exporter-otlp (>=1.20.0)
|
|
57
|
+
Requires-Dist: opentelemetry-instrumentation-fastapi (>=0.41b0)
|
|
58
|
+
Requires-Dist: opentelemetry-instrumentation-httpx (>=0.41b0)
|
|
59
|
+
Requires-Dist: opentelemetry-instrumentation-requests (>=0.41b0)
|
|
60
|
+
Requires-Dist: opentelemetry-instrumentation-sqlalchemy (>=0.41b0)
|
|
61
|
+
Requires-Dist: opentelemetry-propagator-b3 (>=1.20.0)
|
|
62
|
+
Requires-Dist: opentelemetry-sdk (>=1.20.0)
|
|
63
|
+
Requires-Dist: passlib[bcrypt] (>=1.7.4)
|
|
64
|
+
Requires-Dist: prometheus-client (>=0.18.0) ; extra == "metrics"
|
|
65
|
+
Requires-Dist: psycopg2-binary (>=2.9.0) ; extra == "pg2"
|
|
66
|
+
Requires-Dist: psycopg[binary] (>=3.0) ; extra == "pg"
|
|
67
|
+
Requires-Dist: pydantic-settings (>=2.0)
|
|
68
|
+
Requires-Dist: pymysql (>=1.1.0) ; extra == "mysql"
|
|
69
|
+
Requires-Dist: pyodbc (>=5.0.0) ; extra == "mssql"
|
|
70
|
+
Requires-Dist: pyotp (>=2.9.0)
|
|
71
|
+
Requires-Dist: python-dotenv (>=1.0.0)
|
|
72
|
+
Requires-Dist: redis (>=5.0.0)
|
|
73
|
+
Requires-Dist: redshift-connector (>=2.0.0) ; extra == "redshift"
|
|
74
|
+
Requires-Dist: snowflake-connector-python (>=3.0.0) ; extra == "snowflake"
|
|
75
|
+
Requires-Dist: sqlalchemy[asyncio] (>=2.0)
|
|
76
|
+
Requires-Dist: stripe (>=7.0.0) ; extra == "payments" or extra == "stripe"
|
|
77
|
+
Requires-Dist: typer (>=0.12.0)
|
|
78
|
+
Requires-Dist: websockets (>=12.0)
|
|
79
|
+
Project-URL: Documentation, https://nfrax.com/svc-infra
|
|
80
|
+
Project-URL: Homepage, https://github.com/nfraxlab/svc-infra
|
|
81
|
+
Project-URL: Issues, https://github.com/nfraxlab/svc-infra/issues
|
|
82
|
+
Project-URL: Repository, https://github.com/nfraxlab/svc-infra
|
|
79
83
|
Description-Content-Type: text/markdown
|
|
80
84
|
|
|
81
85
|
<div align="center">
|
|
82
86
|
|
|
83
87
|
# svc-infra
|
|
84
88
|
|
|
85
|
-
|
|
89
|
+
[](CHANGELOG.md)
|
|
90
|
+
[](https://github.com/nfraxlab/svc-infra/actions/workflows/ci.yml)
|
|
91
|
+
[](https://pypi.org/project/svc-infra/)
|
|
92
|
+
[](https://pypi.org/project/svc-infra/)
|
|
93
|
+
[](LICENSE)
|
|
94
|
+
[](https://pypi.org/project/svc-infra/)
|
|
95
|
+
[](https://codecov.io/gh/nfraxlab/svc-infra)
|
|
86
96
|
|
|
87
|
-
|
|
97
|
+
### Production-ready FastAPI infrastructure in one import
|
|
88
98
|
|
|
89
99
|
**Stop rebuilding auth, billing, webhooks, and background jobs for every project.**
|
|
90
100
|
|
|
91
|
-
[Documentation](docs/) · [Examples](examples/) · [PyPI](https://pypi.org/project/svc-infra/)
|
|
101
|
+
[Documentation](docs/) · [Examples](examples/) · [PyPI](https://pypi.org/project/svc-infra/) · [Changelog](CHANGELOG.md)
|
|
92
102
|
|
|
93
103
|
</div>
|
|
94
104
|
|
|
@@ -316,7 +326,7 @@ See the [Environment Reference](docs/environment.md) for all options.
|
|
|
316
326
|
See all features working together:
|
|
317
327
|
|
|
318
328
|
```bash
|
|
319
|
-
git clone https://github.com/
|
|
329
|
+
git clone https://github.com/nfraxlab/svc-infra.git
|
|
320
330
|
cd svc-infra
|
|
321
331
|
|
|
322
332
|
# Setup and run
|
|
@@ -332,9 +342,9 @@ svc-infra is part of the **nfrax** infrastructure suite:
|
|
|
332
342
|
|
|
333
343
|
| Package | Purpose |
|
|
334
344
|
|---------|---------|
|
|
335
|
-
| **[svc-infra](https://github.com/
|
|
336
|
-
| **[ai-infra](https://github.com/
|
|
337
|
-
| **[fin-infra](https://github.com/
|
|
345
|
+
| **[svc-infra](https://github.com/nfraxlab/svc-infra)** | Backend infrastructure (auth, billing, jobs, webhooks) |
|
|
346
|
+
| **[ai-infra](https://github.com/nfraxlab/ai-infra)** | AI/LLM infrastructure (agents, tools, RAG, MCP) |
|
|
347
|
+
| **[fin-infra](https://github.com/nfraxlab/fin-infra)** | Financial infrastructure (banking, portfolio, insights) |
|
|
338
348
|
|
|
339
349
|
## 📄 License
|
|
340
350
|
|
|
@@ -344,9 +354,9 @@ MIT License - use it for anything.
|
|
|
344
354
|
|
|
345
355
|
<div align="center">
|
|
346
356
|
|
|
347
|
-
**Built with ❤️ by [
|
|
357
|
+
**Built with ❤️ by [nfraxlab](https://github.com/nfraxlab)**
|
|
348
358
|
|
|
349
|
-
[⭐ Star us on GitHub](https://github.com/
|
|
359
|
+
[⭐ Star us on GitHub](https://github.com/nfraxlab/svc-infra) · [📦 View on PyPI](https://pypi.org/project/svc-infra/)
|
|
350
360
|
|
|
351
361
|
</div>
|
|
352
362
|
|
|
@@ -2,13 +2,19 @@
|
|
|
2
2
|
|
|
3
3
|
# svc-infra
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
[](CHANGELOG.md)
|
|
6
|
+
[](https://github.com/nfraxlab/svc-infra/actions/workflows/ci.yml)
|
|
7
|
+
[](https://pypi.org/project/svc-infra/)
|
|
8
|
+
[](https://pypi.org/project/svc-infra/)
|
|
9
|
+
[](LICENSE)
|
|
10
|
+
[](https://pypi.org/project/svc-infra/)
|
|
11
|
+
[](https://codecov.io/gh/nfraxlab/svc-infra)
|
|
6
12
|
|
|
7
|
-
|
|
13
|
+
### Production-ready FastAPI infrastructure in one import
|
|
8
14
|
|
|
9
15
|
**Stop rebuilding auth, billing, webhooks, and background jobs for every project.**
|
|
10
16
|
|
|
11
|
-
[Documentation](docs/) · [Examples](examples/) · [PyPI](https://pypi.org/project/svc-infra/)
|
|
17
|
+
[Documentation](docs/) · [Examples](examples/) · [PyPI](https://pypi.org/project/svc-infra/) · [Changelog](CHANGELOG.md)
|
|
12
18
|
|
|
13
19
|
</div>
|
|
14
20
|
|
|
@@ -236,7 +242,7 @@ See the [Environment Reference](docs/environment.md) for all options.
|
|
|
236
242
|
See all features working together:
|
|
237
243
|
|
|
238
244
|
```bash
|
|
239
|
-
git clone https://github.com/
|
|
245
|
+
git clone https://github.com/nfraxlab/svc-infra.git
|
|
240
246
|
cd svc-infra
|
|
241
247
|
|
|
242
248
|
# Setup and run
|
|
@@ -252,9 +258,9 @@ svc-infra is part of the **nfrax** infrastructure suite:
|
|
|
252
258
|
|
|
253
259
|
| Package | Purpose |
|
|
254
260
|
|---------|---------|
|
|
255
|
-
| **[svc-infra](https://github.com/
|
|
256
|
-
| **[ai-infra](https://github.com/
|
|
257
|
-
| **[fin-infra](https://github.com/
|
|
261
|
+
| **[svc-infra](https://github.com/nfraxlab/svc-infra)** | Backend infrastructure (auth, billing, jobs, webhooks) |
|
|
262
|
+
| **[ai-infra](https://github.com/nfraxlab/ai-infra)** | AI/LLM infrastructure (agents, tools, RAG, MCP) |
|
|
263
|
+
| **[fin-infra](https://github.com/nfraxlab/fin-infra)** | Financial infrastructure (banking, portfolio, insights) |
|
|
258
264
|
|
|
259
265
|
## 📄 License
|
|
260
266
|
|
|
@@ -264,8 +270,8 @@ MIT License - use it for anything.
|
|
|
264
270
|
|
|
265
271
|
<div align="center">
|
|
266
272
|
|
|
267
|
-
**Built with ❤️ by [
|
|
273
|
+
**Built with ❤️ by [nfraxlab](https://github.com/nfraxlab)**
|
|
268
274
|
|
|
269
|
-
[⭐ Star us on GitHub](https://github.com/
|
|
275
|
+
[⭐ Star us on GitHub](https://github.com/nfraxlab/svc-infra) · [📦 View on PyPI](https://pypi.org/project/svc-infra/)
|
|
270
276
|
|
|
271
277
|
</div>
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
[tool.poetry]
|
|
2
|
+
name = "svc-infra"
|
|
3
|
+
version = "1.0.5"
|
|
4
|
+
description = "Infrastructure for building and deploying prod-ready services"
|
|
5
|
+
authors = ["Ali Khatami <aliikhatami94@gmail.com>"]
|
|
6
|
+
license = "MIT"
|
|
7
|
+
readme = "README.md"
|
|
8
|
+
packages = [{ include = "svc_infra", from = "src" }]
|
|
9
|
+
keywords = ["fastapi", "sqlalchemy", "alembic", "auth", "infra", "async", "pydantic"]
|
|
10
|
+
include = [
|
|
11
|
+
"src/svc_infra/py.typed",
|
|
12
|
+
"src/svc_infra/db/templates/**/*",
|
|
13
|
+
"src/svc_infra/obs/templates/**/*",
|
|
14
|
+
"src/svc_infra/obs/grafana/templates/**/*",
|
|
15
|
+
"src/svc_infra/obs/grafana/dashboards/**/*",
|
|
16
|
+
"src/svc_infra/docs/**/*"
|
|
17
|
+
]
|
|
18
|
+
|
|
19
|
+
classifiers = [
|
|
20
|
+
"Development Status :: 5 - Production/Stable",
|
|
21
|
+
"Intended Audience :: Developers",
|
|
22
|
+
"License :: OSI Approved :: MIT License",
|
|
23
|
+
"Programming Language :: Python :: 3",
|
|
24
|
+
"Programming Language :: Python :: 3 :: Only",
|
|
25
|
+
"Programming Language :: Python :: 3.11",
|
|
26
|
+
"Programming Language :: Python :: 3.12",
|
|
27
|
+
"Programming Language :: Python :: 3.13",
|
|
28
|
+
"Topic :: Internet :: WWW/HTTP :: HTTP Servers",
|
|
29
|
+
"Topic :: Software Development :: Libraries :: Python Modules",
|
|
30
|
+
"Framework :: FastAPI",
|
|
31
|
+
"Typing :: Typed"
|
|
32
|
+
]
|
|
33
|
+
|
|
34
|
+
[tool.poetry.urls]
|
|
35
|
+
Homepage = "https://github.com/nfraxlab/svc-infra"
|
|
36
|
+
Repository = "https://github.com/nfraxlab/svc-infra"
|
|
37
|
+
Issues = "https://github.com/nfraxlab/svc-infra/issues"
|
|
38
|
+
Documentation = "https://nfrax.com/svc-infra"
|
|
39
|
+
|
|
40
|
+
[tool.poetry.dependencies]
|
|
41
|
+
python = ">=3.11,<4.0"
|
|
42
|
+
|
|
43
|
+
# Core
|
|
44
|
+
fastapi = ">=0.110.0"
|
|
45
|
+
pydantic-settings = ">=2.0"
|
|
46
|
+
python-dotenv = ">=1.0.0"
|
|
47
|
+
typer = ">=0.12.0"
|
|
48
|
+
httpx = ">=0.25.0"
|
|
49
|
+
|
|
50
|
+
# DB + auth
|
|
51
|
+
sqlalchemy = { extras = ["asyncio"], version = ">=2.0" }
|
|
52
|
+
alembic = ">=1.13.0"
|
|
53
|
+
greenlet = ">=3.0"
|
|
54
|
+
fastapi-users = { extras = ["oauth"], version = ">=14.0.0" }
|
|
55
|
+
fastapi-users-db-sqlalchemy = ">=7.0.0"
|
|
56
|
+
authlib = ">=1.0.0"
|
|
57
|
+
httpx-oauth = ">=0.15.0"
|
|
58
|
+
passlib = { extras = ["bcrypt"], version = ">=1.7.4" }
|
|
59
|
+
email-validator = ">=2.0.0"
|
|
60
|
+
|
|
61
|
+
# Database drivers (all optional)
|
|
62
|
+
psycopg = {extras = ["binary"], version = ">=3.0"} # v3
|
|
63
|
+
asyncpg = { version = ">=0.29.0", optional = true }
|
|
64
|
+
aiosqlite = { version = ">=0.19.0", optional = true }
|
|
65
|
+
pymysql = { version = ">=1.1.0", optional = true }
|
|
66
|
+
mysqlclient = { version = ">=2.2.0", optional = true }
|
|
67
|
+
pyodbc = { version = ">=5.0.0", optional = true }
|
|
68
|
+
snowflake-connector-python = { version = ">=3.0.0", optional = true }
|
|
69
|
+
redshift-connector = { version = ">=2.0.0", optional = true }
|
|
70
|
+
duckdb = { version = ">=0.10.0", optional = true }
|
|
71
|
+
|
|
72
|
+
# Storage
|
|
73
|
+
aiofiles = ">=24.0.0"
|
|
74
|
+
aioboto3 = { version = ">=12.0.0", optional = true }
|
|
75
|
+
|
|
76
|
+
# Other infra deps
|
|
77
|
+
mcp = ">=1.0.0"
|
|
78
|
+
opentelemetry-sdk = ">=1.20.0"
|
|
79
|
+
opentelemetry-instrumentation-fastapi = ">=0.41b0"
|
|
80
|
+
opentelemetry-instrumentation-sqlalchemy = ">=0.41b0"
|
|
81
|
+
opentelemetry-instrumentation-requests = ">=0.41b0"
|
|
82
|
+
opentelemetry-instrumentation-httpx = ">=0.41b0"
|
|
83
|
+
opentelemetry-exporter-otlp = ">=1.20.0"
|
|
84
|
+
opentelemetry-propagator-b3 = ">=1.20.0"
|
|
85
|
+
prometheus-client = ">=0.18.0"
|
|
86
|
+
redis = ">=5.0.0"
|
|
87
|
+
cashews = {extras = ["redis"], version = ">=7.0"}
|
|
88
|
+
itsdangerous = ">=2.0.0"
|
|
89
|
+
pyotp = ">=2.9.0"
|
|
90
|
+
websockets = ">=12.0"
|
|
91
|
+
|
|
92
|
+
# Optional dependencies (install via extras)
|
|
93
|
+
motor = { version = ">=3.0.0", optional = true }
|
|
94
|
+
stripe = { version = ">=7.0.0", optional = true }
|
|
95
|
+
adyen = { version = ">=10.0.0", optional = true }
|
|
96
|
+
psycopg2-binary = { version = ">=2.9.0", optional = true }
|
|
97
|
+
|
|
98
|
+
[tool.poetry.extras]
|
|
99
|
+
# Postgres v3 (recommended)
|
|
100
|
+
pg = ["psycopg", "asyncpg"]
|
|
101
|
+
# Postgres v2 (legacy compatibility)
|
|
102
|
+
pg2 = ["psycopg2-binary"]
|
|
103
|
+
sqlite = ["aiosqlite"]
|
|
104
|
+
mysql = ["pymysql", "mysqlclient"]
|
|
105
|
+
# Payment providers
|
|
106
|
+
payments = ["stripe", "adyen"]
|
|
107
|
+
stripe = ["stripe"]
|
|
108
|
+
adyen = ["adyen"]
|
|
109
|
+
# MongoDB
|
|
110
|
+
mongodb = ["motor"]
|
|
111
|
+
mssql = ["pyodbc"]
|
|
112
|
+
snowflake = ["snowflake-connector-python"]
|
|
113
|
+
redshift = ["redshift-connector"]
|
|
114
|
+
duckdb = ["duckdb"]
|
|
115
|
+
metrics = ["prometheus-client"]
|
|
116
|
+
s3 = ["aioboto3"]
|
|
117
|
+
|
|
118
|
+
[tool.poetry.group.dev.dependencies]
|
|
119
|
+
pytest = ">=8.0.0"
|
|
120
|
+
pytest-asyncio = ">=0.23.0"
|
|
121
|
+
pytest-cov = ">=4.0.0"
|
|
122
|
+
ruff = ">=0.6.0"
|
|
123
|
+
mypy = ">=1.10.0"
|
|
124
|
+
types-requests = ">=2.31.0"
|
|
125
|
+
pytest-mock = ">=3.12.0"
|
|
126
|
+
httpx = ">=0.25.0"
|
|
127
|
+
fakeredis = ">=2.20.0"
|
|
128
|
+
moto = {extras = ["s3"], version = ">=5.0.0"}
|
|
129
|
+
aiosqlite = ">=0.19.0" # Required for acceptance tests using SQLite
|
|
130
|
+
pre-commit = ">=3.0.0"
|
|
131
|
+
bandit = ">=1.7.0"
|
|
132
|
+
# Documentation
|
|
133
|
+
mkdocs = ">=1.6.0"
|
|
134
|
+
mkdocs-material = ">=9.5.0"
|
|
135
|
+
mkdocstrings = {extras = ["python"], version = ">=0.25.0"}
|
|
136
|
+
|
|
137
|
+
[tool.poetry.scripts]
|
|
138
|
+
svc-infra = "svc_infra.cli:main"
|
|
139
|
+
|
|
140
|
+
[tool.pytest.ini_options]
|
|
141
|
+
testpaths = ["tests"]
|
|
142
|
+
python_files = ["test_*.py", "*_test.py"]
|
|
143
|
+
python_classes = ["Test*",]
|
|
144
|
+
python_functions = ["test_*"]
|
|
145
|
+
markers = [
|
|
146
|
+
"acceptance: End-to-end acceptance tests running against the acceptance app or BASE_URL",
|
|
147
|
+
"unit: Unit tests",
|
|
148
|
+
"security: Security and auth hardening tests",
|
|
149
|
+
"ratelimit: Rate limiting and abuse protection tests",
|
|
150
|
+
"concurrency: Idempotency and concurrency control tests",
|
|
151
|
+
"jobs: Background jobs and scheduling tests",
|
|
152
|
+
"webhooks: Webhooks framework tests",
|
|
153
|
+
"billing: Billing primitives tests",
|
|
154
|
+
"tenancy: Tenancy isolation and enforcement tests",
|
|
155
|
+
"data_lifecycle: Data lifecycle (fixtures, retention, erasure, backups)",
|
|
156
|
+
"ops: SLOs & Ops tests (probes, breaker, instrumentation)",
|
|
157
|
+
"dx: Developer experience and quality gates tests",
|
|
158
|
+
"admin: Admin scope and impersonation tests",
|
|
159
|
+
"storage: File storage system tests",
|
|
160
|
+
]
|
|
161
|
+
filterwarnings = [
|
|
162
|
+
"ignore:The `route` decorator is deprecated:DeprecationWarning:starlette.*",
|
|
163
|
+
]
|
|
164
|
+
|
|
165
|
+
[tool.ruff]
|
|
166
|
+
line-length = 100
|
|
167
|
+
target-version = "py311"
|
|
168
|
+
|
|
169
|
+
[tool.ruff.lint]
|
|
170
|
+
select = [
|
|
171
|
+
"E", # pycodestyle errors
|
|
172
|
+
"W", # pycodestyle warnings
|
|
173
|
+
"F", # Pyflakes
|
|
174
|
+
"I", # isort
|
|
175
|
+
"B", # flake8-bugbear
|
|
176
|
+
"C4", # flake8-comprehensions
|
|
177
|
+
"UP", # pyupgrade
|
|
178
|
+
"SIM", # flake8-simplify
|
|
179
|
+
"RUF", # Ruff-specific rules
|
|
180
|
+
]
|
|
181
|
+
|
|
182
|
+
ignore = [
|
|
183
|
+
"E501", # line too long (handled by formatter)
|
|
184
|
+
"RUF022", # __all__ not sorted (we use logical grouping)
|
|
185
|
+
"RUF012", # mutable class attrs (handled by dataclass/pydantic)
|
|
186
|
+
"B007", # unused loop variable (often intentional)
|
|
187
|
+
"B008", # function call in default arg (typer.Option pattern)
|
|
188
|
+
"B027", # empty method in ABC (intentional for optional callbacks)
|
|
189
|
+
"B904", # raise from err (not always clearer)
|
|
190
|
+
"B905", # zip strict (Python 3.10+ only, adds verbosity)
|
|
191
|
+
"SIM102", # nested if statements (sometimes clearer)
|
|
192
|
+
"SIM103", # return condition directly (sometimes clearer with if)
|
|
193
|
+
"SIM105", # contextlib.suppress (explicit try/except often clearer)
|
|
194
|
+
"SIM108", # ternary operator (readability preference)
|
|
195
|
+
"SIM110", # use all() (sometimes clearer with explicit loop)
|
|
196
|
+
"SIM113", # use enumerate (sometimes clearer without)
|
|
197
|
+
"SIM115", # context manager for files (not always applicable)
|
|
198
|
+
"SIM117", # single with statement (sometimes clearer separate)
|
|
199
|
+
"SIM118", # key in dict vs dict.keys() (minor)
|
|
200
|
+
"UP028", # yield from (sometimes clearer with explicit yield)
|
|
201
|
+
"UP038", # isinstance(x, (A, B)) - deprecated rule, requires unsafe fixes
|
|
202
|
+
"RUF001", # ambiguous unicode char in string (intentional in docs)
|
|
203
|
+
"RUF002", # ambiguous unicode char in docstring (intentional curly quotes)
|
|
204
|
+
"RUF003", # ambiguous unicode char in comment (intentional curly quotes)
|
|
205
|
+
"B023", # function uses loop variable (often intentional in closures)
|
|
206
|
+
"B039", # contextvar default mutable (handled by contextvar)
|
|
207
|
+
]
|
|
208
|
+
|
|
209
|
+
[tool.ruff.lint.per-file-ignores]
|
|
210
|
+
"tests/**/*.py" = [
|
|
211
|
+
"B018", # useless expression in tests is fine
|
|
212
|
+
]
|
|
213
|
+
|
|
214
|
+
[tool.ruff.lint.isort]
|
|
215
|
+
known-first-party = ["svc_infra"]
|
|
216
|
+
|
|
217
|
+
[tool.ruff.lint.pydocstyle]
|
|
218
|
+
convention = "google"
|
|
219
|
+
|
|
220
|
+
[tool.bandit]
|
|
221
|
+
exclude_dirs = ["tests", ".venv", "venv"]
|
|
222
|
+
skips = [
|
|
223
|
+
"B101", # assert used (intentional in tests and contracts)
|
|
224
|
+
"B104", # hardcoded_bind_all_interfaces (intentional for container deployments)
|
|
225
|
+
"B310", # urllib urlopen (URL is validated/trusted in our code)
|
|
226
|
+
"B311", # random for non-crypto (intentional)
|
|
227
|
+
"B324", # SHA1/MD5 hash - used for cache keys and HIBP API, not security
|
|
228
|
+
]
|
|
229
|
+
|
|
230
|
+
[tool.coverage.run]
|
|
231
|
+
source = ["src/svc_infra"]
|
|
232
|
+
branch = true
|
|
233
|
+
omit = ["*/tests/*", "*/__pycache__/*"]
|
|
234
|
+
|
|
235
|
+
[tool.coverage.report]
|
|
236
|
+
exclude_lines = ["pragma: no cover", "if TYPE_CHECKING:", "raise NotImplementedError"]
|
|
237
|
+
fail_under = 70
|
|
238
|
+
show_missing = true
|
|
239
|
+
|
|
240
|
+
[build-system]
|
|
241
|
+
requires = ["poetry-core>=2.0.0,<3.0.0"]
|
|
242
|
+
build-backend = "poetry.core.masonry.api"
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"""svc-infra: Service Infrastructure Toolkit.
|
|
2
|
+
|
|
3
|
+
A comprehensive backend infrastructure library providing:
|
|
4
|
+
- API framework (FastAPI scaffolding, dual routers, auth)
|
|
5
|
+
- Database (SQL/Mongo, migrations, repositories)
|
|
6
|
+
- Caching (Redis, decorators)
|
|
7
|
+
- Jobs (background tasks, queues)
|
|
8
|
+
- Webhooks (delivery, subscriptions)
|
|
9
|
+
- Billing (Stripe/Adyen integration)
|
|
10
|
+
- Observability (logging, metrics)
|
|
11
|
+
|
|
12
|
+
Example:
|
|
13
|
+
from svc_infra.api.fastapi import easy_service_app
|
|
14
|
+
from svc_infra.api.fastapi.auth import add_auth_users
|
|
15
|
+
|
|
16
|
+
app = easy_service_app(name="MyAPI")
|
|
17
|
+
add_auth_users(app)
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
from __future__ import annotations
|
|
21
|
+
|
|
22
|
+
# Core modules (lazy import pattern for optional dependencies)
|
|
23
|
+
from . import api, app, cache, db, jobs, webhooks
|
|
24
|
+
|
|
25
|
+
# Base exception
|
|
26
|
+
from .exceptions import SvcInfraError
|
|
27
|
+
|
|
28
|
+
# Content Loaders
|
|
29
|
+
from .loaders import (
|
|
30
|
+
BaseLoader,
|
|
31
|
+
GitHubLoader,
|
|
32
|
+
LoadedContent,
|
|
33
|
+
URLLoader,
|
|
34
|
+
load_github,
|
|
35
|
+
load_github_sync,
|
|
36
|
+
load_url,
|
|
37
|
+
load_url_sync,
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
__all__ = [
|
|
41
|
+
# Core modules
|
|
42
|
+
"api",
|
|
43
|
+
"app",
|
|
44
|
+
"cache",
|
|
45
|
+
"db",
|
|
46
|
+
"jobs",
|
|
47
|
+
"webhooks",
|
|
48
|
+
# Base exception
|
|
49
|
+
"SvcInfraError",
|
|
50
|
+
# Loaders
|
|
51
|
+
"BaseLoader",
|
|
52
|
+
"GitHubLoader",
|
|
53
|
+
"LoadedContent",
|
|
54
|
+
"URLLoader",
|
|
55
|
+
"load_github",
|
|
56
|
+
"load_github_sync",
|
|
57
|
+
"load_url",
|
|
58
|
+
"load_url_sync",
|
|
59
|
+
]
|