svc-infra 0.1.704__tar.gz → 1.6.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of svc-infra might be problematic. Click here for more details.
- {svc_infra-0.1.704 → svc_infra-1.6.1}/PKG-INFO +59 -47
- {svc_infra-0.1.704 → svc_infra-1.6.1}/README.md +44 -38
- {svc_infra-0.1.704 → svc_infra-1.6.1}/pyproject.toml +120 -12
- svc_infra-1.6.1/src/svc_infra/__init__.py +59 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/apf_payments/README.md +9 -9
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/apf_payments/models.py +47 -108
- svc_infra-1.6.1/src/svc_infra/apf_payments/provider/__init__.py +4 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/apf_payments/provider/aiydan.py +42 -100
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/apf_payments/provider/base.py +10 -26
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/apf_payments/provider/registry.py +3 -5
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/apf_payments/provider/stripe.py +63 -135
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/apf_payments/schemas.py +82 -90
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/apf_payments/service.py +40 -86
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/apf_payments/settings.py +10 -13
- svc_infra-1.6.1/src/svc_infra/api/__init__.py +61 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/__init__.py +19 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/admin/add.py +13 -18
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/apf_payments/router.py +47 -84
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/apf_payments/setup.py +7 -13
- svc_infra-1.6.1/src/svc_infra/api/fastapi/auth/__init__.py +65 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/auth/_cookies.py +3 -9
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/auth/add.py +4 -8
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/auth/gaurd.py +9 -26
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/auth/mfa/models.py +4 -7
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/auth/mfa/pre_auth.py +3 -3
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/auth/mfa/router.py +9 -15
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/auth/mfa/security.py +3 -5
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/auth/mfa/utils.py +3 -2
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/auth/mfa/verify.py +2 -9
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/auth/policy.py +16 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/auth/providers.py +4 -6
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/auth/routers/apikey_router.py +16 -18
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/auth/routers/oauth_router.py +37 -85
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/auth/routers/session_router.py +3 -6
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/auth/security.py +17 -28
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/auth/sender.py +1 -3
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/auth/settings.py +18 -19
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/auth/state.py +6 -7
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/auth/ws_security.py +2 -2
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/billing/router.py +6 -8
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/db/http.py +10 -11
- svc_infra-1.6.1/src/svc_infra/api/fastapi/db/nosql/__init__.py +46 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/db/nosql/mongo/add.py +5 -15
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/db/nosql/mongo/crud_router.py +22 -16
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/db/sql/README.md +1 -1
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/db/sql/add.py +6 -14
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/db/sql/crud_router.py +27 -40
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/db/sql/health.py +1 -3
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/db/sql/session.py +4 -5
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/db/sql/users.py +8 -11
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/dependencies/ratelimit.py +4 -6
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/docs/add.py +13 -23
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/docs/landing.py +6 -8
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/docs/scoped.py +34 -42
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/dual/dualize.py +1 -1
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/dual/protected.py +12 -21
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/dual/router.py +14 -31
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/ease.py +57 -13
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/http/conditional.py +3 -5
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/middleware/errors/catchall.py +2 -6
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/middleware/errors/exceptions.py +1 -4
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/middleware/errors/handlers.py +12 -18
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/middleware/graceful_shutdown.py +4 -13
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/middleware/idempotency.py +11 -16
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/middleware/idempotency_store.py +14 -14
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/middleware/optimistic_lock.py +5 -8
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/middleware/ratelimit.py +8 -8
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/middleware/ratelimit_store.py +7 -8
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/middleware/request_id.py +1 -3
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/middleware/timeout.py +9 -10
- svc_infra-1.6.1/src/svc_infra/api/fastapi/object_router.py +1060 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/openapi/apply.py +5 -6
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/openapi/conventions.py +4 -4
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/openapi/models.py +6 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/openapi/mutators.py +13 -31
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/openapi/pipeline.py +2 -2
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/openapi/responses.py +4 -6
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/openapi/security.py +1 -3
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/ops/add.py +7 -9
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/pagination.py +25 -37
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/routers/__init__.py +16 -38
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/setup.py +13 -31
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/tenancy/add.py +3 -2
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/tenancy/context.py +8 -7
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/versioned.py +3 -2
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/app/env.py +5 -7
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/app/logging/add.py +2 -1
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/app/logging/filter.py +1 -1
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/app/logging/formats.py +3 -2
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/app/root.py +3 -3
- svc_infra-1.6.1/src/svc_infra/billing/__init__.py +40 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/billing/async_service.py +50 -7
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/billing/jobs.py +23 -33
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/billing/models.py +21 -52
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/billing/quotas.py +5 -7
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/billing/schemas.py +4 -6
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cache/README.md +32 -32
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cache/__init__.py +12 -5
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cache/add.py +6 -9
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cache/backend.py +6 -5
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cache/decorators.py +17 -28
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cache/keys.py +2 -2
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cache/recache.py +22 -35
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cache/resources.py +8 -16
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cache/ttl.py +2 -3
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cache/utils.py +7 -6
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cli/__init__.py +4 -12
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cli/cmds/__init__.py +22 -1
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cli/cmds/db/nosql/mongo/README.md +2 -2
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cli/cmds/db/nosql/mongo/mongo_cmds.py +11 -10
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cli/cmds/db/nosql/mongo/mongo_scaffold_cmds.py +6 -9
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cli/cmds/db/ops_cmds.py +3 -6
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cli/cmds/db/sql/alembic_cmds.py +24 -41
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cli/cmds/db/sql/sql_export_cmds.py +9 -17
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cli/cmds/db/sql/sql_scaffold_cmds.py +10 -10
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cli/cmds/docs/docs_cmds.py +7 -10
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cli/cmds/dx/dx_cmds.py +5 -11
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cli/cmds/jobs/jobs_cmds.py +2 -7
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cli/cmds/obs/obs_cmds.py +4 -7
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cli/cmds/sdk/sdk_cmds.py +5 -15
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cli/foundation/runner.py +6 -11
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cli/foundation/typer_bootstrap.py +1 -2
- svc_infra-1.6.1/src/svc_infra/data/__init__.py +83 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/data/add.py +5 -5
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/data/backup.py +8 -10
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/data/erasure.py +3 -2
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/data/fixtures.py +3 -3
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/data/retention.py +8 -13
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/crud_schema.py +9 -8
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/nosql/__init__.py +2 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/nosql/constants.py +1 -1
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/nosql/core.py +17 -16
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/nosql/indexes.py +11 -10
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/nosql/management.py +3 -3
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/nosql/mongo/client.py +21 -4
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/nosql/mongo/settings.py +2 -6
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/nosql/repository.py +45 -30
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/nosql/resource.py +28 -16
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/nosql/scaffold.py +13 -17
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/nosql/service.py +3 -4
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/nosql/service_with_hooks.py +4 -3
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/nosql/types.py +2 -6
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/nosql/utils.py +4 -4
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/ops.py +14 -18
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/outbox.py +15 -18
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/sql/apikey.py +12 -21
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/sql/authref.py +3 -7
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/sql/constants.py +9 -9
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/sql/core.py +11 -11
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/sql/management.py +2 -6
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/sql/repository.py +17 -24
- svc_infra-1.6.1/src/svc_infra/db/sql/resource.py +56 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/sql/scaffold.py +13 -17
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/sql/service.py +7 -16
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/sql/service_with_hooks.py +4 -3
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/sql/tenant.py +6 -14
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/sql/uniq.py +8 -7
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/sql/uniq_hooks.py +14 -19
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/sql/utils.py +24 -53
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/utils.py +3 -3
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/deploy/__init__.py +10 -15
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/documents/add.py +7 -8
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/documents/ease.py +8 -8
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/documents/models.py +3 -3
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/documents/storage.py +11 -13
- svc_infra-1.6.1/src/svc_infra/dx/__init__.py +58 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/dx/add.py +1 -3
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/dx/changelog.py +2 -2
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/dx/checks.py +1 -1
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/health/__init__.py +15 -16
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/http/client.py +10 -14
- svc_infra-1.6.1/src/svc_infra/jobs/__init__.py +79 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/jobs/builtins/outbox_processor.py +3 -5
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/jobs/builtins/webhook_delivery.py +1 -3
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/jobs/loader.py +4 -5
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/jobs/queue.py +20 -24
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/jobs/redis_queue.py +20 -34
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/jobs/runner.py +7 -11
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/jobs/scheduler.py +5 -5
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/jobs/worker.py +1 -1
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/loaders/base.py +5 -4
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/loaders/github.py +1 -3
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/loaders/url.py +3 -9
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/logging/__init__.py +7 -6
- svc_infra-1.6.1/src/svc_infra/mcp/__init__.py +82 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/mcp/svc_infra_mcp.py +2 -2
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/README.md +1 -1
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/add.py +4 -3
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/cloud_dash.py +3 -1
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/metrics/__init__.py +3 -3
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/metrics/asgi.py +9 -14
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/metrics/base.py +13 -13
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/metrics/http.py +5 -9
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/metrics/sqlalchemy.py +9 -12
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/metrics.py +3 -3
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/settings.py +2 -6
- svc_infra-1.6.1/src/svc_infra/resilience/__init__.py +44 -0
- svc_infra-1.6.1/src/svc_infra/resilience/circuit_breaker.py +328 -0
- svc_infra-1.6.1/src/svc_infra/resilience/retry.py +289 -0
- svc_infra-1.6.1/src/svc_infra/security/__init__.py +167 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/security/add.py +5 -9
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/security/audit.py +14 -17
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/security/audit_service.py +9 -9
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/security/hibp.py +5 -6
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/security/jwt_rotation.py +7 -10
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/security/lockout.py +12 -11
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/security/models.py +37 -46
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/security/oauth_models.py +10 -16
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/security/org_invites.py +11 -13
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/security/passwords.py +4 -6
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/security/permissions.py +8 -7
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/security/session.py +6 -7
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/security/signed_cookies.py +9 -9
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/storage/add.py +5 -8
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/storage/backends/local.py +13 -21
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/storage/backends/memory.py +4 -7
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/storage/backends/s3.py +17 -36
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/storage/base.py +2 -2
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/storage/easy.py +4 -8
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/storage/settings.py +16 -18
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/testing/__init__.py +36 -39
- svc_infra-1.6.1/src/svc_infra/utils.py +188 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/webhooks/__init__.py +3 -13
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/webhooks/add.py +17 -29
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/webhooks/encryption.py +2 -2
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/webhooks/fastapi.py +2 -4
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/webhooks/router.py +3 -3
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/webhooks/service.py +28 -6
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/webhooks/signing.py +5 -5
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/websocket/add.py +2 -3
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/websocket/client.py +3 -2
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/websocket/config.py +6 -18
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/websocket/manager.py +9 -10
- svc_infra-0.1.704/src/svc_infra/__init__.py +0 -33
- svc_infra-0.1.704/src/svc_infra/apf_payments/provider/__init__.py +0 -4
- svc_infra-0.1.704/src/svc_infra/api/fastapi/db/nosql/__init__.py +0 -8
- svc_infra-0.1.704/src/svc_infra/billing/__init__.py +0 -23
- svc_infra-0.1.704/src/svc_infra/billing/service.py +0 -123
- svc_infra-0.1.704/src/svc_infra/db/sql/resource.py +0 -41
- svc_infra-0.1.704/src/svc_infra/obs/templates/sidecars/fly/__init__.py +0 -0
- svc_infra-0.1.704/src/svc_infra/obs/templates/sidecars/k8s/__init__.py +0 -0
- svc_infra-0.1.704/src/svc_infra/obs/templates/sidecars/railway/__init__.py +0 -0
- svc_infra-0.1.704/src/svc_infra/utils.py +0 -27
- {svc_infra-0.1.704 → svc_infra-1.6.1}/LICENSE +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/apf_payments/__init__.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/apf_payments/alembic.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/admin/__init__.py +0 -0
- {svc_infra-0.1.704/src/svc_infra/api → svc_infra-1.6.1/src/svc_infra/api/fastapi/apf_payments}/__init__.py +0 -0
- {svc_infra-0.1.704/src/svc_infra/api/fastapi/apf_payments → svc_infra-1.6.1/src/svc_infra/api/fastapi/auth/mfa}/__init__.py +0 -0
- {svc_infra-0.1.704/src/svc_infra/api/fastapi/auth → svc_infra-1.6.1/src/svc_infra/api/fastapi/auth/routers}/__init__.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/auth/routers/account.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/billing/setup.py +0 -0
- {svc_infra-0.1.704/src/svc_infra/api/fastapi/auth/mfa → svc_infra-1.6.1/src/svc_infra/api/fastapi/cache}/__init__.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/cache/add.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/db/__init__.py +0 -0
- {svc_infra-0.1.704/src/svc_infra/api/fastapi/auth/routers → svc_infra-1.6.1/src/svc_infra/api/fastapi/db/nosql/mongo}/__init__.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/db/nosql/mongo/health.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/db/sql/__init__.py +0 -0
- {svc_infra-0.1.704/src/svc_infra/api/fastapi/cache → svc_infra-1.6.1/src/svc_infra/api/fastapi/docs}/__init__.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/dual/__init__.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/dual/public.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/dual/utils.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/dx.py +0 -0
- {svc_infra-0.1.704/src/svc_infra/api/fastapi/db/nosql/mongo → svc_infra-1.6.1/src/svc_infra/api/fastapi/http}/__init__.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/http/concurrency.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/http/deprecation.py +0 -0
- {svc_infra-0.1.704/src/svc_infra/api/fastapi/docs → svc_infra-1.6.1/src/svc_infra/api/fastapi/middleware}/__init__.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/middleware/debug.py +0 -0
- {svc_infra-0.1.704/src/svc_infra/api/fastapi/http → svc_infra-1.6.1/src/svc_infra/api/fastapi/middleware/errors}/__init__.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/middleware/request_size_limit.py +0 -0
- {svc_infra-0.1.704/src/svc_infra/api/fastapi/middleware → svc_infra-1.6.1/src/svc_infra/api/fastapi/openapi}/__init__.py +0 -0
- {svc_infra-0.1.704/src/svc_infra/api/fastapi/middleware/errors → svc_infra-1.6.1/src/svc_infra/api/fastapi/paths}/__init__.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/paths/auth.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/paths/generic.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/paths/prefix.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/paths/user.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/routers/ping.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/app/README.md +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/app/__init__.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/app/logging/__init__.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/bundled_docs/README.md +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/bundled_docs/__init__.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/bundled_docs/getting-started.md +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cache/demo.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cache/tags.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cli/__main__.py +0 -0
- {svc_infra-0.1.704/src/svc_infra/api/fastapi/openapi → svc_infra-1.6.1/src/svc_infra/cli/cmds/db}/__init__.py +0 -0
- {svc_infra-0.1.704/src/svc_infra/api/fastapi/paths → svc_infra-1.6.1/src/svc_infra/cli/cmds/db/nosql}/__init__.py +0 -0
- {svc_infra-0.1.704/src/svc_infra/cli/cmds/db → svc_infra-1.6.1/src/svc_infra/cli/cmds/db/nosql/mongo}/__init__.py +0 -0
- {svc_infra-0.1.704/src/svc_infra/cli/cmds/db/nosql → svc_infra-1.6.1/src/svc_infra/cli/cmds/db/sql}/__init__.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cli/cmds/dx/__init__.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cli/cmds/health/__init__.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cli/cmds/health/health_cmds.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cli/cmds/help.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cli/cmds/jobs/__init__.py +0 -0
- {svc_infra-0.1.704/src/svc_infra/cli/cmds/db/nosql/mongo → svc_infra-1.6.1/src/svc_infra/cli/cmds/obs}/__init__.py +0 -0
- {svc_infra-0.1.704/src/svc_infra/cli/cmds/db/sql → svc_infra-1.6.1/src/svc_infra/cli/cmds/sdk}/__init__.py +0 -0
- {svc_infra-0.1.704/src/svc_infra/cli/cmds/obs → svc_infra-1.6.1/src/svc_infra/cli/foundation}/__init__.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/__init__.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/inbox.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/nosql/base.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/nosql/mongo/README.md +0 -0
- {svc_infra-0.1.704/src/svc_infra/cli/cmds/sdk → svc_infra-1.6.1/src/svc_infra/db/nosql/mongo}/__init__.py +0 -0
- {svc_infra-0.1.704/src/svc_infra/cli/foundation → svc_infra-1.6.1/src/svc_infra/db/nosql/mongo/templates}/__init__.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/nosql/mongo/templates/documents.py.tmpl +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/nosql/mongo/templates/resources.py.tmpl +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/nosql/mongo/templates/schemas.py.tmpl +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/sql/README.md +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/sql/__init__.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/sql/base.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/sql/templates/__init__.py +0 -0
- {svc_infra-0.1.704/src/svc_infra/db/nosql/mongo → svc_infra-1.6.1/src/svc_infra/db/sql/templates/models_schemas}/__init__.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/sql/templates/models_schemas/auth/models.py.tmpl +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/sql/templates/models_schemas/auth/schemas.py.tmpl +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/sql/templates/models_schemas/entity/models.py.tmpl +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/sql/templates/models_schemas/entity/schemas.py.tmpl +0 -0
- {svc_infra-0.1.704/src/svc_infra/db/nosql/mongo/templates → svc_infra-1.6.1/src/svc_infra/db/sql/templates/setup}/__init__.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/sql/templates/setup/alembic.ini.tmpl +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/sql/templates/setup/env_async.py.tmpl +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/sql/templates/setup/env_sync.py.tmpl +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/sql/templates/setup/script.py.mako.tmpl +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/sql/types.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/sql/versioning.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/documents/__init__.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/exceptions.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/http/__init__.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/jobs/easy.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/loaders/__init__.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/loaders/models.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/__init__.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/grafana/dashboards/http-overview.json +0 -0
- {svc_infra-0.1.704/src/svc_infra/db/sql/templates/models_schemas → svc_infra-1.6.1/src/svc_infra/obs/providers}/__init__.py +0 -0
- {svc_infra-0.1.704/src/svc_infra/db/sql/templates/setup → svc_infra-1.6.1/src/svc_infra/obs/providers/compose_cloud}/__init__.py +0 -0
- {svc_infra-0.1.704/src/svc_infra/mcp → svc_infra-1.6.1/src/svc_infra/obs/providers/compose_cloud/templates}/__init__.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/providers/compose_cloud/templates/agent.yaml.tmpl +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/providers/compose_cloud/templates/docker-compose.cloud.yml.tmpl +0 -0
- {svc_infra-0.1.704/src/svc_infra/obs/providers → svc_infra-1.6.1/src/svc_infra/obs/providers/grafana}/__init__.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/providers/grafana/dashboards/00_overview.json +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/providers/grafana/dashboards/10_http.json +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/providers/grafana/dashboards/20_db.json +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/providers/grafana/dashboards/30_runtime.json +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/providers/grafana/dashboards/40_clients.json +0 -0
- {svc_infra-0.1.704/src/svc_infra/obs/providers/compose_cloud → svc_infra-1.6.1/src/svc_infra/obs/providers/grafana/dashboards}/__init__.py +0 -0
- {svc_infra-0.1.704/src/svc_infra/obs/providers/compose_cloud → svc_infra-1.6.1/src/svc_infra/obs/providers/grafana}/templates/__init__.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/providers/grafana/templates/docker-compose.yml.tmpl +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/providers/grafana/templates/prometheus.yml.tmpl +0 -0
- {svc_infra-0.1.704/src/svc_infra/obs/providers/grafana → svc_infra-1.6.1/src/svc_infra/obs/providers/grafana/templates/provisioning}/__init__.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/providers/grafana/templates/provisioning/dashboards.yml +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/providers/grafana/templates/provisioning/datasource.yml +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/templates/grafana_dashboard.json +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/templates/prometheus_rules.yml +0 -0
- {svc_infra-0.1.704/src/svc_infra/obs/providers/grafana/dashboards → svc_infra-1.6.1/src/svc_infra/obs/templates/sidecars}/__init__.py +0 -0
- {svc_infra-0.1.704/src/svc_infra/obs/providers/grafana/templates → svc_infra-1.6.1/src/svc_infra/obs/templates/sidecars/compose}/__init__.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/templates/sidecars/compose/agent.yaml +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/templates/sidecars/compose/docker-compose.yml +0 -0
- {svc_infra-0.1.704/src/svc_infra/obs/providers/grafana/templates/provisioning → svc_infra-1.6.1/src/svc_infra/obs/templates/sidecars/fly}/__init__.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/templates/sidecars/fly/agent.yaml +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/templates/sidecars/fly/fly.toml.fragment +0 -0
- {svc_infra-0.1.704/src/svc_infra/obs/templates/sidecars → svc_infra-1.6.1/src/svc_infra/obs/templates/sidecars/k8s}/__init__.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/templates/sidecars/k8s/configmap.yaml +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/templates/sidecars/k8s/deployment.yaml +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/templates/sidecars/railway/Dockerfile +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/templates/sidecars/railway/README.md +0 -0
- {svc_infra-0.1.704/src/svc_infra/obs/templates/sidecars/compose → svc_infra-1.6.1/src/svc_infra/obs/templates/sidecars/railway}/__init__.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/templates/sidecars/railway/agent.yaml +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/py.typed +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/security/headers.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/storage/__init__.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/storage/backends/__init__.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/websocket/__init__.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/websocket/easy.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/websocket/exceptions.py +0 -0
- {svc_infra-0.1.704 → svc_infra-1.6.1}/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:
|
|
3
|
+
Version: 1.6.1
|
|
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,18 +16,24 @@ 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
|
-
|
|
35
|
+
Provides-Extra: stripe
|
|
36
|
+
Requires-Dist: adyen (>=10.0.0) ; extra == "payments" or extra == "adyen"
|
|
31
37
|
Requires-Dist: aioboto3 (>=12.0.0) ; extra == "s3"
|
|
32
38
|
Requires-Dist: aiofiles (>=24.0.0)
|
|
33
39
|
Requires-Dist: aiosqlite (>=0.19.0) ; extra == "sqlite"
|
|
@@ -45,7 +51,7 @@ Requires-Dist: httpx (>=0.25.0)
|
|
|
45
51
|
Requires-Dist: httpx-oauth (>=0.15.0)
|
|
46
52
|
Requires-Dist: itsdangerous (>=2.0.0)
|
|
47
53
|
Requires-Dist: mcp (>=1.0.0)
|
|
48
|
-
Requires-Dist: motor (>=3.0.0)
|
|
54
|
+
Requires-Dist: motor (>=3.0.0) ; extra == "mongodb"
|
|
49
55
|
Requires-Dist: mysqlclient (>=2.2.0) ; extra == "mysql"
|
|
50
56
|
Requires-Dist: opentelemetry-exporter-otlp (>=1.20.0)
|
|
51
57
|
Requires-Dist: opentelemetry-instrumentation-fastapi (>=0.41b0)
|
|
@@ -67,30 +73,36 @@ Requires-Dist: redis (>=5.0.0)
|
|
|
67
73
|
Requires-Dist: redshift-connector (>=2.0.0) ; extra == "redshift"
|
|
68
74
|
Requires-Dist: snowflake-connector-python (>=3.0.0) ; extra == "snowflake"
|
|
69
75
|
Requires-Dist: sqlalchemy[asyncio] (>=2.0)
|
|
70
|
-
Requires-Dist: stripe (>=7.0.0)
|
|
76
|
+
Requires-Dist: stripe (>=7.0.0) ; extra == "payments" or extra == "stripe"
|
|
71
77
|
Requires-Dist: typer (>=0.12.0)
|
|
72
78
|
Requires-Dist: websockets (>=12.0)
|
|
73
|
-
Project-URL: Documentation, https://
|
|
74
|
-
Project-URL: Homepage, https://github.com/
|
|
75
|
-
Project-URL: Issues, https://github.com/
|
|
76
|
-
Project-URL: Repository, https://github.com/
|
|
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
|
|
77
83
|
Description-Content-Type: text/markdown
|
|
78
84
|
|
|
79
|
-
<div align="center">
|
|
80
|
-
|
|
81
85
|
# svc-infra
|
|
82
86
|
|
|
83
|
-
|
|
87
|
+
**Production-ready FastAPI infrastructure in one import.**
|
|
84
88
|
|
|
85
|
-
[](https://pypi.org/project/svc-infra/)
|
|
89
|
+
[](https://pypi.org/project/svc-infra/)
|
|
90
|
+
[](https://github.com/nfraxlab/svc-infra/actions/workflows/ci.yml)
|
|
91
|
+
[](https://pypi.org/project/svc-infra/)
|
|
92
|
+
[](LICENSE)
|
|
86
93
|
|
|
87
|
-
|
|
94
|
+
## Overview
|
|
88
95
|
|
|
89
|
-
|
|
96
|
+
Stop rebuilding auth, billing, webhooks, and background jobs for every project.
|
|
90
97
|
|
|
91
|
-
|
|
98
|
+
### Key Features
|
|
92
99
|
|
|
93
|
-
|
|
100
|
+
- **Auth** - JWT, sessions, OAuth/OIDC, MFA, API keys
|
|
101
|
+
- **Billing** - Usage tracking, subscriptions, invoices, Stripe sync
|
|
102
|
+
- **Database** - PostgreSQL + MongoDB, migrations, inbox/outbox
|
|
103
|
+
- **Jobs** - Background tasks, scheduling, retries, DLQ
|
|
104
|
+
- **Webhooks** - Subscriptions, HMAC signing, delivery retries
|
|
105
|
+
- **Observability** - Prometheus, Grafana dashboards, OTEL
|
|
94
106
|
|
|
95
107
|
## Why svc-infra?
|
|
96
108
|
|
|
@@ -102,34 +114,34 @@ Every FastAPI project needs the same things: authentication, database setup, bac
|
|
|
102
114
|
from svc_infra.api.fastapi.ease import easy_service_app
|
|
103
115
|
|
|
104
116
|
app = easy_service_app(name="MyAPI", release="1.0.0")
|
|
105
|
-
#
|
|
106
|
-
#
|
|
107
|
-
#
|
|
117
|
+
# Health checks, CORS, security headers, structured logging
|
|
118
|
+
# Prometheus metrics, OpenTelemetry tracing
|
|
119
|
+
# Request IDs, idempotency middleware
|
|
108
120
|
# That's it. Ship it.
|
|
109
121
|
```
|
|
110
122
|
|
|
111
|
-
##
|
|
123
|
+
## Quick Install
|
|
112
124
|
|
|
113
125
|
```bash
|
|
114
126
|
pip install svc-infra
|
|
115
127
|
```
|
|
116
128
|
|
|
117
|
-
##
|
|
129
|
+
## What's Included
|
|
118
130
|
|
|
119
131
|
| Feature | What You Get | One-liner |
|
|
120
132
|
|---------|-------------|-----------|
|
|
121
|
-
|
|
|
122
|
-
|
|
|
123
|
-
|
|
|
124
|
-
|
|
|
125
|
-
|
|
|
126
|
-
|
|
|
127
|
-
|
|
|
128
|
-
|
|
|
129
|
-
|
|
|
130
|
-
|
|
|
131
|
-
|
|
132
|
-
##
|
|
133
|
+
| **Auth** | JWT, sessions, OAuth/OIDC, MFA, API keys | `add_auth_users(app)` |
|
|
134
|
+
| **Billing** | Usage tracking, subscriptions, invoices, Stripe sync | `add_billing(app)` |
|
|
135
|
+
| **Database** | PostgreSQL + MongoDB, migrations, inbox/outbox | `add_sql_db(app)` |
|
|
136
|
+
| **Jobs** | Background tasks, scheduling, retries, DLQ | `easy_jobs()` |
|
|
137
|
+
| **Webhooks** | Subscriptions, HMAC signing, delivery retries | `add_webhooks(app)` |
|
|
138
|
+
| **Cache** | Redis/memory, decorators, namespacing | `init_cache()` |
|
|
139
|
+
| **Observability** | Prometheus, Grafana dashboards, OTEL | Built-in |
|
|
140
|
+
| **Storage** | S3, local, memory backends | `add_storage(app)` |
|
|
141
|
+
| **Multi-tenancy** | Tenant isolation, scoped queries | Built-in |
|
|
142
|
+
| **Rate Limiting** | Per-user, per-endpoint, headers | Built-in |
|
|
143
|
+
|
|
144
|
+
## 30-Second Example
|
|
133
145
|
|
|
134
146
|
Build a complete SaaS backend:
|
|
135
147
|
|
|
@@ -164,9 +176,9 @@ async def stripe_webhook(payload=Depends(require_signature(lambda: ["whsec_..."]
|
|
|
164
176
|
|
|
165
177
|
**That's a production-ready API** with auth, database, background jobs, and webhook handling.
|
|
166
178
|
|
|
167
|
-
##
|
|
179
|
+
## Feature Highlights
|
|
168
180
|
|
|
169
|
-
###
|
|
181
|
+
### Authentication & Security
|
|
170
182
|
|
|
171
183
|
Full auth system with zero boilerplate:
|
|
172
184
|
|
|
@@ -182,7 +194,7 @@ async def get_profile(user=Depends(current_active_user)):
|
|
|
182
194
|
|
|
183
195
|
**Includes:** JWT tokens, session cookies, OAuth/OIDC (Google, GitHub, etc.), MFA/TOTP, password policies, account lockout, key rotation.
|
|
184
196
|
|
|
185
|
-
###
|
|
197
|
+
### Usage-Based Billing
|
|
186
198
|
|
|
187
199
|
Track usage and generate invoices:
|
|
188
200
|
|
|
@@ -203,7 +215,7 @@ invoice = billing.generate_monthly_invoice(
|
|
|
203
215
|
|
|
204
216
|
**Includes:** Usage events, aggregation, plans & entitlements, subscriptions, invoices, Stripe sync hooks.
|
|
205
217
|
|
|
206
|
-
###
|
|
218
|
+
### Background Jobs
|
|
207
219
|
|
|
208
220
|
Redis-backed job queue with retries:
|
|
209
221
|
|
|
@@ -226,7 +238,7 @@ svc-infra jobs run
|
|
|
226
238
|
|
|
227
239
|
**Includes:** Visibility timeout, exponential backoff, dead letter queue, interval scheduler, CLI worker.
|
|
228
240
|
|
|
229
|
-
###
|
|
241
|
+
### Webhooks
|
|
230
242
|
|
|
231
243
|
Send and receive webhooks with proper security:
|
|
232
244
|
|
|
@@ -246,7 +258,7 @@ async def receive(payload=Depends(require_signature(lambda: ["secret1", "secret2
|
|
|
246
258
|
|
|
247
259
|
**Includes:** Subscription store, HMAC-SHA256 signing, delivery retries, idempotent processing.
|
|
248
260
|
|
|
249
|
-
###
|
|
261
|
+
### Observability
|
|
250
262
|
|
|
251
263
|
Production monitoring out of the box:
|
|
252
264
|
|
|
@@ -264,7 +276,7 @@ svc-infra obs dashboard --service myapi --output ./dashboards/
|
|
|
264
276
|
|
|
265
277
|
**Includes:** Prometheus metrics, Grafana dashboard generator, OTEL integration, SLO helpers.
|
|
266
278
|
|
|
267
|
-
##
|
|
279
|
+
## Configuration
|
|
268
280
|
|
|
269
281
|
Everything is configurable via environment variables:
|
|
270
282
|
|
|
@@ -292,7 +304,7 @@ METRICS_PATH=/metrics
|
|
|
292
304
|
|
|
293
305
|
See the [Environment Reference](docs/environment.md) for all options.
|
|
294
306
|
|
|
295
|
-
##
|
|
307
|
+
## Documentation
|
|
296
308
|
|
|
297
309
|
| Module | Description | Guide |
|
|
298
310
|
|--------|-------------|-------|
|
|
@@ -309,7 +321,7 @@ See the [Environment Reference](docs/environment.md) for all options.
|
|
|
309
321
|
| **Tenancy** | Multi-tenant isolation | [docs/tenancy.md](docs/tenancy.md) |
|
|
310
322
|
| **CLI** | Command-line tools | [docs/cli.md](docs/cli.md) |
|
|
311
323
|
|
|
312
|
-
##
|
|
324
|
+
## Running the Example
|
|
313
325
|
|
|
314
326
|
See all features working together:
|
|
315
327
|
|
|
@@ -324,7 +336,7 @@ make run-template # Starts at http://localhost:8001
|
|
|
324
336
|
|
|
325
337
|
Visit http://localhost:8001/docs to explore the API.
|
|
326
338
|
|
|
327
|
-
##
|
|
339
|
+
## Related Packages
|
|
328
340
|
|
|
329
341
|
svc-infra is part of the **nfrax** infrastructure suite:
|
|
330
342
|
|
|
@@ -334,7 +346,7 @@ svc-infra is part of the **nfrax** infrastructure suite:
|
|
|
334
346
|
| **[ai-infra](https://github.com/nfraxlab/ai-infra)** | AI/LLM infrastructure (agents, tools, RAG, MCP) |
|
|
335
347
|
| **[fin-infra](https://github.com/nfraxlab/fin-infra)** | Financial infrastructure (banking, portfolio, insights) |
|
|
336
348
|
|
|
337
|
-
##
|
|
349
|
+
## License
|
|
338
350
|
|
|
339
351
|
MIT License - use it for anything.
|
|
340
352
|
|
|
@@ -342,9 +354,9 @@ MIT License - use it for anything.
|
|
|
342
354
|
|
|
343
355
|
<div align="center">
|
|
344
356
|
|
|
345
|
-
**Built
|
|
357
|
+
**Built by [nfraxlab](https://github.com/nfraxlab)**
|
|
346
358
|
|
|
347
|
-
[
|
|
359
|
+
[Star us on GitHub](https://github.com/nfraxlab/svc-infra) · [View on PyPI](https://pypi.org/project/svc-infra/)
|
|
348
360
|
|
|
349
361
|
</div>
|
|
350
362
|
|
|
@@ -1,18 +1,24 @@
|
|
|
1
|
-
<div align="center">
|
|
2
|
-
|
|
3
1
|
# svc-infra
|
|
4
2
|
|
|
5
|
-
|
|
3
|
+
**Production-ready FastAPI infrastructure in one import.**
|
|
6
4
|
|
|
7
|
-
[](https://pypi.org/project/svc-infra/)
|
|
5
|
+
[](https://pypi.org/project/svc-infra/)
|
|
6
|
+
[](https://github.com/nfraxlab/svc-infra/actions/workflows/ci.yml)
|
|
7
|
+
[](https://pypi.org/project/svc-infra/)
|
|
8
|
+
[](LICENSE)
|
|
8
9
|
|
|
9
|
-
|
|
10
|
+
## Overview
|
|
10
11
|
|
|
11
|
-
|
|
12
|
+
Stop rebuilding auth, billing, webhooks, and background jobs for every project.
|
|
12
13
|
|
|
13
|
-
|
|
14
|
+
### Key Features
|
|
14
15
|
|
|
15
|
-
|
|
16
|
+
- **Auth** - JWT, sessions, OAuth/OIDC, MFA, API keys
|
|
17
|
+
- **Billing** - Usage tracking, subscriptions, invoices, Stripe sync
|
|
18
|
+
- **Database** - PostgreSQL + MongoDB, migrations, inbox/outbox
|
|
19
|
+
- **Jobs** - Background tasks, scheduling, retries, DLQ
|
|
20
|
+
- **Webhooks** - Subscriptions, HMAC signing, delivery retries
|
|
21
|
+
- **Observability** - Prometheus, Grafana dashboards, OTEL
|
|
16
22
|
|
|
17
23
|
## Why svc-infra?
|
|
18
24
|
|
|
@@ -24,34 +30,34 @@ Every FastAPI project needs the same things: authentication, database setup, bac
|
|
|
24
30
|
from svc_infra.api.fastapi.ease import easy_service_app
|
|
25
31
|
|
|
26
32
|
app = easy_service_app(name="MyAPI", release="1.0.0")
|
|
27
|
-
#
|
|
28
|
-
#
|
|
29
|
-
#
|
|
33
|
+
# Health checks, CORS, security headers, structured logging
|
|
34
|
+
# Prometheus metrics, OpenTelemetry tracing
|
|
35
|
+
# Request IDs, idempotency middleware
|
|
30
36
|
# That's it. Ship it.
|
|
31
37
|
```
|
|
32
38
|
|
|
33
|
-
##
|
|
39
|
+
## Quick Install
|
|
34
40
|
|
|
35
41
|
```bash
|
|
36
42
|
pip install svc-infra
|
|
37
43
|
```
|
|
38
44
|
|
|
39
|
-
##
|
|
45
|
+
## What's Included
|
|
40
46
|
|
|
41
47
|
| Feature | What You Get | One-liner |
|
|
42
48
|
|---------|-------------|-----------|
|
|
43
|
-
|
|
|
44
|
-
|
|
|
45
|
-
|
|
|
46
|
-
|
|
|
47
|
-
|
|
|
48
|
-
|
|
|
49
|
-
|
|
|
50
|
-
|
|
|
51
|
-
|
|
|
52
|
-
|
|
|
53
|
-
|
|
54
|
-
##
|
|
49
|
+
| **Auth** | JWT, sessions, OAuth/OIDC, MFA, API keys | `add_auth_users(app)` |
|
|
50
|
+
| **Billing** | Usage tracking, subscriptions, invoices, Stripe sync | `add_billing(app)` |
|
|
51
|
+
| **Database** | PostgreSQL + MongoDB, migrations, inbox/outbox | `add_sql_db(app)` |
|
|
52
|
+
| **Jobs** | Background tasks, scheduling, retries, DLQ | `easy_jobs()` |
|
|
53
|
+
| **Webhooks** | Subscriptions, HMAC signing, delivery retries | `add_webhooks(app)` |
|
|
54
|
+
| **Cache** | Redis/memory, decorators, namespacing | `init_cache()` |
|
|
55
|
+
| **Observability** | Prometheus, Grafana dashboards, OTEL | Built-in |
|
|
56
|
+
| **Storage** | S3, local, memory backends | `add_storage(app)` |
|
|
57
|
+
| **Multi-tenancy** | Tenant isolation, scoped queries | Built-in |
|
|
58
|
+
| **Rate Limiting** | Per-user, per-endpoint, headers | Built-in |
|
|
59
|
+
|
|
60
|
+
## 30-Second Example
|
|
55
61
|
|
|
56
62
|
Build a complete SaaS backend:
|
|
57
63
|
|
|
@@ -86,9 +92,9 @@ async def stripe_webhook(payload=Depends(require_signature(lambda: ["whsec_..."]
|
|
|
86
92
|
|
|
87
93
|
**That's a production-ready API** with auth, database, background jobs, and webhook handling.
|
|
88
94
|
|
|
89
|
-
##
|
|
95
|
+
## Feature Highlights
|
|
90
96
|
|
|
91
|
-
###
|
|
97
|
+
### Authentication & Security
|
|
92
98
|
|
|
93
99
|
Full auth system with zero boilerplate:
|
|
94
100
|
|
|
@@ -104,7 +110,7 @@ async def get_profile(user=Depends(current_active_user)):
|
|
|
104
110
|
|
|
105
111
|
**Includes:** JWT tokens, session cookies, OAuth/OIDC (Google, GitHub, etc.), MFA/TOTP, password policies, account lockout, key rotation.
|
|
106
112
|
|
|
107
|
-
###
|
|
113
|
+
### Usage-Based Billing
|
|
108
114
|
|
|
109
115
|
Track usage and generate invoices:
|
|
110
116
|
|
|
@@ -125,7 +131,7 @@ invoice = billing.generate_monthly_invoice(
|
|
|
125
131
|
|
|
126
132
|
**Includes:** Usage events, aggregation, plans & entitlements, subscriptions, invoices, Stripe sync hooks.
|
|
127
133
|
|
|
128
|
-
###
|
|
134
|
+
### Background Jobs
|
|
129
135
|
|
|
130
136
|
Redis-backed job queue with retries:
|
|
131
137
|
|
|
@@ -148,7 +154,7 @@ svc-infra jobs run
|
|
|
148
154
|
|
|
149
155
|
**Includes:** Visibility timeout, exponential backoff, dead letter queue, interval scheduler, CLI worker.
|
|
150
156
|
|
|
151
|
-
###
|
|
157
|
+
### Webhooks
|
|
152
158
|
|
|
153
159
|
Send and receive webhooks with proper security:
|
|
154
160
|
|
|
@@ -168,7 +174,7 @@ async def receive(payload=Depends(require_signature(lambda: ["secret1", "secret2
|
|
|
168
174
|
|
|
169
175
|
**Includes:** Subscription store, HMAC-SHA256 signing, delivery retries, idempotent processing.
|
|
170
176
|
|
|
171
|
-
###
|
|
177
|
+
### Observability
|
|
172
178
|
|
|
173
179
|
Production monitoring out of the box:
|
|
174
180
|
|
|
@@ -186,7 +192,7 @@ svc-infra obs dashboard --service myapi --output ./dashboards/
|
|
|
186
192
|
|
|
187
193
|
**Includes:** Prometheus metrics, Grafana dashboard generator, OTEL integration, SLO helpers.
|
|
188
194
|
|
|
189
|
-
##
|
|
195
|
+
## Configuration
|
|
190
196
|
|
|
191
197
|
Everything is configurable via environment variables:
|
|
192
198
|
|
|
@@ -214,7 +220,7 @@ METRICS_PATH=/metrics
|
|
|
214
220
|
|
|
215
221
|
See the [Environment Reference](docs/environment.md) for all options.
|
|
216
222
|
|
|
217
|
-
##
|
|
223
|
+
## Documentation
|
|
218
224
|
|
|
219
225
|
| Module | Description | Guide |
|
|
220
226
|
|--------|-------------|-------|
|
|
@@ -231,7 +237,7 @@ See the [Environment Reference](docs/environment.md) for all options.
|
|
|
231
237
|
| **Tenancy** | Multi-tenant isolation | [docs/tenancy.md](docs/tenancy.md) |
|
|
232
238
|
| **CLI** | Command-line tools | [docs/cli.md](docs/cli.md) |
|
|
233
239
|
|
|
234
|
-
##
|
|
240
|
+
## Running the Example
|
|
235
241
|
|
|
236
242
|
See all features working together:
|
|
237
243
|
|
|
@@ -246,7 +252,7 @@ make run-template # Starts at http://localhost:8001
|
|
|
246
252
|
|
|
247
253
|
Visit http://localhost:8001/docs to explore the API.
|
|
248
254
|
|
|
249
|
-
##
|
|
255
|
+
## Related Packages
|
|
250
256
|
|
|
251
257
|
svc-infra is part of the **nfrax** infrastructure suite:
|
|
252
258
|
|
|
@@ -256,7 +262,7 @@ svc-infra is part of the **nfrax** infrastructure suite:
|
|
|
256
262
|
| **[ai-infra](https://github.com/nfraxlab/ai-infra)** | AI/LLM infrastructure (agents, tools, RAG, MCP) |
|
|
257
263
|
| **[fin-infra](https://github.com/nfraxlab/fin-infra)** | Financial infrastructure (banking, portfolio, insights) |
|
|
258
264
|
|
|
259
|
-
##
|
|
265
|
+
## License
|
|
260
266
|
|
|
261
267
|
MIT License - use it for anything.
|
|
262
268
|
|
|
@@ -264,8 +270,8 @@ MIT License - use it for anything.
|
|
|
264
270
|
|
|
265
271
|
<div align="center">
|
|
266
272
|
|
|
267
|
-
**Built
|
|
273
|
+
**Built by [nfraxlab](https://github.com/nfraxlab)**
|
|
268
274
|
|
|
269
|
-
[
|
|
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>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "svc-infra"
|
|
3
|
-
version = "
|
|
3
|
+
version = "1.6.1"
|
|
4
4
|
description = "Infrastructure for building and deploying prod-ready services"
|
|
5
5
|
authors = ["Ali Khatami <aliikhatami94@gmail.com>"]
|
|
6
6
|
license = "MIT"
|
|
@@ -17,7 +17,7 @@ include = [
|
|
|
17
17
|
]
|
|
18
18
|
|
|
19
19
|
classifiers = [
|
|
20
|
-
"Development Status ::
|
|
20
|
+
"Development Status :: 5 - Production/Stable",
|
|
21
21
|
"Intended Audience :: Developers",
|
|
22
22
|
"License :: OSI Approved :: MIT License",
|
|
23
23
|
"Programming Language :: Python :: 3",
|
|
@@ -25,15 +25,17 @@ classifiers = [
|
|
|
25
25
|
"Programming Language :: Python :: 3.11",
|
|
26
26
|
"Programming Language :: Python :: 3.12",
|
|
27
27
|
"Programming Language :: Python :: 3.13",
|
|
28
|
+
"Topic :: Internet :: WWW/HTTP :: HTTP Servers",
|
|
29
|
+
"Topic :: Software Development :: Libraries :: Python Modules",
|
|
28
30
|
"Framework :: FastAPI",
|
|
29
31
|
"Typing :: Typed"
|
|
30
32
|
]
|
|
31
33
|
|
|
32
34
|
[tool.poetry.urls]
|
|
33
|
-
Homepage = "https://github.com/
|
|
34
|
-
Repository = "https://github.com/
|
|
35
|
-
Issues = "https://github.com/
|
|
36
|
-
Documentation = "https://
|
|
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"
|
|
37
39
|
|
|
38
40
|
[tool.poetry.dependencies]
|
|
39
41
|
python = ">=3.11,<4.0"
|
|
@@ -81,23 +83,31 @@ opentelemetry-instrumentation-httpx = ">=0.41b0"
|
|
|
81
83
|
opentelemetry-exporter-otlp = ">=1.20.0"
|
|
82
84
|
opentelemetry-propagator-b3 = ">=1.20.0"
|
|
83
85
|
prometheus-client = ">=0.18.0"
|
|
84
|
-
psycopg2-binary = ">=2.9.0"
|
|
85
|
-
motor = ">=3.0.0"
|
|
86
86
|
redis = ">=5.0.0"
|
|
87
87
|
cashews = {extras = ["redis"], version = ">=7.0"}
|
|
88
88
|
itsdangerous = ">=2.0.0"
|
|
89
89
|
pyotp = ">=2.9.0"
|
|
90
|
-
stripe = ">=7.0.0"
|
|
91
|
-
adyen = ">=10.0.0"
|
|
92
90
|
websockets = ">=12.0"
|
|
93
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
|
+
|
|
94
98
|
[tool.poetry.extras]
|
|
95
|
-
# Postgres v3
|
|
99
|
+
# Postgres v3 (recommended)
|
|
96
100
|
pg = ["psycopg", "asyncpg"]
|
|
97
|
-
# Postgres v2 (
|
|
101
|
+
# Postgres v2 (legacy compatibility)
|
|
98
102
|
pg2 = ["psycopg2-binary"]
|
|
99
103
|
sqlite = ["aiosqlite"]
|
|
100
104
|
mysql = ["pymysql", "mysqlclient"]
|
|
105
|
+
# Payment providers
|
|
106
|
+
payments = ["stripe", "adyen"]
|
|
107
|
+
stripe = ["stripe"]
|
|
108
|
+
adyen = ["adyen"]
|
|
109
|
+
# MongoDB
|
|
110
|
+
mongodb = ["motor"]
|
|
101
111
|
mssql = ["pyodbc"]
|
|
102
112
|
snowflake = ["snowflake-connector-python"]
|
|
103
113
|
redshift = ["redshift-connector"]
|
|
@@ -108,6 +118,8 @@ s3 = ["aioboto3"]
|
|
|
108
118
|
[tool.poetry.group.dev.dependencies]
|
|
109
119
|
pytest = ">=8.0.0"
|
|
110
120
|
pytest-asyncio = ">=0.23.0"
|
|
121
|
+
pytest-cov = ">=4.0.0"
|
|
122
|
+
pytest-benchmark = ">=4.0.0"
|
|
111
123
|
ruff = ">=0.6.0"
|
|
112
124
|
mypy = ">=1.10.0"
|
|
113
125
|
types-requests = ">=2.31.0"
|
|
@@ -117,6 +129,13 @@ fakeredis = ">=2.20.0"
|
|
|
117
129
|
moto = {extras = ["s3"], version = ">=5.0.0"}
|
|
118
130
|
aiosqlite = ">=0.19.0" # Required for acceptance tests using SQLite
|
|
119
131
|
pre-commit = ">=3.0.0"
|
|
132
|
+
bandit = ">=1.7.0"
|
|
133
|
+
pip-audit = ">=2.7.0" # Security vulnerability scanning
|
|
134
|
+
python-semantic-release = ">=9.0.0"
|
|
135
|
+
# Documentation
|
|
136
|
+
mkdocs = ">=1.6.0"
|
|
137
|
+
mkdocs-material = ">=9.5.0"
|
|
138
|
+
griffe = "^1.15.0"
|
|
120
139
|
|
|
121
140
|
[tool.poetry.scripts]
|
|
122
141
|
svc-infra = "svc_infra.cli:main"
|
|
@@ -146,6 +165,95 @@ filterwarnings = [
|
|
|
146
165
|
"ignore:The `route` decorator is deprecated:DeprecationWarning:starlette.*",
|
|
147
166
|
]
|
|
148
167
|
|
|
168
|
+
[tool.ruff]
|
|
169
|
+
line-length = 100
|
|
170
|
+
target-version = "py311"
|
|
171
|
+
|
|
172
|
+
[tool.ruff.lint]
|
|
173
|
+
select = [
|
|
174
|
+
"E", # pycodestyle errors
|
|
175
|
+
"W", # pycodestyle warnings
|
|
176
|
+
"F", # Pyflakes
|
|
177
|
+
"I", # isort
|
|
178
|
+
"B", # flake8-bugbear
|
|
179
|
+
"C4", # flake8-comprehensions
|
|
180
|
+
"UP", # pyupgrade
|
|
181
|
+
"SIM", # flake8-simplify
|
|
182
|
+
"RUF", # Ruff-specific rules
|
|
183
|
+
]
|
|
184
|
+
|
|
185
|
+
ignore = [
|
|
186
|
+
"E501", # line too long (handled by formatter)
|
|
187
|
+
"RUF022", # __all__ not sorted (we use logical grouping)
|
|
188
|
+
"RUF012", # mutable class attrs (handled by dataclass/pydantic)
|
|
189
|
+
"B007", # unused loop variable (often intentional)
|
|
190
|
+
"B008", # function call in default arg (typer.Option pattern)
|
|
191
|
+
"B027", # empty method in ABC (intentional for optional callbacks)
|
|
192
|
+
"B904", # raise from err (not always clearer)
|
|
193
|
+
"B905", # zip strict (Python 3.10+ only, adds verbosity)
|
|
194
|
+
"SIM102", # nested if statements (sometimes clearer)
|
|
195
|
+
"SIM103", # return condition directly (sometimes clearer with if)
|
|
196
|
+
"SIM105", # contextlib.suppress (explicit try/except often clearer)
|
|
197
|
+
"SIM108", # ternary operator (readability preference)
|
|
198
|
+
"SIM110", # use all() (sometimes clearer with explicit loop)
|
|
199
|
+
"SIM113", # use enumerate (sometimes clearer without)
|
|
200
|
+
"SIM115", # context manager for files (not always applicable)
|
|
201
|
+
"SIM117", # single with statement (sometimes clearer separate)
|
|
202
|
+
"SIM118", # key in dict vs dict.keys() (minor)
|
|
203
|
+
"UP028", # yield from (sometimes clearer with explicit yield)
|
|
204
|
+
"UP038", # isinstance(x, (A, B)) - deprecated rule, requires unsafe fixes
|
|
205
|
+
"RUF001", # ambiguous unicode char in string (intentional in docs)
|
|
206
|
+
"RUF002", # ambiguous unicode char in docstring (intentional curly quotes)
|
|
207
|
+
"RUF003", # ambiguous unicode char in comment (intentional curly quotes)
|
|
208
|
+
"B023", # function uses loop variable (often intentional in closures)
|
|
209
|
+
"B039", # contextvar default mutable (handled by contextvar)
|
|
210
|
+
]
|
|
211
|
+
|
|
212
|
+
[tool.ruff.lint.per-file-ignores]
|
|
213
|
+
"tests/**/*.py" = [
|
|
214
|
+
"B018", # useless expression in tests is fine
|
|
215
|
+
]
|
|
216
|
+
|
|
217
|
+
[tool.ruff.lint.isort]
|
|
218
|
+
known-first-party = ["svc_infra"]
|
|
219
|
+
|
|
220
|
+
[tool.ruff.lint.pydocstyle]
|
|
221
|
+
convention = "google"
|
|
222
|
+
|
|
223
|
+
[tool.bandit]
|
|
224
|
+
exclude_dirs = ["tests", ".venv", "venv"]
|
|
225
|
+
skips = [
|
|
226
|
+
"B101", # assert used (intentional in tests and contracts)
|
|
227
|
+
"B104", # hardcoded_bind_all_interfaces (intentional for container deployments)
|
|
228
|
+
"B310", # urllib urlopen (URL is validated/trusted in our code)
|
|
229
|
+
"B311", # random for non-crypto (intentional)
|
|
230
|
+
"B324", # SHA1/MD5 hash - used for cache keys and HIBP API, not security
|
|
231
|
+
]
|
|
232
|
+
|
|
233
|
+
[tool.coverage.run]
|
|
234
|
+
source = ["src/svc_infra"]
|
|
235
|
+
branch = true
|
|
236
|
+
omit = ["*/tests/*", "*/__pycache__/*"]
|
|
237
|
+
|
|
238
|
+
[tool.coverage.report]
|
|
239
|
+
exclude_lines = ["pragma: no cover", "if TYPE_CHECKING:", "raise NotImplementedError"]
|
|
240
|
+
fail_under = 60
|
|
241
|
+
show_missing = true
|
|
242
|
+
|
|
243
|
+
# Semantic Release configuration
|
|
244
|
+
[tool.semantic_release]
|
|
245
|
+
version_toml = ["pyproject.toml:tool.poetry.version"]
|
|
246
|
+
branch = "main"
|
|
247
|
+
tag_format = "v{version}"
|
|
248
|
+
changelog_file = "CHANGELOG.md"
|
|
249
|
+
upload_to_pypi = false
|
|
250
|
+
upload_to_release = false
|
|
251
|
+
|
|
252
|
+
[tool.semantic_release.commit_parser_options]
|
|
253
|
+
allowed_tags = ["feat", "fix", "perf", "refactor", "docs", "chore", "test", "build", "ci"]
|
|
254
|
+
minor_tags = ["feat"]
|
|
255
|
+
patch_tags = ["fix", "perf"]
|
|
256
|
+
|
|
149
257
|
[build-system]
|
|
150
258
|
requires = ["poetry-core>=2.0.0,<3.0.0"]
|
|
151
259
|
build-backend = "poetry.core.masonry.api"
|