svc-infra 0.1.688__tar.gz → 1.0.5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of svc-infra might be problematic. Click here for more details.

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