svc-infra 0.1.709__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 (367) hide show
  1. {svc_infra-0.1.709 → svc_infra-1.0.5}/PKG-INFO +11 -5
  2. {svc_infra-0.1.709 → svc_infra-1.0.5}/README.md +9 -3
  3. {svc_infra-0.1.709 → svc_infra-1.0.5}/pyproject.toml +79 -2
  4. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/apf_payments/models.py +47 -108
  5. svc_infra-1.0.5/src/svc_infra/apf_payments/provider/__init__.py +4 -0
  6. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/apf_payments/provider/aiydan.py +42 -100
  7. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/apf_payments/provider/base.py +10 -26
  8. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/apf_payments/provider/registry.py +3 -5
  9. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/apf_payments/provider/stripe.py +63 -135
  10. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/apf_payments/schemas.py +82 -90
  11. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/apf_payments/service.py +40 -86
  12. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/apf_payments/settings.py +10 -13
  13. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/__init__.py +19 -0
  14. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/admin/add.py +13 -18
  15. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/apf_payments/router.py +47 -84
  16. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/apf_payments/setup.py +7 -13
  17. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/__init__.py +1 -1
  18. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/_cookies.py +3 -9
  19. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/add.py +4 -8
  20. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/gaurd.py +9 -26
  21. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/mfa/models.py +4 -7
  22. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/mfa/pre_auth.py +3 -3
  23. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/mfa/router.py +9 -15
  24. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/mfa/security.py +3 -5
  25. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/mfa/utils.py +3 -2
  26. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/mfa/verify.py +2 -9
  27. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/providers.py +4 -6
  28. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/routers/apikey_router.py +16 -18
  29. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/routers/oauth_router.py +37 -85
  30. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/routers/session_router.py +3 -6
  31. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/security.py +17 -28
  32. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/sender.py +1 -3
  33. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/settings.py +18 -19
  34. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/state.py +6 -7
  35. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/ws_security.py +2 -2
  36. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/billing/router.py +6 -8
  37. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/db/http.py +10 -11
  38. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/db/nosql/mongo/add.py +5 -15
  39. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/db/nosql/mongo/crud_router.py +14 -15
  40. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/db/sql/add.py +6 -14
  41. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/db/sql/crud_router.py +27 -40
  42. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/db/sql/health.py +1 -3
  43. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/db/sql/session.py +4 -5
  44. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/db/sql/users.py +8 -11
  45. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/dependencies/ratelimit.py +4 -6
  46. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/docs/add.py +13 -23
  47. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/docs/landing.py +6 -8
  48. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/docs/scoped.py +34 -42
  49. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/dual/dualize.py +1 -1
  50. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/dual/protected.py +12 -21
  51. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/dual/router.py +14 -31
  52. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/ease.py +57 -13
  53. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/http/conditional.py +3 -5
  54. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/middleware/errors/catchall.py +2 -6
  55. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/middleware/errors/exceptions.py +1 -4
  56. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/middleware/errors/handlers.py +12 -18
  57. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/middleware/graceful_shutdown.py +4 -13
  58. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/middleware/idempotency.py +11 -16
  59. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/middleware/idempotency_store.py +14 -14
  60. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/middleware/optimistic_lock.py +5 -8
  61. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/middleware/ratelimit.py +8 -8
  62. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/middleware/ratelimit_store.py +7 -8
  63. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/middleware/request_id.py +1 -3
  64. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/middleware/timeout.py +9 -10
  65. svc_infra-1.0.5/src/svc_infra/api/fastapi/object_router.py +1060 -0
  66. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/openapi/apply.py +5 -6
  67. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/openapi/conventions.py +4 -4
  68. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/openapi/mutators.py +13 -31
  69. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/openapi/pipeline.py +2 -2
  70. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/openapi/responses.py +4 -6
  71. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/openapi/security.py +1 -3
  72. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/ops/add.py +7 -9
  73. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/pagination.py +25 -37
  74. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/routers/__init__.py +16 -38
  75. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/setup.py +13 -31
  76. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/tenancy/add.py +3 -2
  77. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/tenancy/context.py +8 -7
  78. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/versioned.py +3 -2
  79. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/app/env.py +5 -7
  80. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/app/logging/add.py +2 -1
  81. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/app/logging/filter.py +1 -1
  82. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/app/logging/formats.py +3 -2
  83. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/app/root.py +3 -3
  84. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/billing/__init__.py +2 -8
  85. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/billing/async_service.py +5 -8
  86. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/billing/jobs.py +23 -33
  87. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/billing/models.py +21 -52
  88. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/billing/quotas.py +5 -7
  89. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/billing/schemas.py +4 -6
  90. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cache/__init__.py +12 -5
  91. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cache/add.py +6 -9
  92. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cache/backend.py +6 -5
  93. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cache/decorators.py +17 -28
  94. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cache/keys.py +2 -2
  95. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cache/recache.py +22 -35
  96. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cache/resources.py +8 -16
  97. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cache/ttl.py +2 -3
  98. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cache/utils.py +5 -6
  99. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/__init__.py +4 -12
  100. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/db/nosql/mongo/mongo_cmds.py +11 -10
  101. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/db/nosql/mongo/mongo_scaffold_cmds.py +6 -9
  102. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/db/ops_cmds.py +3 -6
  103. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/db/sql/alembic_cmds.py +24 -41
  104. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/db/sql/sql_export_cmds.py +9 -17
  105. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/db/sql/sql_scaffold_cmds.py +10 -10
  106. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/docs/docs_cmds.py +7 -10
  107. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/dx/dx_cmds.py +5 -11
  108. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/jobs/jobs_cmds.py +2 -7
  109. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/obs/obs_cmds.py +4 -7
  110. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/sdk/sdk_cmds.py +5 -15
  111. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/foundation/runner.py +6 -11
  112. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/foundation/typer_bootstrap.py +1 -2
  113. svc_infra-1.0.5/src/svc_infra/data/__init__.py +83 -0
  114. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/data/add.py +5 -5
  115. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/data/backup.py +8 -10
  116. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/data/erasure.py +3 -2
  117. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/data/fixtures.py +3 -3
  118. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/data/retention.py +8 -13
  119. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/crud_schema.py +9 -8
  120. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/nosql/__init__.py +0 -1
  121. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/nosql/constants.py +1 -1
  122. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/nosql/core.py +7 -14
  123. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/nosql/indexes.py +11 -10
  124. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/nosql/management.py +3 -3
  125. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/nosql/mongo/client.py +3 -3
  126. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/nosql/mongo/settings.py +2 -6
  127. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/nosql/repository.py +27 -28
  128. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/nosql/resource.py +15 -20
  129. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/nosql/scaffold.py +13 -17
  130. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/nosql/service.py +3 -4
  131. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/nosql/service_with_hooks.py +4 -3
  132. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/nosql/types.py +2 -6
  133. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/nosql/utils.py +4 -4
  134. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/ops.py +14 -18
  135. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/outbox.py +15 -18
  136. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/apikey.py +12 -21
  137. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/authref.py +3 -7
  138. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/constants.py +9 -9
  139. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/core.py +11 -11
  140. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/management.py +2 -6
  141. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/repository.py +17 -24
  142. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/resource.py +14 -13
  143. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/scaffold.py +13 -17
  144. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/service.py +7 -16
  145. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/service_with_hooks.py +4 -3
  146. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/tenant.py +6 -14
  147. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/uniq.py +8 -7
  148. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/uniq_hooks.py +14 -19
  149. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/utils.py +24 -53
  150. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/utils.py +3 -3
  151. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/deploy/__init__.py +8 -15
  152. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/documents/add.py +7 -8
  153. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/documents/ease.py +8 -8
  154. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/documents/models.py +3 -3
  155. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/documents/storage.py +11 -13
  156. svc_infra-1.0.5/src/svc_infra/dx/__init__.py +58 -0
  157. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/dx/add.py +1 -3
  158. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/dx/changelog.py +2 -2
  159. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/dx/checks.py +1 -1
  160. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/health/__init__.py +15 -16
  161. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/http/client.py +10 -14
  162. svc_infra-1.0.5/src/svc_infra/jobs/__init__.py +79 -0
  163. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/jobs/builtins/outbox_processor.py +3 -5
  164. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/jobs/builtins/webhook_delivery.py +1 -3
  165. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/jobs/loader.py +4 -5
  166. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/jobs/queue.py +14 -24
  167. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/jobs/redis_queue.py +20 -34
  168. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/jobs/runner.py +7 -11
  169. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/jobs/scheduler.py +5 -5
  170. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/jobs/worker.py +1 -1
  171. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/loaders/base.py +5 -4
  172. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/loaders/github.py +1 -3
  173. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/loaders/url.py +3 -9
  174. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/logging/__init__.py +7 -6
  175. svc_infra-1.0.5/src/svc_infra/mcp/__init__.py +82 -0
  176. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/mcp/svc_infra_mcp.py +2 -2
  177. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/add.py +4 -3
  178. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/cloud_dash.py +1 -1
  179. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/metrics/__init__.py +3 -3
  180. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/metrics/asgi.py +9 -14
  181. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/metrics/base.py +13 -13
  182. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/metrics/http.py +5 -9
  183. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/metrics/sqlalchemy.py +9 -12
  184. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/metrics.py +3 -3
  185. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/settings.py +2 -6
  186. svc_infra-1.0.5/src/svc_infra/resilience/__init__.py +44 -0
  187. svc_infra-1.0.5/src/svc_infra/resilience/circuit_breaker.py +328 -0
  188. svc_infra-1.0.5/src/svc_infra/resilience/retry.py +289 -0
  189. svc_infra-1.0.5/src/svc_infra/security/__init__.py +167 -0
  190. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/security/add.py +5 -9
  191. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/security/audit.py +14 -17
  192. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/security/audit_service.py +9 -9
  193. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/security/hibp.py +3 -6
  194. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/security/jwt_rotation.py +7 -10
  195. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/security/lockout.py +12 -11
  196. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/security/models.py +37 -46
  197. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/security/oauth_models.py +8 -8
  198. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/security/org_invites.py +11 -13
  199. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/security/passwords.py +4 -6
  200. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/security/permissions.py +8 -7
  201. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/security/session.py +6 -7
  202. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/security/signed_cookies.py +9 -9
  203. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/storage/add.py +5 -8
  204. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/storage/backends/local.py +13 -21
  205. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/storage/backends/memory.py +4 -7
  206. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/storage/backends/s3.py +17 -36
  207. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/storage/base.py +2 -2
  208. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/storage/easy.py +4 -8
  209. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/storage/settings.py +16 -18
  210. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/testing/__init__.py +36 -39
  211. svc_infra-1.0.5/src/svc_infra/utils.py +188 -0
  212. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/webhooks/__init__.py +1 -1
  213. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/webhooks/add.py +17 -29
  214. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/webhooks/encryption.py +2 -2
  215. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/webhooks/fastapi.py +2 -4
  216. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/webhooks/router.py +3 -3
  217. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/webhooks/service.py +5 -6
  218. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/webhooks/signing.py +5 -5
  219. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/websocket/add.py +2 -3
  220. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/websocket/client.py +3 -2
  221. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/websocket/config.py +6 -18
  222. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/websocket/manager.py +9 -10
  223. svc_infra-0.1.709/src/svc_infra/apf_payments/provider/__init__.py +0 -4
  224. svc_infra-0.1.709/src/svc_infra/billing/service.py +0 -157
  225. svc_infra-0.1.709/src/svc_infra/obs/templates/sidecars/railway/__init__.py +0 -0
  226. svc_infra-0.1.709/src/svc_infra/utils.py +0 -27
  227. {svc_infra-0.1.709 → svc_infra-1.0.5}/LICENSE +0 -0
  228. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/__init__.py +0 -0
  229. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/apf_payments/README.md +0 -0
  230. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/apf_payments/__init__.py +0 -0
  231. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/apf_payments/alembic.py +0 -0
  232. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/__init__.py +13 -13
  233. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/admin/__init__.py +0 -0
  234. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/apf_payments/__init__.py +0 -0
  235. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/mfa/__init__.py +0 -0
  236. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/policy.py +0 -0
  237. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/routers/__init__.py +0 -0
  238. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/routers/account.py +0 -0
  239. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/billing/setup.py +0 -0
  240. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/cache/__init__.py +0 -0
  241. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/cache/add.py +0 -0
  242. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/db/__init__.py +0 -0
  243. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/db/nosql/__init__.py +0 -0
  244. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/db/nosql/mongo/__init__.py +0 -0
  245. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/db/nosql/mongo/health.py +0 -0
  246. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/db/sql/README.md +0 -0
  247. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/db/sql/__init__.py +0 -0
  248. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/docs/__init__.py +0 -0
  249. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/dual/__init__.py +0 -0
  250. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/dual/public.py +0 -0
  251. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/dual/utils.py +0 -0
  252. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/dx.py +0 -0
  253. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/http/__init__.py +0 -0
  254. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/http/concurrency.py +0 -0
  255. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/http/deprecation.py +0 -0
  256. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/middleware/__init__.py +0 -0
  257. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/middleware/debug.py +0 -0
  258. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/middleware/errors/__init__.py +0 -0
  259. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/middleware/request_size_limit.py +0 -0
  260. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/openapi/__init__.py +0 -0
  261. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/openapi/models.py +0 -0
  262. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/paths/__init__.py +0 -0
  263. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/paths/auth.py +0 -0
  264. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/paths/generic.py +0 -0
  265. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/paths/prefix.py +0 -0
  266. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/paths/user.py +0 -0
  267. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/routers/ping.py +0 -0
  268. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/app/README.md +0 -0
  269. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/app/__init__.py +0 -0
  270. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/app/logging/__init__.py +0 -0
  271. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/bundled_docs/README.md +0 -0
  272. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/bundled_docs/__init__.py +0 -0
  273. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/bundled_docs/getting-started.md +0 -0
  274. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cache/README.md +0 -0
  275. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cache/demo.py +0 -0
  276. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cache/tags.py +0 -0
  277. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/__main__.py +0 -0
  278. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/__init__.py +0 -0
  279. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/db/__init__.py +0 -0
  280. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/db/nosql/__init__.py +0 -0
  281. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/db/nosql/mongo/README.md +0 -0
  282. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/db/nosql/mongo/__init__.py +0 -0
  283. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/db/sql/__init__.py +0 -0
  284. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/dx/__init__.py +0 -0
  285. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/health/__init__.py +0 -0
  286. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/health/health_cmds.py +0 -0
  287. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/help.py +0 -0
  288. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/jobs/__init__.py +0 -0
  289. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/obs/__init__.py +0 -0
  290. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/sdk/__init__.py +0 -0
  291. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/foundation/__init__.py +0 -0
  292. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/__init__.py +0 -0
  293. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/inbox.py +0 -0
  294. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/nosql/base.py +0 -0
  295. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/nosql/mongo/README.md +0 -0
  296. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/nosql/mongo/__init__.py +0 -0
  297. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/nosql/mongo/templates/__init__.py +0 -0
  298. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/nosql/mongo/templates/documents.py.tmpl +0 -0
  299. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/nosql/mongo/templates/resources.py.tmpl +0 -0
  300. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/nosql/mongo/templates/schemas.py.tmpl +0 -0
  301. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/README.md +0 -0
  302. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/__init__.py +0 -0
  303. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/base.py +0 -0
  304. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/templates/__init__.py +0 -0
  305. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/templates/models_schemas/__init__.py +0 -0
  306. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/templates/models_schemas/auth/models.py.tmpl +0 -0
  307. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/templates/models_schemas/auth/schemas.py.tmpl +0 -0
  308. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/templates/models_schemas/entity/models.py.tmpl +0 -0
  309. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/templates/models_schemas/entity/schemas.py.tmpl +0 -0
  310. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/templates/setup/__init__.py +0 -0
  311. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/templates/setup/alembic.ini.tmpl +0 -0
  312. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/templates/setup/env_async.py.tmpl +0 -0
  313. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/templates/setup/env_sync.py.tmpl +0 -0
  314. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/templates/setup/script.py.mako.tmpl +0 -0
  315. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/types.py +0 -0
  316. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/versioning.py +0 -0
  317. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/documents/__init__.py +0 -0
  318. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/exceptions.py +0 -0
  319. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/http/__init__.py +0 -0
  320. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/jobs/easy.py +0 -0
  321. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/loaders/__init__.py +0 -0
  322. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/loaders/models.py +0 -0
  323. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/README.md +0 -0
  324. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/__init__.py +0 -0
  325. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/grafana/dashboards/http-overview.json +0 -0
  326. {svc_infra-0.1.709/src/svc_infra/mcp → svc_infra-1.0.5/src/svc_infra/obs/providers}/__init__.py +0 -0
  327. {svc_infra-0.1.709/src/svc_infra/obs/providers → svc_infra-1.0.5/src/svc_infra/obs/providers/compose_cloud}/__init__.py +0 -0
  328. {svc_infra-0.1.709/src/svc_infra/obs/providers/compose_cloud → svc_infra-1.0.5/src/svc_infra/obs/providers/compose_cloud/templates}/__init__.py +0 -0
  329. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/providers/compose_cloud/templates/agent.yaml.tmpl +0 -0
  330. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/providers/compose_cloud/templates/docker-compose.cloud.yml.tmpl +0 -0
  331. {svc_infra-0.1.709/src/svc_infra/obs/providers/compose_cloud/templates → svc_infra-1.0.5/src/svc_infra/obs/providers/grafana}/__init__.py +0 -0
  332. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/providers/grafana/dashboards/00_overview.json +0 -0
  333. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/providers/grafana/dashboards/10_http.json +0 -0
  334. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/providers/grafana/dashboards/20_db.json +0 -0
  335. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/providers/grafana/dashboards/30_runtime.json +0 -0
  336. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/providers/grafana/dashboards/40_clients.json +0 -0
  337. {svc_infra-0.1.709/src/svc_infra/obs/providers/grafana → svc_infra-1.0.5/src/svc_infra/obs/providers/grafana/dashboards}/__init__.py +0 -0
  338. {svc_infra-0.1.709/src/svc_infra/obs/providers/grafana/dashboards → svc_infra-1.0.5/src/svc_infra/obs/providers/grafana/templates}/__init__.py +0 -0
  339. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/providers/grafana/templates/docker-compose.yml.tmpl +0 -0
  340. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/providers/grafana/templates/prometheus.yml.tmpl +0 -0
  341. {svc_infra-0.1.709/src/svc_infra/obs/providers/grafana/templates → svc_infra-1.0.5/src/svc_infra/obs/providers/grafana/templates/provisioning}/__init__.py +0 -0
  342. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/providers/grafana/templates/provisioning/dashboards.yml +0 -0
  343. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/providers/grafana/templates/provisioning/datasource.yml +0 -0
  344. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/templates/grafana_dashboard.json +0 -0
  345. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/templates/prometheus_rules.yml +0 -0
  346. {svc_infra-0.1.709/src/svc_infra/obs/providers/grafana/templates/provisioning → svc_infra-1.0.5/src/svc_infra/obs/templates/sidecars}/__init__.py +0 -0
  347. {svc_infra-0.1.709/src/svc_infra/obs/templates/sidecars → svc_infra-1.0.5/src/svc_infra/obs/templates/sidecars/compose}/__init__.py +0 -0
  348. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/templates/sidecars/compose/agent.yaml +0 -0
  349. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/templates/sidecars/compose/docker-compose.yml +0 -0
  350. {svc_infra-0.1.709/src/svc_infra/obs/templates/sidecars/compose → svc_infra-1.0.5/src/svc_infra/obs/templates/sidecars/fly}/__init__.py +0 -0
  351. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/templates/sidecars/fly/agent.yaml +0 -0
  352. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/templates/sidecars/fly/fly.toml.fragment +0 -0
  353. {svc_infra-0.1.709/src/svc_infra/obs/templates/sidecars/fly → svc_infra-1.0.5/src/svc_infra/obs/templates/sidecars/k8s}/__init__.py +0 -0
  354. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/templates/sidecars/k8s/configmap.yaml +0 -0
  355. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/templates/sidecars/k8s/deployment.yaml +0 -0
  356. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/templates/sidecars/railway/Dockerfile +0 -0
  357. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/templates/sidecars/railway/README.md +0 -0
  358. {svc_infra-0.1.709/src/svc_infra/obs/templates/sidecars/k8s → svc_infra-1.0.5/src/svc_infra/obs/templates/sidecars/railway}/__init__.py +0 -0
  359. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/templates/sidecars/railway/agent.yaml +0 -0
  360. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/py.typed +0 -0
  361. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/security/headers.py +0 -0
  362. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/storage/__init__.py +0 -0
  363. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/storage/backends/__init__.py +0 -0
  364. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/websocket/__init__.py +0 -0
  365. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/websocket/easy.py +0 -0
  366. {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/websocket/exceptions.py +0 -0
  367. {svc_infra-0.1.709 → 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.709
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
@@ -86,13 +86,19 @@ Description-Content-Type: text/markdown
86
86
 
87
87
  # svc-infra
88
88
 
89
- ### 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)
90
96
 
91
- [![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
92
98
 
93
99
  **Stop rebuilding auth, billing, webhooks, and background jobs for every project.**
94
100
 
95
- [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)
96
102
 
97
103
  </div>
98
104
 
@@ -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
 
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "svc-infra"
3
- version = "0.1.709"
3
+ version = "1.0.5"
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",
@@ -118,6 +118,7 @@ s3 = ["aioboto3"]
118
118
  [tool.poetry.group.dev.dependencies]
119
119
  pytest = ">=8.0.0"
120
120
  pytest-asyncio = ">=0.23.0"
121
+ pytest-cov = ">=4.0.0"
121
122
  ruff = ">=0.6.0"
122
123
  mypy = ">=1.10.0"
123
124
  types-requests = ">=2.31.0"
@@ -127,6 +128,7 @@ fakeredis = ">=2.20.0"
127
128
  moto = {extras = ["s3"], version = ">=5.0.0"}
128
129
  aiosqlite = ">=0.19.0" # Required for acceptance tests using SQLite
129
130
  pre-commit = ">=3.0.0"
131
+ bandit = ">=1.7.0"
130
132
  # Documentation
131
133
  mkdocs = ">=1.6.0"
132
134
  mkdocs-material = ">=9.5.0"
@@ -160,6 +162,81 @@ filterwarnings = [
160
162
  "ignore:The `route` decorator is deprecated:DeprecationWarning:starlette.*",
161
163
  ]
162
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
+
163
240
  [build-system]
164
241
  requires = ["poetry-core>=2.0.0,<3.0.0"]
165
242
  build-backend = "poetry.core.masonry.api"
@@ -1,7 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from datetime import datetime
4
- from typing import Optional
5
4
 
6
5
  from sqlalchemy import (
7
6
  JSON,
@@ -27,14 +26,10 @@ class PayCustomer(ModelBase):
27
26
  id: Mapped[str] = mapped_column(String(64), primary_key=True)
28
27
 
29
28
  # Tenant scoping
30
- tenant_id: Mapped[str] = mapped_column(
31
- String(TENANT_ID_LEN), index=True, nullable=False
32
- )
29
+ tenant_id: Mapped[str] = mapped_column(String(TENANT_ID_LEN), index=True, nullable=False)
33
30
 
34
31
  # Always typed to match the actual auth PK; FK is enforced at table level
35
- user_id: Mapped[Optional[str]] = mapped_column(
36
- user_id_type(), index=True, nullable=True
37
- )
32
+ user_id: Mapped[str | None] = mapped_column(user_id_type(), index=True, nullable=True)
38
33
 
39
34
  provider: Mapped[str] = mapped_column(String(32), index=True, nullable=False)
40
35
  provider_customer_id: Mapped[str] = mapped_column(
@@ -59,13 +54,9 @@ class PayIntent(ModelBase):
59
54
 
60
55
  id: Mapped[str] = mapped_column(String(64), primary_key=True)
61
56
 
62
- tenant_id: Mapped[str] = mapped_column(
63
- String(TENANT_ID_LEN), index=True, nullable=False
64
- )
57
+ tenant_id: Mapped[str] = mapped_column(String(TENANT_ID_LEN), index=True, nullable=False)
65
58
 
66
- user_id: Mapped[Optional[str]] = mapped_column(
67
- user_id_type(), index=True, nullable=True
68
- )
59
+ user_id: Mapped[str | None] = mapped_column(user_id_type(), index=True, nullable=True)
69
60
 
70
61
  provider: Mapped[str] = mapped_column(String(32), index=True, nullable=False)
71
62
  provider_intent_id: Mapped[str] = mapped_column(
@@ -74,13 +65,13 @@ class PayIntent(ModelBase):
74
65
  amount: Mapped[int] = mapped_column(Numeric(18, 0), nullable=False) # minor units
75
66
  currency: Mapped[str] = mapped_column(String(8), nullable=False)
76
67
  status: Mapped[str] = mapped_column(String(32), index=True, nullable=False)
77
- client_secret: Mapped[Optional[str]] = mapped_column(String(255))
68
+ client_secret: Mapped[str | None] = mapped_column(String(255))
78
69
  created_at: Mapped[datetime] = mapped_column(
79
70
  DateTime(timezone=True),
80
71
  server_default=text("CURRENT_TIMESTAMP"),
81
72
  nullable=False,
82
73
  )
83
- confirmed_at: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True))
74
+ confirmed_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True))
84
75
  captured: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False)
85
76
 
86
77
  __table_args__ = (
@@ -95,9 +86,7 @@ class PayEvent(ModelBase):
95
86
 
96
87
  id: Mapped[str] = mapped_column(String(64), primary_key=True)
97
88
 
98
- tenant_id: Mapped[str] = mapped_column(
99
- String(TENANT_ID_LEN), index=True, nullable=False
100
- )
89
+ tenant_id: Mapped[str] = mapped_column(String(TENANT_ID_LEN), index=True, nullable=False)
101
90
 
102
91
  provider: Mapped[str] = mapped_column(String(32), index=True, nullable=False)
103
92
  provider_event_id: Mapped[str] = mapped_column(
@@ -109,9 +98,7 @@ class PayEvent(ModelBase):
109
98
  server_default=text("CURRENT_TIMESTAMP"),
110
99
  nullable=False,
111
100
  )
112
- payload_json: Mapped[dict] = mapped_column(
113
- JSON, nullable=False
114
- ) # compact JSON string
101
+ payload_json: Mapped[dict] = mapped_column(JSON, nullable=False) # compact JSON string
115
102
 
116
103
 
117
104
  class LedgerEntry(ModelBase):
@@ -119,9 +106,7 @@ class LedgerEntry(ModelBase):
119
106
 
120
107
  id: Mapped[str] = mapped_column(String(64), primary_key=True)
121
108
 
122
- tenant_id: Mapped[str] = mapped_column(
123
- String(TENANT_ID_LEN), index=True, nullable=False
124
- )
109
+ tenant_id: Mapped[str] = mapped_column(String(TENANT_ID_LEN), index=True, nullable=False)
125
110
 
126
111
  ts: Mapped[datetime] = mapped_column(
127
112
  DateTime(timezone=True),
@@ -131,18 +116,12 @@ class LedgerEntry(ModelBase):
131
116
  )
132
117
 
133
118
  provider: Mapped[str] = mapped_column(String(32), index=True, nullable=False)
134
- provider_ref: Mapped[Optional[str]] = mapped_column(String(128), index=True)
135
- user_id: Mapped[Optional[str]] = mapped_column(
136
- user_id_type(), index=True, nullable=True
137
- )
119
+ provider_ref: Mapped[str | None] = mapped_column(String(128), index=True)
120
+ user_id: Mapped[str | None] = mapped_column(user_id_type(), index=True, nullable=True)
138
121
  amount: Mapped[int] = mapped_column(Numeric(18, 0), nullable=False)
139
122
  currency: Mapped[str] = mapped_column(String(8), nullable=False)
140
- kind: Mapped[str] = mapped_column(
141
- String(24), nullable=False
142
- ) # payment|refund|fee|payout...
143
- status: Mapped[str] = mapped_column(
144
- String(24), nullable=False
145
- ) # pending|posted|void
123
+ kind: Mapped[str] = mapped_column(String(24), nullable=False) # payment|refund|fee|payout...
124
+ status: Mapped[str] = mapped_column(String(24), nullable=False) # pending|posted|void
146
125
 
147
126
  __table_args__ = (
148
127
  user_fk_constraint("user_id", ondelete="SET NULL"),
@@ -163,24 +142,18 @@ class PayPaymentMethod(ModelBase):
163
142
 
164
143
  id: Mapped[str] = mapped_column(String(64), primary_key=True)
165
144
 
166
- tenant_id: Mapped[str] = mapped_column(
167
- String(TENANT_ID_LEN), index=True, nullable=False
168
- )
145
+ tenant_id: Mapped[str] = mapped_column(String(TENANT_ID_LEN), index=True, nullable=False)
169
146
 
170
- user_id: Mapped[Optional[str]] = mapped_column(
171
- user_id_type(), index=True, nullable=True
172
- )
147
+ user_id: Mapped[str | None] = mapped_column(user_id_type(), index=True, nullable=True)
173
148
  provider: Mapped[str] = mapped_column(String(32), index=True, nullable=False)
174
- provider_customer_id: Mapped[str] = mapped_column(
175
- String(128), index=True, nullable=False
176
- )
149
+ provider_customer_id: Mapped[str] = mapped_column(String(128), index=True, nullable=False)
177
150
  provider_method_id: Mapped[str] = mapped_column(
178
151
  String(128), unique=True, index=True, nullable=False
179
152
  )
180
- brand: Mapped[Optional[str]] = mapped_column(String(32))
181
- last4: Mapped[Optional[str]] = mapped_column(String(8))
182
- exp_month: Mapped[Optional[int]] = mapped_column(Numeric(2, 0))
183
- exp_year: Mapped[Optional[int]] = mapped_column(Numeric(4, 0))
153
+ brand: Mapped[str | None] = mapped_column(String(32))
154
+ last4: Mapped[str | None] = mapped_column(String(8))
155
+ exp_month: Mapped[int | None] = mapped_column(Numeric(2, 0))
156
+ exp_year: Mapped[int | None] = mapped_column(Numeric(4, 0))
184
157
  is_default: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False)
185
158
  created_at: Mapped[datetime] = mapped_column(
186
159
  DateTime(timezone=True),
@@ -204,9 +177,7 @@ class PayProduct(ModelBase):
204
177
 
205
178
  id: Mapped[str] = mapped_column(String(64), primary_key=True)
206
179
 
207
- tenant_id: Mapped[str] = mapped_column(
208
- String(TENANT_ID_LEN), index=True, nullable=False
209
- )
180
+ tenant_id: Mapped[str] = mapped_column(String(TENANT_ID_LEN), index=True, nullable=False)
210
181
 
211
182
  provider: Mapped[str] = mapped_column(String(32), index=True, nullable=False)
212
183
  provider_product_id: Mapped[str] = mapped_column(
@@ -226,23 +197,17 @@ class PayPrice(ModelBase):
226
197
 
227
198
  id: Mapped[str] = mapped_column(String(64), primary_key=True)
228
199
 
229
- tenant_id: Mapped[str] = mapped_column(
230
- String(TENANT_ID_LEN), index=True, nullable=False
231
- )
200
+ tenant_id: Mapped[str] = mapped_column(String(TENANT_ID_LEN), index=True, nullable=False)
232
201
 
233
202
  provider: Mapped[str] = mapped_column(String(32), index=True, nullable=False)
234
203
  provider_price_id: Mapped[str] = mapped_column(
235
204
  String(128), unique=True, index=True, nullable=False
236
205
  )
237
- provider_product_id: Mapped[str] = mapped_column(
238
- String(128), index=True, nullable=False
239
- )
206
+ provider_product_id: Mapped[str] = mapped_column(String(128), index=True, nullable=False)
240
207
  currency: Mapped[str] = mapped_column(String(8), nullable=False)
241
- unit_amount: Mapped[int] = mapped_column(
242
- Numeric(18, 0), nullable=False
243
- ) # minor units
244
- interval: Mapped[Optional[str]] = mapped_column(String(16)) # month|year|week|day
245
- trial_days: Mapped[Optional[int]] = mapped_column(Numeric(5, 0))
208
+ unit_amount: Mapped[int] = mapped_column(Numeric(18, 0), nullable=False) # minor units
209
+ interval: Mapped[str | None] = mapped_column(String(16)) # month|year|week|day
210
+ trial_days: Mapped[int | None] = mapped_column(Numeric(5, 0))
246
211
  active: Mapped[bool] = mapped_column(Boolean, default=True, nullable=False)
247
212
  created_at: Mapped[datetime] = mapped_column(
248
213
  DateTime(timezone=True),
@@ -256,33 +221,21 @@ class PaySubscription(ModelBase):
256
221
 
257
222
  id: Mapped[str] = mapped_column(String(64), primary_key=True)
258
223
 
259
- tenant_id: Mapped[str] = mapped_column(
260
- String(TENANT_ID_LEN), index=True, nullable=False
261
- )
224
+ tenant_id: Mapped[str] = mapped_column(String(TENANT_ID_LEN), index=True, nullable=False)
262
225
 
263
- user_id: Mapped[Optional[str]] = mapped_column(
264
- user_id_type(), index=True, nullable=True
265
- )
226
+ user_id: Mapped[str | None] = mapped_column(user_id_type(), index=True, nullable=True)
266
227
  provider: Mapped[str] = mapped_column(String(32), index=True, nullable=False)
267
- provider_customer_id: Mapped[str] = mapped_column(
268
- String(128), index=True, nullable=False
269
- )
228
+ provider_customer_id: Mapped[str] = mapped_column(String(128), index=True, nullable=False)
270
229
  provider_subscription_id: Mapped[str] = mapped_column(
271
230
  String(128), unique=True, index=True, nullable=False
272
231
  )
273
- provider_price_id: Mapped[str] = mapped_column(
274
- String(128), index=True, nullable=False
275
- )
232
+ provider_price_id: Mapped[str] = mapped_column(String(128), index=True, nullable=False)
276
233
  status: Mapped[str] = mapped_column(
277
234
  String(32), index=True, nullable=False
278
235
  ) # active|trialing|canceled|past_due|incomplete
279
236
  quantity: Mapped[int] = mapped_column(Numeric(10, 0), default=1, nullable=False)
280
- cancel_at_period_end: Mapped[bool] = mapped_column(
281
- Boolean, default=False, nullable=False
282
- )
283
- current_period_end: Mapped[Optional[datetime]] = mapped_column(
284
- DateTime(timezone=True)
285
- )
237
+ cancel_at_period_end: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False)
238
+ current_period_end: Mapped[datetime | None] = mapped_column(DateTime(timezone=True))
286
239
  created_at: Mapped[datetime] = mapped_column(
287
240
  DateTime(timezone=True),
288
241
  server_default=text("CURRENT_TIMESTAMP"),
@@ -305,27 +258,21 @@ class PayInvoice(ModelBase):
305
258
 
306
259
  id: Mapped[str] = mapped_column(String(64), primary_key=True)
307
260
 
308
- tenant_id: Mapped[str] = mapped_column(
309
- String(TENANT_ID_LEN), index=True, nullable=False
310
- )
261
+ tenant_id: Mapped[str] = mapped_column(String(TENANT_ID_LEN), index=True, nullable=False)
311
262
 
312
- user_id: Mapped[Optional[str]] = mapped_column(
313
- user_id_type(), index=True, nullable=True
314
- )
263
+ user_id: Mapped[str | None] = mapped_column(user_id_type(), index=True, nullable=True)
315
264
  provider: Mapped[str] = mapped_column(String(32), index=True, nullable=False)
316
265
  provider_invoice_id: Mapped[str] = mapped_column(
317
266
  String(128), unique=True, index=True, nullable=False
318
267
  )
319
- provider_customer_id: Mapped[str] = mapped_column(
320
- String(128), index=True, nullable=False
321
- )
268
+ provider_customer_id: Mapped[str] = mapped_column(String(128), index=True, nullable=False)
322
269
  status: Mapped[str] = mapped_column(
323
270
  String(24), index=True, nullable=False
324
271
  ) # draft|open|paid|void|uncollectible
325
272
  amount_due: Mapped[int] = mapped_column(Numeric(18, 0), nullable=False)
326
273
  currency: Mapped[str] = mapped_column(String(8), nullable=False)
327
- hosted_invoice_url: Mapped[Optional[str]] = mapped_column(String(255))
328
- pdf_url: Mapped[Optional[str]] = mapped_column(String(255))
274
+ hosted_invoice_url: Mapped[str | None] = mapped_column(String(255))
275
+ pdf_url: Mapped[str | None] = mapped_column(String(255))
329
276
  created_at: Mapped[datetime] = mapped_column(
330
277
  DateTime(timezone=True),
331
278
  server_default=text("CURRENT_TIMESTAMP"),
@@ -348,13 +295,9 @@ class PaySetupIntent(ModelBase):
348
295
 
349
296
  id: Mapped[str] = mapped_column(String(64), primary_key=True)
350
297
 
351
- tenant_id: Mapped[str] = mapped_column(
352
- String(TENANT_ID_LEN), index=True, nullable=False
353
- )
298
+ tenant_id: Mapped[str] = mapped_column(String(TENANT_ID_LEN), index=True, nullable=False)
354
299
 
355
- user_id: Mapped[Optional[str]] = mapped_column(
356
- user_id_type(), index=True, nullable=True
357
- )
300
+ user_id: Mapped[str | None] = mapped_column(user_id_type(), index=True, nullable=True)
358
301
  provider: Mapped[str] = mapped_column(String(32), index=True, nullable=False)
359
302
  provider_setup_intent_id: Mapped[str] = mapped_column(
360
303
  String(128), unique=True, index=True, nullable=False
@@ -362,7 +305,7 @@ class PaySetupIntent(ModelBase):
362
305
  status: Mapped[str] = mapped_column(
363
306
  String(32), index=True, nullable=False
364
307
  ) # requires_action|succeeded|canceled|processing
365
- client_secret: Mapped[Optional[str]] = mapped_column(String(255))
308
+ client_secret: Mapped[str | None] = mapped_column(String(255))
366
309
  created_at: Mapped[datetime] = mapped_column(
367
310
  DateTime(timezone=True),
368
311
  server_default=text("CURRENT_TIMESTAMP"),
@@ -380,22 +323,20 @@ class PayDispute(ModelBase):
380
323
 
381
324
  id: Mapped[str] = mapped_column(String(64), primary_key=True)
382
325
 
383
- tenant_id: Mapped[str] = mapped_column(
384
- String(TENANT_ID_LEN), index=True, nullable=False
385
- )
326
+ tenant_id: Mapped[str] = mapped_column(String(TENANT_ID_LEN), index=True, nullable=False)
386
327
 
387
328
  provider: Mapped[str] = mapped_column(String(32), index=True, nullable=False)
388
329
  provider_dispute_id: Mapped[str] = mapped_column(
389
330
  String(128), unique=True, index=True, nullable=False
390
331
  )
391
- provider_charge_id: Mapped[Optional[str]] = mapped_column(String(128), index=True)
332
+ provider_charge_id: Mapped[str | None] = mapped_column(String(128), index=True)
392
333
  amount: Mapped[int] = mapped_column(Numeric(18, 0), nullable=False)
393
334
  currency: Mapped[str] = mapped_column(String(8), nullable=False)
394
- reason: Mapped[Optional[str]] = mapped_column(String(64))
335
+ reason: Mapped[str | None] = mapped_column(String(64))
395
336
  status: Mapped[str] = mapped_column(
396
337
  String(32), index=True, nullable=False
397
338
  ) # needs_response|under_review|won|lost|warning_closed
398
- evidence_due_by: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True))
339
+ evidence_due_by: Mapped[datetime | None] = mapped_column(DateTime(timezone=True))
399
340
  created_at: Mapped[datetime] = mapped_column(
400
341
  DateTime(timezone=True),
401
342
  server_default=text("CURRENT_TIMESTAMP"),
@@ -408,9 +349,7 @@ class PayPayout(ModelBase):
408
349
 
409
350
  id: Mapped[str] = mapped_column(String(64), primary_key=True)
410
351
 
411
- tenant_id: Mapped[str] = mapped_column(
412
- String(TENANT_ID_LEN), index=True, nullable=False
413
- )
352
+ tenant_id: Mapped[str] = mapped_column(String(TENANT_ID_LEN), index=True, nullable=False)
414
353
 
415
354
  provider: Mapped[str] = mapped_column(String(32), index=True, nullable=False)
416
355
  provider_payout_id: Mapped[str] = mapped_column(
@@ -421,8 +360,8 @@ class PayPayout(ModelBase):
421
360
  status: Mapped[str] = mapped_column(
422
361
  String(32), index=True, nullable=False
423
362
  ) # pending|in_transit|paid|canceled|failed
424
- arrival_date: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True))
425
- type: Mapped[Optional[str]] = mapped_column(String(32)) # bank_account|card|...
363
+ arrival_date: Mapped[datetime | None] = mapped_column(DateTime(timezone=True))
364
+ type: Mapped[str | None] = mapped_column(String(32)) # bank_account|card|...
426
365
  created_at: Mapped[datetime] = mapped_column(
427
366
  DateTime(timezone=True),
428
367
  server_default=text("CURRENT_TIMESTAMP"),
@@ -0,0 +1,4 @@
1
+ from .aiydan import AiydanAdapter
2
+ from .stripe import StripeAdapter
3
+
4
+ __all__ = ["AiydanAdapter", "StripeAdapter"]