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.

Files changed (373) hide show
  1. {svc_infra-0.1.704 → svc_infra-1.6.1}/PKG-INFO +59 -47
  2. {svc_infra-0.1.704 → svc_infra-1.6.1}/README.md +44 -38
  3. {svc_infra-0.1.704 → svc_infra-1.6.1}/pyproject.toml +120 -12
  4. svc_infra-1.6.1/src/svc_infra/__init__.py +59 -0
  5. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/apf_payments/README.md +9 -9
  6. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/apf_payments/models.py +47 -108
  7. svc_infra-1.6.1/src/svc_infra/apf_payments/provider/__init__.py +4 -0
  8. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/apf_payments/provider/aiydan.py +42 -100
  9. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/apf_payments/provider/base.py +10 -26
  10. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/apf_payments/provider/registry.py +3 -5
  11. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/apf_payments/provider/stripe.py +63 -135
  12. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/apf_payments/schemas.py +82 -90
  13. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/apf_payments/service.py +40 -86
  14. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/apf_payments/settings.py +10 -13
  15. svc_infra-1.6.1/src/svc_infra/api/__init__.py +61 -0
  16. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/__init__.py +19 -0
  17. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/admin/add.py +13 -18
  18. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/apf_payments/router.py +47 -84
  19. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/apf_payments/setup.py +7 -13
  20. svc_infra-1.6.1/src/svc_infra/api/fastapi/auth/__init__.py +65 -0
  21. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/auth/_cookies.py +3 -9
  22. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/auth/add.py +4 -8
  23. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/auth/gaurd.py +9 -26
  24. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/auth/mfa/models.py +4 -7
  25. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/auth/mfa/pre_auth.py +3 -3
  26. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/auth/mfa/router.py +9 -15
  27. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/auth/mfa/security.py +3 -5
  28. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/auth/mfa/utils.py +3 -2
  29. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/auth/mfa/verify.py +2 -9
  30. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/auth/policy.py +16 -0
  31. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/auth/providers.py +4 -6
  32. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/auth/routers/apikey_router.py +16 -18
  33. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/auth/routers/oauth_router.py +37 -85
  34. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/auth/routers/session_router.py +3 -6
  35. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/auth/security.py +17 -28
  36. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/auth/sender.py +1 -3
  37. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/auth/settings.py +18 -19
  38. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/auth/state.py +6 -7
  39. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/auth/ws_security.py +2 -2
  40. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/billing/router.py +6 -8
  41. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/db/http.py +10 -11
  42. svc_infra-1.6.1/src/svc_infra/api/fastapi/db/nosql/__init__.py +46 -0
  43. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/db/nosql/mongo/add.py +5 -15
  44. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/db/nosql/mongo/crud_router.py +22 -16
  45. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/db/sql/README.md +1 -1
  46. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/db/sql/add.py +6 -14
  47. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/db/sql/crud_router.py +27 -40
  48. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/db/sql/health.py +1 -3
  49. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/db/sql/session.py +4 -5
  50. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/db/sql/users.py +8 -11
  51. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/dependencies/ratelimit.py +4 -6
  52. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/docs/add.py +13 -23
  53. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/docs/landing.py +6 -8
  54. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/docs/scoped.py +34 -42
  55. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/dual/dualize.py +1 -1
  56. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/dual/protected.py +12 -21
  57. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/dual/router.py +14 -31
  58. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/ease.py +57 -13
  59. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/http/conditional.py +3 -5
  60. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/middleware/errors/catchall.py +2 -6
  61. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/middleware/errors/exceptions.py +1 -4
  62. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/middleware/errors/handlers.py +12 -18
  63. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/middleware/graceful_shutdown.py +4 -13
  64. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/middleware/idempotency.py +11 -16
  65. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/middleware/idempotency_store.py +14 -14
  66. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/middleware/optimistic_lock.py +5 -8
  67. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/middleware/ratelimit.py +8 -8
  68. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/middleware/ratelimit_store.py +7 -8
  69. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/middleware/request_id.py +1 -3
  70. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/middleware/timeout.py +9 -10
  71. svc_infra-1.6.1/src/svc_infra/api/fastapi/object_router.py +1060 -0
  72. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/openapi/apply.py +5 -6
  73. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/openapi/conventions.py +4 -4
  74. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/openapi/models.py +6 -0
  75. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/openapi/mutators.py +13 -31
  76. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/openapi/pipeline.py +2 -2
  77. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/openapi/responses.py +4 -6
  78. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/openapi/security.py +1 -3
  79. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/ops/add.py +7 -9
  80. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/pagination.py +25 -37
  81. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/routers/__init__.py +16 -38
  82. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/setup.py +13 -31
  83. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/tenancy/add.py +3 -2
  84. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/tenancy/context.py +8 -7
  85. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/versioned.py +3 -2
  86. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/app/env.py +5 -7
  87. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/app/logging/add.py +2 -1
  88. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/app/logging/filter.py +1 -1
  89. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/app/logging/formats.py +3 -2
  90. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/app/root.py +3 -3
  91. svc_infra-1.6.1/src/svc_infra/billing/__init__.py +40 -0
  92. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/billing/async_service.py +50 -7
  93. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/billing/jobs.py +23 -33
  94. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/billing/models.py +21 -52
  95. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/billing/quotas.py +5 -7
  96. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/billing/schemas.py +4 -6
  97. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cache/README.md +32 -32
  98. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cache/__init__.py +12 -5
  99. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cache/add.py +6 -9
  100. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cache/backend.py +6 -5
  101. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cache/decorators.py +17 -28
  102. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cache/keys.py +2 -2
  103. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cache/recache.py +22 -35
  104. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cache/resources.py +8 -16
  105. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cache/ttl.py +2 -3
  106. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cache/utils.py +7 -6
  107. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cli/__init__.py +4 -12
  108. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cli/cmds/__init__.py +22 -1
  109. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cli/cmds/db/nosql/mongo/README.md +2 -2
  110. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cli/cmds/db/nosql/mongo/mongo_cmds.py +11 -10
  111. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cli/cmds/db/nosql/mongo/mongo_scaffold_cmds.py +6 -9
  112. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cli/cmds/db/ops_cmds.py +3 -6
  113. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cli/cmds/db/sql/alembic_cmds.py +24 -41
  114. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cli/cmds/db/sql/sql_export_cmds.py +9 -17
  115. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cli/cmds/db/sql/sql_scaffold_cmds.py +10 -10
  116. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cli/cmds/docs/docs_cmds.py +7 -10
  117. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cli/cmds/dx/dx_cmds.py +5 -11
  118. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cli/cmds/jobs/jobs_cmds.py +2 -7
  119. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cli/cmds/obs/obs_cmds.py +4 -7
  120. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cli/cmds/sdk/sdk_cmds.py +5 -15
  121. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cli/foundation/runner.py +6 -11
  122. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cli/foundation/typer_bootstrap.py +1 -2
  123. svc_infra-1.6.1/src/svc_infra/data/__init__.py +83 -0
  124. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/data/add.py +5 -5
  125. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/data/backup.py +8 -10
  126. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/data/erasure.py +3 -2
  127. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/data/fixtures.py +3 -3
  128. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/data/retention.py +8 -13
  129. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/crud_schema.py +9 -8
  130. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/nosql/__init__.py +2 -0
  131. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/nosql/constants.py +1 -1
  132. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/nosql/core.py +17 -16
  133. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/nosql/indexes.py +11 -10
  134. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/nosql/management.py +3 -3
  135. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/nosql/mongo/client.py +21 -4
  136. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/nosql/mongo/settings.py +2 -6
  137. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/nosql/repository.py +45 -30
  138. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/nosql/resource.py +28 -16
  139. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/nosql/scaffold.py +13 -17
  140. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/nosql/service.py +3 -4
  141. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/nosql/service_with_hooks.py +4 -3
  142. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/nosql/types.py +2 -6
  143. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/nosql/utils.py +4 -4
  144. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/ops.py +14 -18
  145. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/outbox.py +15 -18
  146. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/sql/apikey.py +12 -21
  147. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/sql/authref.py +3 -7
  148. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/sql/constants.py +9 -9
  149. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/sql/core.py +11 -11
  150. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/sql/management.py +2 -6
  151. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/sql/repository.py +17 -24
  152. svc_infra-1.6.1/src/svc_infra/db/sql/resource.py +56 -0
  153. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/sql/scaffold.py +13 -17
  154. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/sql/service.py +7 -16
  155. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/sql/service_with_hooks.py +4 -3
  156. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/sql/tenant.py +6 -14
  157. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/sql/uniq.py +8 -7
  158. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/sql/uniq_hooks.py +14 -19
  159. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/sql/utils.py +24 -53
  160. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/utils.py +3 -3
  161. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/deploy/__init__.py +10 -15
  162. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/documents/add.py +7 -8
  163. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/documents/ease.py +8 -8
  164. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/documents/models.py +3 -3
  165. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/documents/storage.py +11 -13
  166. svc_infra-1.6.1/src/svc_infra/dx/__init__.py +58 -0
  167. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/dx/add.py +1 -3
  168. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/dx/changelog.py +2 -2
  169. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/dx/checks.py +1 -1
  170. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/health/__init__.py +15 -16
  171. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/http/client.py +10 -14
  172. svc_infra-1.6.1/src/svc_infra/jobs/__init__.py +79 -0
  173. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/jobs/builtins/outbox_processor.py +3 -5
  174. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/jobs/builtins/webhook_delivery.py +1 -3
  175. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/jobs/loader.py +4 -5
  176. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/jobs/queue.py +20 -24
  177. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/jobs/redis_queue.py +20 -34
  178. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/jobs/runner.py +7 -11
  179. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/jobs/scheduler.py +5 -5
  180. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/jobs/worker.py +1 -1
  181. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/loaders/base.py +5 -4
  182. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/loaders/github.py +1 -3
  183. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/loaders/url.py +3 -9
  184. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/logging/__init__.py +7 -6
  185. svc_infra-1.6.1/src/svc_infra/mcp/__init__.py +82 -0
  186. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/mcp/svc_infra_mcp.py +2 -2
  187. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/README.md +1 -1
  188. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/add.py +4 -3
  189. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/cloud_dash.py +3 -1
  190. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/metrics/__init__.py +3 -3
  191. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/metrics/asgi.py +9 -14
  192. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/metrics/base.py +13 -13
  193. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/metrics/http.py +5 -9
  194. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/metrics/sqlalchemy.py +9 -12
  195. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/metrics.py +3 -3
  196. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/settings.py +2 -6
  197. svc_infra-1.6.1/src/svc_infra/resilience/__init__.py +44 -0
  198. svc_infra-1.6.1/src/svc_infra/resilience/circuit_breaker.py +328 -0
  199. svc_infra-1.6.1/src/svc_infra/resilience/retry.py +289 -0
  200. svc_infra-1.6.1/src/svc_infra/security/__init__.py +167 -0
  201. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/security/add.py +5 -9
  202. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/security/audit.py +14 -17
  203. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/security/audit_service.py +9 -9
  204. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/security/hibp.py +5 -6
  205. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/security/jwt_rotation.py +7 -10
  206. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/security/lockout.py +12 -11
  207. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/security/models.py +37 -46
  208. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/security/oauth_models.py +10 -16
  209. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/security/org_invites.py +11 -13
  210. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/security/passwords.py +4 -6
  211. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/security/permissions.py +8 -7
  212. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/security/session.py +6 -7
  213. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/security/signed_cookies.py +9 -9
  214. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/storage/add.py +5 -8
  215. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/storage/backends/local.py +13 -21
  216. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/storage/backends/memory.py +4 -7
  217. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/storage/backends/s3.py +17 -36
  218. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/storage/base.py +2 -2
  219. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/storage/easy.py +4 -8
  220. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/storage/settings.py +16 -18
  221. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/testing/__init__.py +36 -39
  222. svc_infra-1.6.1/src/svc_infra/utils.py +188 -0
  223. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/webhooks/__init__.py +3 -13
  224. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/webhooks/add.py +17 -29
  225. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/webhooks/encryption.py +2 -2
  226. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/webhooks/fastapi.py +2 -4
  227. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/webhooks/router.py +3 -3
  228. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/webhooks/service.py +28 -6
  229. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/webhooks/signing.py +5 -5
  230. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/websocket/add.py +2 -3
  231. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/websocket/client.py +3 -2
  232. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/websocket/config.py +6 -18
  233. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/websocket/manager.py +9 -10
  234. svc_infra-0.1.704/src/svc_infra/__init__.py +0 -33
  235. svc_infra-0.1.704/src/svc_infra/apf_payments/provider/__init__.py +0 -4
  236. svc_infra-0.1.704/src/svc_infra/api/fastapi/db/nosql/__init__.py +0 -8
  237. svc_infra-0.1.704/src/svc_infra/billing/__init__.py +0 -23
  238. svc_infra-0.1.704/src/svc_infra/billing/service.py +0 -123
  239. svc_infra-0.1.704/src/svc_infra/db/sql/resource.py +0 -41
  240. svc_infra-0.1.704/src/svc_infra/obs/templates/sidecars/fly/__init__.py +0 -0
  241. svc_infra-0.1.704/src/svc_infra/obs/templates/sidecars/k8s/__init__.py +0 -0
  242. svc_infra-0.1.704/src/svc_infra/obs/templates/sidecars/railway/__init__.py +0 -0
  243. svc_infra-0.1.704/src/svc_infra/utils.py +0 -27
  244. {svc_infra-0.1.704 → svc_infra-1.6.1}/LICENSE +0 -0
  245. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/apf_payments/__init__.py +0 -0
  246. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/apf_payments/alembic.py +0 -0
  247. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/admin/__init__.py +0 -0
  248. {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
  249. {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
  250. {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
  251. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/auth/routers/account.py +0 -0
  252. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/billing/setup.py +0 -0
  253. {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
  254. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/cache/add.py +0 -0
  255. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/db/__init__.py +0 -0
  256. {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
  257. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/db/nosql/mongo/health.py +0 -0
  258. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/db/sql/__init__.py +0 -0
  259. {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
  260. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/dual/__init__.py +0 -0
  261. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/dual/public.py +0 -0
  262. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/dual/utils.py +0 -0
  263. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/dx.py +0 -0
  264. {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
  265. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/http/concurrency.py +0 -0
  266. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/http/deprecation.py +0 -0
  267. {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
  268. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/middleware/debug.py +0 -0
  269. {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
  270. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/middleware/request_size_limit.py +0 -0
  271. {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
  272. {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
  273. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/paths/auth.py +0 -0
  274. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/paths/generic.py +0 -0
  275. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/paths/prefix.py +0 -0
  276. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/paths/user.py +0 -0
  277. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/api/fastapi/routers/ping.py +0 -0
  278. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/app/README.md +0 -0
  279. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/app/__init__.py +0 -0
  280. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/app/logging/__init__.py +0 -0
  281. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/bundled_docs/README.md +0 -0
  282. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/bundled_docs/__init__.py +0 -0
  283. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/bundled_docs/getting-started.md +0 -0
  284. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cache/demo.py +0 -0
  285. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cache/tags.py +0 -0
  286. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cli/__main__.py +0 -0
  287. {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
  288. {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
  289. {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
  290. {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
  291. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cli/cmds/dx/__init__.py +0 -0
  292. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cli/cmds/health/__init__.py +0 -0
  293. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cli/cmds/health/health_cmds.py +0 -0
  294. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cli/cmds/help.py +0 -0
  295. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/cli/cmds/jobs/__init__.py +0 -0
  296. {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
  297. {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
  298. {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
  299. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/__init__.py +0 -0
  300. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/inbox.py +0 -0
  301. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/nosql/base.py +0 -0
  302. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/nosql/mongo/README.md +0 -0
  303. {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
  304. {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
  305. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/nosql/mongo/templates/documents.py.tmpl +0 -0
  306. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/nosql/mongo/templates/resources.py.tmpl +0 -0
  307. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/nosql/mongo/templates/schemas.py.tmpl +0 -0
  308. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/sql/README.md +0 -0
  309. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/sql/__init__.py +0 -0
  310. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/sql/base.py +0 -0
  311. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/sql/templates/__init__.py +0 -0
  312. {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
  313. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/sql/templates/models_schemas/auth/models.py.tmpl +0 -0
  314. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/sql/templates/models_schemas/auth/schemas.py.tmpl +0 -0
  315. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/sql/templates/models_schemas/entity/models.py.tmpl +0 -0
  316. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/sql/templates/models_schemas/entity/schemas.py.tmpl +0 -0
  317. {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
  318. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/sql/templates/setup/alembic.ini.tmpl +0 -0
  319. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/sql/templates/setup/env_async.py.tmpl +0 -0
  320. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/sql/templates/setup/env_sync.py.tmpl +0 -0
  321. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/sql/templates/setup/script.py.mako.tmpl +0 -0
  322. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/sql/types.py +0 -0
  323. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/db/sql/versioning.py +0 -0
  324. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/documents/__init__.py +0 -0
  325. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/exceptions.py +0 -0
  326. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/http/__init__.py +0 -0
  327. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/jobs/easy.py +0 -0
  328. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/loaders/__init__.py +0 -0
  329. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/loaders/models.py +0 -0
  330. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/__init__.py +0 -0
  331. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/grafana/dashboards/http-overview.json +0 -0
  332. {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
  333. {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
  334. {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
  335. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/providers/compose_cloud/templates/agent.yaml.tmpl +0 -0
  336. {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
  337. {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
  338. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/providers/grafana/dashboards/00_overview.json +0 -0
  339. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/providers/grafana/dashboards/10_http.json +0 -0
  340. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/providers/grafana/dashboards/20_db.json +0 -0
  341. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/providers/grafana/dashboards/30_runtime.json +0 -0
  342. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/providers/grafana/dashboards/40_clients.json +0 -0
  343. {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
  344. {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
  345. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/providers/grafana/templates/docker-compose.yml.tmpl +0 -0
  346. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/providers/grafana/templates/prometheus.yml.tmpl +0 -0
  347. {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
  348. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/providers/grafana/templates/provisioning/dashboards.yml +0 -0
  349. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/providers/grafana/templates/provisioning/datasource.yml +0 -0
  350. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/templates/grafana_dashboard.json +0 -0
  351. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/templates/prometheus_rules.yml +0 -0
  352. {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
  353. {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
  354. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/templates/sidecars/compose/agent.yaml +0 -0
  355. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/templates/sidecars/compose/docker-compose.yml +0 -0
  356. {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
  357. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/templates/sidecars/fly/agent.yaml +0 -0
  358. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/templates/sidecars/fly/fly.toml.fragment +0 -0
  359. {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
  360. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/templates/sidecars/k8s/configmap.yaml +0 -0
  361. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/templates/sidecars/k8s/deployment.yaml +0 -0
  362. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/templates/sidecars/railway/Dockerfile +0 -0
  363. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/templates/sidecars/railway/README.md +0 -0
  364. {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
  365. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/obs/templates/sidecars/railway/agent.yaml +0 -0
  366. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/py.typed +0 -0
  367. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/security/headers.py +0 -0
  368. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/storage/__init__.py +0 -0
  369. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/storage/backends/__init__.py +0 -0
  370. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/websocket/__init__.py +0 -0
  371. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/websocket/easy.py +0 -0
  372. {svc_infra-0.1.704 → svc_infra-1.6.1}/src/svc_infra/websocket/exceptions.py +0 -0
  373. {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: 0.1.704
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 :: 4 - Beta
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
- Requires-Dist: adyen (>=10.0.0)
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://github.com/your-org/svc-infra#readme
74
- Project-URL: Homepage, https://github.com/your-org/svc-infra
75
- Project-URL: Issues, https://github.com/your-org/svc-infra/issues
76
- Project-URL: Repository, https://github.com/your-org/svc-infra
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
- ### Production-ready FastAPI infrastructure in one import
87
+ **Production-ready FastAPI infrastructure in one import.**
84
88
 
85
- [![PyPI](https://img.shields.io/pypi/v/svc-infra.svg)](https://pypi.org/project/svc-infra/) [![Python 3.11+](https://img.shields.io/badge/python-3.11+-blue.svg)](https://www.python.org/downloads/) [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](https://opensource.org/licenses/MIT) [![Downloads](https://static.pepy.tech/badge/svc-infra/month)](https://pepy.tech/project/svc-infra)
89
+ [![PyPI](https://img.shields.io/pypi/v/svc-infra.svg)](https://pypi.org/project/svc-infra/)
90
+ [![CI](https://github.com/nfraxlab/svc-infra/actions/workflows/ci.yml/badge.svg)](https://github.com/nfraxlab/svc-infra/actions/workflows/ci.yml)
91
+ [![Python](https://img.shields.io/pypi/pyversions/svc-infra.svg)](https://pypi.org/project/svc-infra/)
92
+ [![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
86
93
 
87
- **Stop rebuilding auth, billing, webhooks, and background jobs for every project.**
94
+ ## Overview
88
95
 
89
- [Documentation](docs/) · [Examples](examples/) · [PyPI](https://pypi.org/project/svc-infra/)
96
+ Stop rebuilding auth, billing, webhooks, and background jobs for every project.
90
97
 
91
- </div>
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
- # Health checks, CORS, security headers, structured logging
106
- # Prometheus metrics, OpenTelemetry tracing
107
- # Request IDs, idempotency middleware
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
- ## Quick Install
123
+ ## Quick Install
112
124
 
113
125
  ```bash
114
126
  pip install svc-infra
115
127
  ```
116
128
 
117
- ## 🎯 What's Included
129
+ ## What's Included
118
130
 
119
131
  | Feature | What You Get | One-liner |
120
132
  |---------|-------------|-----------|
121
- | **🔐 Auth** | JWT, sessions, OAuth/OIDC, MFA, API keys | `add_auth_users(app)` |
122
- | **💳 Billing** | Usage tracking, subscriptions, invoices, Stripe sync | `add_billing(app)` |
123
- | **📦 Database** | PostgreSQL + MongoDB, migrations, inbox/outbox | `add_sql_db(app)` |
124
- | **⚡ Jobs** | Background tasks, scheduling, retries, DLQ | `easy_jobs()` |
125
- | **🔗 Webhooks** | Subscriptions, HMAC signing, delivery retries | `add_webhooks(app)` |
126
- | **💾 Cache** | Redis/memory, decorators, namespacing | `init_cache()` |
127
- | **📊 Observability** | Prometheus, Grafana dashboards, OTEL | Built-in |
128
- | **📁 Storage** | S3, local, memory backends | `add_storage(app)` |
129
- | **🏢 Multi-tenancy** | Tenant isolation, scoped queries | Built-in |
130
- | **🚦 Rate Limiting** | Per-user, per-endpoint, headers | Built-in |
131
-
132
- ## 🚀 30-Second Example
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
- ## 📚 Feature Highlights
179
+ ## Feature Highlights
168
180
 
169
- ### 🔐 Authentication & Security
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
- ### 💳 Usage-Based Billing
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
- ### Background Jobs
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
- ### 🔗 Webhooks
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
- ### 📊 Observability
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
- ## ⚙️ Configuration
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
- ## 📖 Documentation
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
- ## 🏃 Running the Example
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
- ## 🤝 Related Packages
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
- ## 📄 License
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 with ❤️ by [nfraxlab](https://github.com/nfraxlab)**
357
+ **Built by [nfraxlab](https://github.com/nfraxlab)**
346
358
 
347
- [Star us on GitHub](https://github.com/nfraxlab/svc-infra) · [📦 View on PyPI](https://pypi.org/project/svc-infra/)
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
- ### Production-ready FastAPI infrastructure in one import
3
+ **Production-ready FastAPI infrastructure in one import.**
6
4
 
7
- [![PyPI](https://img.shields.io/pypi/v/svc-infra.svg)](https://pypi.org/project/svc-infra/) [![Python 3.11+](https://img.shields.io/badge/python-3.11+-blue.svg)](https://www.python.org/downloads/) [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](https://opensource.org/licenses/MIT) [![Downloads](https://static.pepy.tech/badge/svc-infra/month)](https://pepy.tech/project/svc-infra)
5
+ [![PyPI](https://img.shields.io/pypi/v/svc-infra.svg)](https://pypi.org/project/svc-infra/)
6
+ [![CI](https://github.com/nfraxlab/svc-infra/actions/workflows/ci.yml/badge.svg)](https://github.com/nfraxlab/svc-infra/actions/workflows/ci.yml)
7
+ [![Python](https://img.shields.io/pypi/pyversions/svc-infra.svg)](https://pypi.org/project/svc-infra/)
8
+ [![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
8
9
 
9
- **Stop rebuilding auth, billing, webhooks, and background jobs for every project.**
10
+ ## Overview
10
11
 
11
- [Documentation](docs/) · [Examples](examples/) · [PyPI](https://pypi.org/project/svc-infra/)
12
+ Stop rebuilding auth, billing, webhooks, and background jobs for every project.
12
13
 
13
- </div>
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
- # Health checks, CORS, security headers, structured logging
28
- # Prometheus metrics, OpenTelemetry tracing
29
- # Request IDs, idempotency middleware
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
- ## Quick Install
39
+ ## Quick Install
34
40
 
35
41
  ```bash
36
42
  pip install svc-infra
37
43
  ```
38
44
 
39
- ## 🎯 What's Included
45
+ ## What's Included
40
46
 
41
47
  | Feature | What You Get | One-liner |
42
48
  |---------|-------------|-----------|
43
- | **🔐 Auth** | JWT, sessions, OAuth/OIDC, MFA, API keys | `add_auth_users(app)` |
44
- | **💳 Billing** | Usage tracking, subscriptions, invoices, Stripe sync | `add_billing(app)` |
45
- | **📦 Database** | PostgreSQL + MongoDB, migrations, inbox/outbox | `add_sql_db(app)` |
46
- | **⚡ Jobs** | Background tasks, scheduling, retries, DLQ | `easy_jobs()` |
47
- | **🔗 Webhooks** | Subscriptions, HMAC signing, delivery retries | `add_webhooks(app)` |
48
- | **💾 Cache** | Redis/memory, decorators, namespacing | `init_cache()` |
49
- | **📊 Observability** | Prometheus, Grafana dashboards, OTEL | Built-in |
50
- | **📁 Storage** | S3, local, memory backends | `add_storage(app)` |
51
- | **🏢 Multi-tenancy** | Tenant isolation, scoped queries | Built-in |
52
- | **🚦 Rate Limiting** | Per-user, per-endpoint, headers | Built-in |
53
-
54
- ## 🚀 30-Second Example
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
- ## 📚 Feature Highlights
95
+ ## Feature Highlights
90
96
 
91
- ### 🔐 Authentication & Security
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
- ### 💳 Usage-Based Billing
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
- ### Background Jobs
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
- ### 🔗 Webhooks
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
- ### 📊 Observability
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
- ## ⚙️ Configuration
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
- ## 📖 Documentation
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
- ## 🏃 Running the Example
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
- ## 🤝 Related Packages
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
- ## 📄 License
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 with ❤️ by [nfraxlab](https://github.com/nfraxlab)**
273
+ **Built by [nfraxlab](https://github.com/nfraxlab)**
268
274
 
269
- [Star us on GitHub](https://github.com/nfraxlab/svc-infra) · [📦 View on PyPI](https://pypi.org/project/svc-infra/)
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 = "0.1.704"
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 :: 4 - Beta",
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/your-org/svc-infra"
34
- Repository = "https://github.com/your-org/svc-infra"
35
- Issues = "https://github.com/your-org/svc-infra/issues"
36
- Documentation = "https://github.com/your-org/svc-infra#readme"
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 (choose either psycopg2 or psycopg2-binary—here we pick binary)
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"