domainkit 2.0.0__tar.gz → 2.1.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (669) hide show
  1. {domainkit-2.0.0 → domainkit-2.1.1}/PKG-INFO +39 -37
  2. {domainkit-2.0.0 → domainkit-2.1.1}/README.md +34 -34
  3. {domainkit-2.0.0 → domainkit-2.1.1}/pyproject.toml +8 -4
  4. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/apps/config.py +11 -1
  5. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/api.py +11 -1
  6. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/apps.py +3 -1
  7. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/cookies.py +16 -0
  8. domainkit-2.1.1/src/domainkit/contrib/auth/gates.py +104 -0
  9. domainkit-2.1.1/src/domainkit/contrib/auth/integration.py +84 -0
  10. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/mfa.py +32 -0
  11. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/recovery.py +35 -0
  12. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/sca.py +87 -23
  13. domainkit-2.1.1/src/domainkit/contrib/ciba/__init__.py +92 -0
  14. domainkit-2.1.1/src/domainkit/contrib/ciba/api.py +664 -0
  15. domainkit-2.1.1/src/domainkit/contrib/ciba/apps.py +173 -0
  16. domainkit-2.1.1/src/domainkit/contrib/ciba/clients.py +357 -0
  17. domainkit-2.1.1/src/domainkit/contrib/ciba/events.py +37 -0
  18. domainkit-2.1.1/src/domainkit/contrib/ciba/exceptions.py +271 -0
  19. domainkit-2.1.1/src/domainkit/contrib/ciba/gate.py +64 -0
  20. domainkit-2.1.1/src/domainkit/contrib/ciba/management/__init__.py +1 -0
  21. domainkit-2.1.1/src/domainkit/contrib/ciba/management/commands/__init__.py +1 -0
  22. domainkit-2.1.1/src/domainkit/contrib/ciba/management/commands/ciba.py +103 -0
  23. domainkit-2.1.1/src/domainkit/contrib/ciba/oidc.py +482 -0
  24. domainkit-2.1.1/src/domainkit/contrib/ciba/personal.py +79 -0
  25. domainkit-2.1.1/src/domainkit/contrib/ciba/services.py +552 -0
  26. domainkit-2.1.1/src/domainkit/contrib/ciba/settings.py +87 -0
  27. domainkit-2.1.1/src/domainkit/contrib/ciba/stores.py +420 -0
  28. domainkit-2.1.1/src/domainkit/contrib/ciba/tables.py +92 -0
  29. domainkit-2.1.1/src/domainkit/contrib/ciba/tasks.py +22 -0
  30. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/devices/__init__.py +10 -0
  31. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/devices/api.py +174 -3
  32. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/devices/apps.py +13 -1
  33. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/devices/binding.py +32 -14
  34. domainkit-2.1.1/src/domainkit/contrib/devices/enrollment.py +198 -0
  35. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/devices/exceptions.py +47 -0
  36. domainkit-2.1.1/src/domainkit/contrib/devices/management/__init__.py +1 -0
  37. domainkit-2.1.1/src/domainkit/contrib/devices/management/commands/__init__.py +1 -0
  38. domainkit-2.1.1/src/domainkit/contrib/devices/management/commands/unbinddevices.py +52 -0
  39. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/devices/settings.py +8 -0
  40. domainkit-2.1.1/src/domainkit/contrib/devices/templates/mail/devices/enrollment_code.subject.txt +1 -0
  41. domainkit-2.1.1/src/domainkit/contrib/devices/templates/mail/devices/enrollment_code.txt +10 -0
  42. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/identity/api.py +11 -6
  43. domainkit-2.1.1/src/domainkit/i18n/locale/ar/LC_MESSAGES/messages.mo +0 -0
  44. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/i18n/locale/ar/LC_MESSAGES/messages.po +45 -0
  45. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/i18n/locale/en/LC_MESSAGES/messages.po +45 -0
  46. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/commands/dbshell.py +24 -4
  47. domainkit-2.0.0/src/domainkit/contrib/auth/integration.py +0 -52
  48. domainkit-2.0.0/src/domainkit/i18n/locale/ar/LC_MESSAGES/messages.mo +0 -0
  49. {domainkit-2.0.0 → domainkit-2.1.1}/LICENSE +0 -0
  50. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/__init__.py +0 -0
  51. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/__main__.py +0 -0
  52. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/apps/__init__.py +0 -0
  53. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/apps/hooks.py +0 -0
  54. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/apps/registry.py +0 -0
  55. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/architecture.py +0 -0
  56. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/broker/__init__.py +0 -0
  57. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/broker/base.py +0 -0
  58. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/broker/handler.py +0 -0
  59. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/broker/kafka.py +0 -0
  60. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/broker/memory.py +0 -0
  61. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/broker/nats_jetstream.py +0 -0
  62. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/broker/pull.py +0 -0
  63. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/broker/rabbitmq.py +0 -0
  64. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/broker/redis_streams.py +0 -0
  65. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/broker/sqs.py +0 -0
  66. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/cache/__init__.py +0 -0
  67. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/cache/base.py +0 -0
  68. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/cache/core.py +0 -0
  69. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/cache/decorators.py +0 -0
  70. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/cache/handler.py +0 -0
  71. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/cache/memory.py +0 -0
  72. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/cache/metrics.py +0 -0
  73. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/cache/pages.py +0 -0
  74. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/cache/redis.py +0 -0
  75. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/checks.py +0 -0
  76. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/clock.py +0 -0
  77. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/cloud/__init__.py +0 -0
  78. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/cloud/aws.py +0 -0
  79. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/cloud/azure.py +0 -0
  80. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/cloud/google.py +0 -0
  81. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/conf/__init__.py +0 -0
  82. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/conf/env.py +0 -0
  83. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/conf/global_settings.py +0 -0
  84. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/conf/lazy.py +0 -0
  85. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/context.py +0 -0
  86. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/__init__.py +0 -0
  87. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/accounting/__init__.py +0 -0
  88. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/accounting/api.py +0 -0
  89. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/accounting/apps.py +0 -0
  90. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/accounting/exceptions.py +0 -0
  91. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/accounting/holds.py +0 -0
  92. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/accounting/hooks.py +0 -0
  93. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/accounting/ledger.py +0 -0
  94. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/accounting/management/__init__.py +0 -0
  95. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/accounting/management/commands/__init__.py +0 -0
  96. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/accounting/management/commands/accounting.py +0 -0
  97. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/accounting/models.py +0 -0
  98. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/accounting/personal.py +0 -0
  99. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/accounting/protection.py +0 -0
  100. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/accounting/reconciliation.py +0 -0
  101. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/accounting/reports.py +0 -0
  102. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/accounting/schemas.py +0 -0
  103. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/accounting/settings.py +0 -0
  104. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/accounting/tables.py +0 -0
  105. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/accounting/tasks.py +0 -0
  106. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/accounting/uow.py +0 -0
  107. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/admin/__init__.py +0 -0
  108. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/admin/sites.py +0 -0
  109. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/approvals/__init__.py +0 -0
  110. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/approvals/api.py +0 -0
  111. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/approvals/apps.py +0 -0
  112. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/approvals/builtin.py +0 -0
  113. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/approvals/exceptions.py +0 -0
  114. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/approvals/guards.py +0 -0
  115. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/approvals/management/__init__.py +0 -0
  116. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/approvals/management/commands/__init__.py +0 -0
  117. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/approvals/management/commands/approvals.py +0 -0
  118. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/approvals/models.py +0 -0
  119. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/approvals/personal.py +0 -0
  120. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/approvals/rules.py +0 -0
  121. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/approvals/services.py +0 -0
  122. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/approvals/settings.py +0 -0
  123. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/approvals/tables.py +0 -0
  124. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/approvals/tasks.py +0 -0
  125. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/approvals/uow.py +0 -0
  126. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/audit/__init__.py +0 -0
  127. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/audit/api.py +0 -0
  128. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/audit/apps.py +0 -0
  129. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/audit/baseline.py +0 -0
  130. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/audit/checkpoints.py +0 -0
  131. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/audit/history.py +0 -0
  132. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/audit/ledgerstates.py +0 -0
  133. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/audit/management/__init__.py +0 -0
  134. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/audit/management/commands/__init__.py +0 -0
  135. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/audit/management/commands/audit.py +0 -0
  136. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/audit/models.py +0 -0
  137. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/audit/personal.py +0 -0
  138. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/audit/protection.py +0 -0
  139. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/audit/pruning.py +0 -0
  140. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/audit/recorder.py +0 -0
  141. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/audit/seals.py +0 -0
  142. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/audit/settings.py +0 -0
  143. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/audit/tables.py +0 -0
  144. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/audit/tasks.py +0 -0
  145. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/audit/testing.py +0 -0
  146. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/audit/trails.py +0 -0
  147. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/__init__.py +0 -0
  148. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/access.py +0 -0
  149. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/admin.py +0 -0
  150. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/authentication.py +0 -0
  151. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/backends.py +0 -0
  152. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/captcha.py +0 -0
  153. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/certificates.py +0 -0
  154. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/codes.py +0 -0
  155. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/common-passwords.NOTICE +0 -0
  156. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/common-passwords.txt.gz +0 -0
  157. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/devices.py +0 -0
  158. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/erasure.py +0 -0
  159. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/events.py +0 -0
  160. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/exceptions.py +0 -0
  161. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/hashers.py +0 -0
  162. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/management/__init__.py +0 -0
  163. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/management/commands/__init__.py +0 -0
  164. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/management/commands/addcertificate.py +0 -0
  165. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/management/commands/changepassword.py +0 -0
  166. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/management/commands/cleartokens.py +0 -0
  167. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/management/commands/createsuperuser.py +0 -0
  168. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/management/commands/createtoken.py +0 -0
  169. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/management/commands/resealmfa.py +0 -0
  170. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/management/commands/resetmfa.py +0 -0
  171. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/metrics.py +0 -0
  172. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/middleware.py +0 -0
  173. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/models.py +0 -0
  174. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/onetime.py +0 -0
  175. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/permissions.py +0 -0
  176. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/personal_tokens.py +0 -0
  177. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/principals.py +0 -0
  178. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/repositories.py +0 -0
  179. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/settings.py +0 -0
  180. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/signup.py +0 -0
  181. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/stepup.py +0 -0
  182. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/tables.py +0 -0
  183. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/tasks.py +0 -0
  184. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/templates/mail/auth/email_verification_code.subject.txt +0 -0
  185. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/templates/mail/auth/email_verification_code.txt +0 -0
  186. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/templates/mail/auth/password_reset_code.subject.txt +0 -0
  187. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/templates/mail/auth/password_reset_code.txt +0 -0
  188. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/templates/mail/auth/signup_code.subject.txt +0 -0
  189. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/templates/mail/auth/signup_code.txt +0 -0
  190. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/templates/mail/auth/signup_exists.subject.txt +0 -0
  191. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/templates/mail/auth/signup_exists.txt +0 -0
  192. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/testing.py +0 -0
  193. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/throttling.py +0 -0
  194. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/tokens.py +0 -0
  195. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/totp.py +0 -0
  196. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/uow.py +0 -0
  197. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/users.py +0 -0
  198. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/validators.py +0 -0
  199. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/contenttypes/__init__.py +0 -0
  200. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/contenttypes/apps.py +0 -0
  201. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/contenttypes/models.py +0 -0
  202. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/contenttypes/sync.py +0 -0
  203. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/contenttypes/tables.py +0 -0
  204. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/devices/events.py +0 -0
  205. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/devices/passkeys.py +0 -0
  206. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/devices/personal.py +0 -0
  207. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/devices/push.py +0 -0
  208. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/devices/stores.py +0 -0
  209. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/devices/tables.py +0 -0
  210. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/devices/webauthn.py +0 -0
  211. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/evidence/__init__.py +0 -0
  212. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/evidence/apps.py +0 -0
  213. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/evidence/management/__init__.py +0 -0
  214. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/evidence/management/commands/__init__.py +0 -0
  215. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/evidence/management/commands/evidence.py +0 -0
  216. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/evidence/models.py +0 -0
  217. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/evidence/settings.py +0 -0
  218. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/evidence/store.py +0 -0
  219. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/evidence/tasks.py +0 -0
  220. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/flags/__init__.py +0 -0
  221. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/flags/admin.py +0 -0
  222. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/flags/apps.py +0 -0
  223. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/flags/dependencies.py +0 -0
  224. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/flags/events.py +0 -0
  225. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/flags/exceptions.py +0 -0
  226. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/flags/management/__init__.py +0 -0
  227. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/flags/management/commands/__init__.py +0 -0
  228. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/flags/management/commands/flags.py +0 -0
  229. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/flags/models.py +0 -0
  230. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/flags/settings.py +0 -0
  231. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/flags/store.py +0 -0
  232. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/flags/tables.py +0 -0
  233. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/flags/uow.py +0 -0
  234. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/idempotency/__init__.py +0 -0
  235. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/idempotency/apps.py +0 -0
  236. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/idempotency/middleware.py +0 -0
  237. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/idempotency/operations.py +0 -0
  238. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/idempotency/settings.py +0 -0
  239. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/idempotency/statements.py +0 -0
  240. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/idempotency/tables.py +0 -0
  241. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/idempotency/tasks.py +0 -0
  242. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/identity/__init__.py +0 -0
  243. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/identity/apps.py +0 -0
  244. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/identity/binding.py +0 -0
  245. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/identity/events.py +0 -0
  246. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/identity/exceptions.py +0 -0
  247. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/identity/ldap.py +0 -0
  248. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/identity/personal.py +0 -0
  249. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/identity/providers.py +0 -0
  250. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/identity/saml.py +0 -0
  251. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/identity/services.py +0 -0
  252. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/identity/settings.py +0 -0
  253. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/identity/stores.py +0 -0
  254. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/identity/tables.py +0 -0
  255. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/keys/__init__.py +0 -0
  256. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/keys/apps.py +0 -0
  257. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/keys/management/__init__.py +0 -0
  258. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/keys/management/commands/__init__.py +0 -0
  259. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/keys/management/commands/keys.py +0 -0
  260. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/keys/operations.py +0 -0
  261. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/keys/settings.py +0 -0
  262. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/keys/store.py +0 -0
  263. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/keys/tables.py +0 -0
  264. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/limits/__init__.py +0 -0
  265. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/limits/api.py +0 -0
  266. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/limits/apps.py +0 -0
  267. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/limits/exceptions.py +0 -0
  268. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/limits/management/__init__.py +0 -0
  269. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/limits/management/commands/__init__.py +0 -0
  270. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/limits/management/commands/limits.py +0 -0
  271. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/limits/models.py +0 -0
  272. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/limits/personal.py +0 -0
  273. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/limits/postings.py +0 -0
  274. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/limits/services.py +0 -0
  275. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/limits/settings.py +0 -0
  276. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/limits/tables.py +0 -0
  277. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/limits/tasks.py +0 -0
  278. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/limits/uow.py +0 -0
  279. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/limits/usage.py +0 -0
  280. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/mail/__init__.py +0 -0
  281. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/mail/admins.py +0 -0
  282. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/mail/apps.py +0 -0
  283. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/mail/backends.py +0 -0
  284. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/mail/delivery.py +0 -0
  285. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/mail/message.py +0 -0
  286. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/mail/providers.py +0 -0
  287. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/mail/settings.py +0 -0
  288. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/mail/templates.py +0 -0
  289. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/messaging/__init__.py +0 -0
  290. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/messaging/admin.py +0 -0
  291. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/messaging/apps.py +0 -0
  292. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/messaging/breaker.py +0 -0
  293. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/messaging/budget.py +0 -0
  294. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/messaging/cron.py +0 -0
  295. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/messaging/dispatch.py +0 -0
  296. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/messaging/erasure.py +0 -0
  297. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/messaging/management/__init__.py +0 -0
  298. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/messaging/management/commands/__init__.py +0 -0
  299. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/messaging/management/commands/messages.py +0 -0
  300. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/messaging/management/commands/runworker.py +0 -0
  301. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/messaging/metrics.py +0 -0
  302. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/messaging/ordering.py +0 -0
  303. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/messaging/outbox.py +0 -0
  304. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/messaging/registry.py +0 -0
  305. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/messaging/retry.py +0 -0
  306. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/messaging/runs.py +0 -0
  307. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/messaging/settings.py +0 -0
  308. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/messaging/tables.py +0 -0
  309. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/messaging/testing.py +0 -0
  310. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/messaging/worker.py +0 -0
  311. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/notifications/__init__.py +0 -0
  312. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/notifications/apps.py +0 -0
  313. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/notifications/backends.py +0 -0
  314. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/notifications/delivery.py +0 -0
  315. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/notifications/events.py +0 -0
  316. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/notifications/messages.py +0 -0
  317. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/notifications/push.py +0 -0
  318. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/notifications/settings.py +0 -0
  319. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/notifications/sms.py +0 -0
  320. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/objectpermissions/__init__.py +0 -0
  321. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/objectpermissions/apps.py +0 -0
  322. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/objectpermissions/backends.py +0 -0
  323. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/objectpermissions/criteria.py +0 -0
  324. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/objectpermissions/deletions.py +0 -0
  325. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/objectpermissions/models.py +0 -0
  326. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/objectpermissions/services.py +0 -0
  327. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/objectpermissions/tables.py +0 -0
  328. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/objectpermissions/uow.py +0 -0
  329. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/phones/__init__.py +0 -0
  330. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/phones/api.py +0 -0
  331. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/phones/apps.py +0 -0
  332. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/phones/events.py +0 -0
  333. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/phones/exceptions.py +0 -0
  334. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/phones/personal.py +0 -0
  335. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/phones/services.py +0 -0
  336. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/phones/settings.py +0 -0
  337. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/phones/stores.py +0 -0
  338. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/phones/tables.py +0 -0
  339. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/privacy/__init__.py +0 -0
  340. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/privacy/apps.py +0 -0
  341. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/privacy/events.py +0 -0
  342. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/privacy/management/__init__.py +0 -0
  343. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/privacy/management/commands/__init__.py +0 -0
  344. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/privacy/management/commands/privacy.py +0 -0
  345. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/privacy/models.py +0 -0
  346. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/privacy/operations.py +0 -0
  347. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/privacy/retention.py +0 -0
  348. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/webhooks/__init__.py +0 -0
  349. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/webhooks/admin.py +0 -0
  350. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/webhooks/apps.py +0 -0
  351. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/webhooks/client.py +0 -0
  352. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/webhooks/delivery.py +0 -0
  353. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/webhooks/guard.py +0 -0
  354. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/webhooks/management/__init__.py +0 -0
  355. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/webhooks/management/commands/__init__.py +0 -0
  356. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/webhooks/management/commands/webhooks.py +0 -0
  357. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/webhooks/models.py +0 -0
  358. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/webhooks/owned.py +0 -0
  359. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/webhooks/settings.py +0 -0
  360. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/webhooks/signing.py +0 -0
  361. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/webhooks/tables.py +0 -0
  362. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/webhooks/uow.py +0 -0
  363. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/db/__init__.py +0 -0
  364. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/db/connections.py +0 -0
  365. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/db/dbclock.py +0 -0
  366. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/db/derive.py +0 -0
  367. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/db/drivers.py +0 -0
  368. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/db/encrypted.py +0 -0
  369. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/db/errors.py +0 -0
  370. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/db/fixtures.py +0 -0
  371. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/db/hooks.py +0 -0
  372. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/db/migration_env/__init__.py +0 -0
  373. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/db/migration_env/env.py +0 -0
  374. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/db/migration_env/script.py.mako +0 -0
  375. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/db/migrations.py +0 -0
  376. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/db/models.py +0 -0
  377. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/db/money.py +0 -0
  378. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/db/orm.py +0 -0
  379. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/db/partitioning.py +0 -0
  380. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/db/places.py +0 -0
  381. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/db/query.py +0 -0
  382. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/db/refs.py +0 -0
  383. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/db/repository.py +0 -0
  384. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/db/routing.py +0 -0
  385. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/db/snapshots.py +0 -0
  386. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/db/squashing.py +0 -0
  387. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/db/types.py +0 -0
  388. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/db/uow.py +0 -0
  389. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/ddd/__init__.py +0 -0
  390. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/ddd/_dataclass.py +0 -0
  391. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/ddd/_validation.py +0 -0
  392. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/ddd/choices.py +0 -0
  393. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/ddd/events.py +0 -0
  394. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/ddd/exceptions.py +0 -0
  395. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/ddd/fields.py +0 -0
  396. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/ddd/markers.py +0 -0
  397. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/ddd/messages.py +0 -0
  398. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/ddd/model.py +0 -0
  399. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/ddd/pagination.py +0 -0
  400. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/ddd/personal.py +0 -0
  401. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/ddd/places.py +0 -0
  402. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/ddd/preconditions.py +0 -0
  403. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/ddd/query.py +0 -0
  404. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/ddd/refs.py +0 -0
  405. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/ddd/repository.py +0 -0
  406. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/ddd/stores.py +0 -0
  407. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/ddd/tenancy.py +0 -0
  408. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/ddd/uow.py +0 -0
  409. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/ddd/usecases.py +0 -0
  410. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/deadlines.py +0 -0
  411. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/debug/__init__.py +0 -0
  412. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/debug/middleware.py +0 -0
  413. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/debug/queries.py +0 -0
  414. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/deprecation.py +0 -0
  415. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/encryption.py +0 -0
  416. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/exceptions.py +0 -0
  417. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/__init__.py +0 -0
  418. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/access.py +0 -0
  419. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/apidocs.py +0 -0
  420. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/application.py +0 -0
  421. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/blocking.py +0 -0
  422. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/client.py +0 -0
  423. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/compression.py +0 -0
  424. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/deadlines.py +0 -0
  425. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/errors.py +0 -0
  426. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/filters.py +0 -0
  427. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/guard.py +0 -0
  428. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/health.py +0 -0
  429. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/live.py +0 -0
  430. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/live_events.py +0 -0
  431. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/locale.py +0 -0
  432. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/metrics.py +0 -0
  433. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/middleware.py +0 -0
  434. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/openapi.py +0 -0
  435. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/pagination.py +0 -0
  436. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/ratelimit.py +0 -0
  437. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/responses.py +0 -0
  438. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/routing.py +0 -0
  439. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/servers.py +0 -0
  440. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/shedding.py +0 -0
  441. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/sse.py +0 -0
  442. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/static/redoc/LICENSE +0 -0
  443. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/static/redoc/redoc.standalone.js +0 -0
  444. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/static/redoc/redoc.standalone.js.LICENSE.txt +0 -0
  445. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/static/swagger-ui/LICENSE +0 -0
  446. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/static/swagger-ui/NOTICE +0 -0
  447. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/static/swagger-ui/swagger-init.js +0 -0
  448. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/static/swagger-ui/swagger-ui-bundle.js +0 -0
  449. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/static/swagger-ui/swagger-ui-bundle.js.LICENSE.txt +0 -0
  450. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/static/swagger-ui/swagger-ui.css +0 -0
  451. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/uploads.py +0 -0
  452. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/versioning.py +0 -0
  453. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/websockets.py +0 -0
  454. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/i18n/__init__.py +0 -0
  455. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/i18n/catalogs.py +0 -0
  456. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/i18n/extraction.py +0 -0
  457. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/i18n/formats.py +0 -0
  458. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/i18n/locale/en/LC_MESSAGES/messages.mo +0 -0
  459. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/i18n/timezone.py +0 -0
  460. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/i18n/translation.py +0 -0
  461. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/i18n/validation.py +0 -0
  462. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/keys/__init__.py +0 -0
  463. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/keys/_http.py +0 -0
  464. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/keys/aws.py +0 -0
  465. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/keys/azure.py +0 -0
  466. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/keys/gcp.py +0 -0
  467. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/keys/huawei.py +0 -0
  468. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/keys/pkcs11.py +0 -0
  469. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/keys/ring.py +0 -0
  470. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/keys/vault.py +0 -0
  471. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/ledger/__init__.py +0 -0
  472. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/ledger/base.py +0 -0
  473. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/ledger/handler.py +0 -0
  474. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/ledger/immudb.py +0 -0
  475. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/ledger/memory.py +0 -0
  476. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/ledger/trust.py +0 -0
  477. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/lifecycle.py +0 -0
  478. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/log.py +0 -0
  479. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/__init__.py +0 -0
  480. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/actions.py +0 -0
  481. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/base.py +0 -0
  482. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/commands/__init__.py +0 -0
  483. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/commands/addcommand.py +0 -0
  484. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/commands/addevent.py +0 -0
  485. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/commands/addquery.py +0 -0
  486. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/commands/broker.py +0 -0
  487. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/commands/cache.py +0 -0
  488. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/commands/check.py +0 -0
  489. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/commands/compilemessages.py +0 -0
  490. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/commands/diffsettings.py +0 -0
  491. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/commands/dumpdata.py +0 -0
  492. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/commands/flush.py +0 -0
  493. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/commands/init.py +0 -0
  494. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/commands/inspectdb.py +0 -0
  495. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/commands/loaddata.py +0 -0
  496. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/commands/makemessages.py +0 -0
  497. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/commands/makemigrations.py +0 -0
  498. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/commands/migrate.py +0 -0
  499. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/commands/openapi.py +0 -0
  500. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/commands/partitions.py +0 -0
  501. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/commands/runserver.py +0 -0
  502. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/commands/seed.py +0 -0
  503. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/commands/shell.py +0 -0
  504. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/commands/showmigrations.py +0 -0
  505. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/commands/squashmigrations.py +0 -0
  506. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/commands/startaggregate.py +0 -0
  507. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/commands/startdomain.py +0 -0
  508. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/generators.py +0 -0
  509. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/operators.py +0 -0
  510. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/minimal/package/__init__.py-tpl +0 -0
  511. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/minimal/package/api/__init__.py-tpl +0 -0
  512. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/minimal/package/api/routes.py-tpl +0 -0
  513. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/minimal/package/application/__init__.py-tpl +0 -0
  514. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/minimal/package/application/commands.py-tpl +0 -0
  515. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/minimal/package/application/services.py-tpl +0 -0
  516. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/minimal/package/application/unit_of_work.py-tpl +0 -0
  517. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/minimal/package/apps.py-tpl +0 -0
  518. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/minimal/package/domain/__init__.py-tpl +0 -0
  519. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/minimal/package/domain/model.py-tpl +0 -0
  520. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/minimal/package/infrastructure/__init__.py-tpl +0 -0
  521. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/minimal/package/infrastructure/orm.py-tpl +0 -0
  522. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/minimal/package/infrastructure/unit_of_work.py-tpl +0 -0
  523. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/minimal/tests/__init__.py-tpl +0 -0
  524. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/minimal/tests/fakes.py-tpl +0 -0
  525. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/minimal/tests/test_api.py-tpl +0 -0
  526. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/minimal/tests/test_services.py-tpl +0 -0
  527. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/package/__init__.py-tpl +0 -0
  528. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/package/api/__init__.py-tpl +0 -0
  529. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/package/api/routes.py-tpl +0 -0
  530. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/package/application/__init__.py-tpl +0 -0
  531. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/package/application/commands.py-tpl +0 -0
  532. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/package/application/handlers.py-tpl +0 -0
  533. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/package/application/services.py-tpl +0 -0
  534. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/package/application/unit_of_work.py-tpl +0 -0
  535. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/package/apps.py-tpl +0 -0
  536. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/package/domain/__init__.py-tpl +0 -0
  537. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/package/domain/events.py-tpl +0 -0
  538. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/package/domain/model.py-tpl +0 -0
  539. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/package/infrastructure/__init__.py-tpl +0 -0
  540. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/package/infrastructure/orm.py-tpl +0 -0
  541. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/package/infrastructure/unit_of_work.py-tpl +0 -0
  542. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/simple/package/__init__.py-tpl +0 -0
  543. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/simple/package/controllers.py-tpl +0 -0
  544. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/simple/package/domain.py-tpl +0 -0
  545. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/simple/package/models.py-tpl +0 -0
  546. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/simple/package/routes.py-tpl +0 -0
  547. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/simple/tests/__init__.py-tpl +0 -0
  548. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/simple/tests/test_api.py-tpl +0 -0
  549. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/simple/tests/test_controllers.py-tpl +0 -0
  550. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/tests/__init__.py-tpl +0 -0
  551. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/tests/fakes.py-tpl +0 -0
  552. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/tests/test_api.py-tpl +0 -0
  553. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/tests/test_model.py-tpl +0 -0
  554. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/tests/test_services.py-tpl +0 -0
  555. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/user/package/__init__.py-tpl +0 -0
  556. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/user/package/models.py-tpl +0 -0
  557. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/user/tests/__init__.py-tpl +0 -0
  558. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/user/tests/test_users.py-tpl +0 -0
  559. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/profiles/fintech/dot-github/workflows/ci.yml-tpl +0 -0
  560. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/profiles/fintech/pyproject.toml-tpl +0 -0
  561. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/profiles/fintech/src/config/rules.py-tpl +0 -0
  562. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/profiles/fintech/src/config/settings/base.py-tpl +0 -0
  563. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/profiles/fintech/src/config/settings/local.py-tpl +0 -0
  564. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/profiles/fintech/src/config/settings/production.py-tpl +0 -0
  565. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/profiles/fintech/src/config/settings/test.py-tpl +0 -0
  566. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/profiles/fintech/src/config/urls.py-tpl +0 -0
  567. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/profiles/fintech/src/domains/payments/__init__.py-tpl +0 -0
  568. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/profiles/fintech/src/domains/payments/api/__init__.py-tpl +0 -0
  569. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/profiles/fintech/src/domains/payments/api/routes.py-tpl +0 -0
  570. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/profiles/fintech/src/domains/payments/application/__init__.py-tpl +0 -0
  571. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/profiles/fintech/src/domains/payments/application/commands.py-tpl +0 -0
  572. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/profiles/fintech/src/domains/payments/application/services.py-tpl +0 -0
  573. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/profiles/fintech/src/domains/payments/application/unit_of_work.py-tpl +0 -0
  574. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/profiles/fintech/src/domains/payments/apps.py-tpl +0 -0
  575. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/profiles/fintech/src/domains/payments/domain/__init__.py-tpl +0 -0
  576. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/profiles/fintech/src/domains/payments/domain/model.py-tpl +0 -0
  577. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/profiles/fintech/src/domains/payments/infrastructure/__init__.py-tpl +0 -0
  578. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/profiles/fintech/src/domains/payments/infrastructure/orm.py-tpl +0 -0
  579. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/profiles/fintech/src/domains/payments/infrastructure/unit_of_work.py-tpl +0 -0
  580. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/profiles/fintech/tests/conftest.py-tpl +0 -0
  581. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/profiles/fintech/tests/payments/__init__.py-tpl +0 -0
  582. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/profiles/fintech/tests/payments/test_cards.py-tpl +0 -0
  583. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/profiles/fintech/tests/payments/test_transfers.py-tpl +0 -0
  584. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/profiles/fintech/tests/people.py-tpl +0 -0
  585. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/profiles/fintech/tests/test_controls.py-tpl +0 -0
  586. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/project/Dockerfile-tpl +0 -0
  587. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/project/dot-dockerignore-tpl +0 -0
  588. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/project/dot-env-tpl +0 -0
  589. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/project/dot-github/dependabot.yml-tpl +0 -0
  590. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/project/dot-github/workflows/ci.yml-tpl +0 -0
  591. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/project/dot-gitignore-tpl +0 -0
  592. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/project/manage.py-tpl +0 -0
  593. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/project/pyproject.toml-tpl +0 -0
  594. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/project/src/config/__init__.py-tpl +0 -0
  595. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/project/src/config/asgi.py-tpl +0 -0
  596. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/project/src/config/settings/__init__.py-tpl +0 -0
  597. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/project/src/config/settings/base.py-tpl +0 -0
  598. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/project/src/config/settings/local.py-tpl +0 -0
  599. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/project/src/config/settings/production.py-tpl +0 -0
  600. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/project/src/config/settings/test.py-tpl +0 -0
  601. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/project/src/config/urls.py-tpl +0 -0
  602. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/project/src/domains/__init__.py-tpl +0 -0
  603. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/project/tests/__init__.py-tpl +0 -0
  604. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/project/tests/test_health.py-tpl +0 -0
  605. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/money/__init__.py +0 -0
  606. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/money/iso4217.csv +0 -0
  607. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/py.typed +0 -0
  608. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/reporting.py +0 -0
  609. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/resources/__init__.py +0 -0
  610. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/resources/access.py +0 -0
  611. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/resources/batches.py +0 -0
  612. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/resources/conditional.py +0 -0
  613. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/resources/events.py +0 -0
  614. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/resources/policies.py +0 -0
  615. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/resources/renderers.py +0 -0
  616. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/resources/routing/__init__.py +0 -0
  617. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/resources/routing/batching.py +0 -0
  618. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/resources/routing/commands.py +0 -0
  619. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/resources/routing/context.py +0 -0
  620. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/resources/routing/crud.py +0 -0
  621. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/resources/routing/declaring.py +0 -0
  622. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/resources/routing/listing.py +0 -0
  623. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/resources/routing/presenting.py +0 -0
  624. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/resources/routing/queries.py +0 -0
  625. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/resources/routing/reach.py +0 -0
  626. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/resources/routing/reading.py +0 -0
  627. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/resources/routing/values.py +0 -0
  628. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/resources/schemas.py +0 -0
  629. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/search/__init__.py +0 -0
  630. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/search/_http.py +0 -0
  631. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/search/meilisearch.py +0 -0
  632. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/search/opensearch.py +0 -0
  633. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/signing.py +0 -0
  634. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/storage/__init__.py +0 -0
  635. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/storage/azure.py +0 -0
  636. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/storage/base.py +0 -0
  637. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/storage/filesystem.py +0 -0
  638. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/storage/gcs.py +0 -0
  639. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/storage/handler.py +0 -0
  640. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/storage/images.py +0 -0
  641. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/storage/memory.py +0 -0
  642. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/storage/remote.py +0 -0
  643. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/storage/s3.py +0 -0
  644. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/storage/scanning.py +0 -0
  645. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/tasks.py +0 -0
  646. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/tenancy.py +0 -0
  647. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/testing/__init__.py +0 -0
  648. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/testing/authenticators.py +0 -0
  649. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/testing/blocking.py +0 -0
  650. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/testing/clients.py +0 -0
  651. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/testing/databases.py +0 -0
  652. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/testing/factories.py +0 -0
  653. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/testing/kms.py +0 -0
  654. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/testing/live.py +0 -0
  655. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/testing/queries.py +0 -0
  656. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/tracing.py +0 -0
  657. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/utils/__init__.py +0 -0
  658. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/utils/closing.py +0 -0
  659. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/utils/decimals.py +0 -0
  660. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/utils/delivery.py +0 -0
  661. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/utils/formatting.py +0 -0
  662. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/utils/headers.py +0 -0
  663. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/utils/loops.py +0 -0
  664. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/utils/module_loading.py +0 -0
  665. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/utils/rates.py +0 -0
  666. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/utils/readiness.py +0 -0
  667. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/utils/redis_urls.py +0 -0
  668. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/utils/text.py +0 -0
  669. {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/utils/unset.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: domainkit
3
- Version: 2.0.0
3
+ Version: 2.1.1
4
4
  Summary: A Django-style framework for domain-driven FastAPI services.
5
5
  License-Expression: MIT
6
6
  License-File: LICENSE
@@ -20,6 +20,7 @@ Classifier: Typing :: Typed
20
20
  Provides-Extra: argon2
21
21
  Provides-Extra: audit
22
22
  Provides-Extra: cloud
23
+ Provides-Extra: devices
23
24
  Provides-Extra: granian
24
25
  Provides-Extra: httpclient
25
26
  Provides-Extra: identity
@@ -56,6 +57,7 @@ Requires-Dist: argon2-cffi (>=25.1.0,<26.0.0) ; extra == "argon2"
56
57
  Requires-Dist: asyncpg (>=0.32.0,<1.0.0) ; extra == "postgres"
57
58
  Requires-Dist: cryptography (>=50.0.2,<51.0.0) ; extra == "audit"
58
59
  Requires-Dist: cryptography (>=50.0.2,<51.0.0) ; extra == "cloud"
60
+ Requires-Dist: cryptography (>=50.0.2,<51.0.0) ; extra == "devices"
59
61
  Requires-Dist: cryptography (>=50.0.2,<51.0.0) ; extra == "keys"
60
62
  Requires-Dist: cryptography (>=50.0.2,<51.0.0) ; extra == "mfa"
61
63
  Requires-Dist: cryptography (>=50.0.2,<51.0.0) ; extra == "pkcs11"
@@ -100,8 +102,8 @@ Requires-Dist: starlette (>=1.8.0,<2.0.0)
100
102
  Requires-Dist: tzdata (>=2025.2) ; extra == "tzdata"
101
103
  Requires-Dist: uvicorn[standard] (>=0.54.0,<1.0.0)
102
104
  Requires-Dist: uvloop (>=0.23.0,<1.0.0) ; (sys_platform != "win32") and (extra == "uvloop")
103
- Project-URL: Changelog, https://github.com/karimmattar/domainkit/blob/v2.0.0/CHANGELOG.md
104
- Project-URL: Documentation, https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/reference.md
105
+ Project-URL: Changelog, https://github.com/karimmattar/domainkit/blob/v2.1.1/CHANGELOG.md
106
+ Project-URL: Documentation, https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/reference.md
105
107
  Project-URL: Homepage, https://github.com/karimmattar/domainkit
106
108
  Project-URL: Issues, https://github.com/karimmattar/domainkit/issues
107
109
  Description-Content-Type: text/markdown
@@ -169,71 +171,71 @@ the pages of that release's tag; on GitHub, `main` describes the next
169
171
  release, and a release's pages are under its tag
170
172
  (`https://github.com/karimmattar/domainkit/tree/vX.Y.Z/docs`).
171
173
 
172
- - [docs/tutorial.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/tutorial.md): getting started, in five
174
+ - [docs/tutorial.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/tutorial.md): getting started, in five
173
175
  parts: a first resource, rules, permissions, events and the worker, and
174
176
  tests and production; every command and code change run in CI
175
- - [docs/operations.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/operations.md): running in production:
177
+ - [docs/operations.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/operations.md): running in production:
176
178
  processes, configuration, sizing, migrations in a rollout, the worker,
177
- sealing, backups, and what to alert on; [docs/runbook.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/runbook.md)
178
- for each alarm, [docs/security.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/security.md) the hardening
179
- checklist, and [docs/upgrading.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/upgrading.md) from one version
179
+ sealing, backups, and what to alert on; [docs/runbook.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/runbook.md)
180
+ for each alarm, [docs/security.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/security.md) the hardening
181
+ checklist, and [docs/upgrading.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/upgrading.md) from one version
180
182
  to the next, and from 0.12 to 1.0
181
183
 
182
- - [docs/reference.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/reference.md): settings, deployment checks,
184
+ - [docs/reference.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/reference.md): settings, deployment checks,
183
185
  middleware, errors, the API surface (OpenAPI, versions, deprecations),
184
186
  observability, testing, commands, and extension points, a page for each
185
- - [docs/databases.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/databases.md): several databases, routing,
187
+ - [docs/databases.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/databases.md): several databases, routing,
186
188
  sharding, partitioning, and ledgers
187
- - [docs/queries.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/queries.md): querying repositories,
189
+ - [docs/queries.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/queries.md): querying repositories,
188
190
  pages, filters, soft delete, row locks, and savepoints
189
- - [docs/resources.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/resources.md): aggregates over REST:
191
+ - [docs/resources.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/resources.md): aggregates over REST:
190
192
  resource routes, commands and queries, derived schemas, partial changes,
191
193
  ETags and conditional writes, field policies, nesting, the generators,
192
194
  and the generic admin
193
- - [docs/runtime.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/runtime.md): how async work runs
195
+ - [docs/runtime.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/runtime.md): how async work runs
194
196
  (event loops, background tasks, clean contexts, logging off the loop,
195
197
  finding blocking code, free-threaded Python, the shutdown budget,
196
198
  readiness, event-handler timeouts, workers and the outbox), running under
197
199
  load (request deadlines, load shedding, database timeouts and PgBouncer,
198
200
  outgoing HTTP calls), and servers
199
- - [docs/cache.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/cache.md): caches in memory, Redis, and Valkey,
201
+ - [docs/cache.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/cache.md): caches in memory, Redis, and Valkey,
200
202
  and shared rate limits
201
- - [docs/money.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/money.md): amounts, currencies, rounding, and
203
+ - [docs/money.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/money.md): amounts, currencies, rounding, and
202
204
  allocation, and money in tables, queries, and schemas
203
- - [docs/contrib.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/contrib.md): messaging (and workers on RabbitMQ),
205
+ - [docs/contrib.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/contrib.md): messaging (and workers on RabbitMQ),
204
206
  webhooks, audit and records' history, idempotency, evidence, feature
205
207
  flags, keys and encrypted fields, the double-entry ledger, approvals,
206
208
  and limits
207
- - [docs/auth.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/auth.md): users, groups, permissions, content
209
+ - [docs/auth.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/auth.md): users, groups, permissions, content
208
210
  types, passwords, backends, tokens, route rules, and the admin API
209
- - [docs/mail.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/mail.md): email, mail templates, text messages,
211
+ - [docs/mail.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/mail.md): email, mail templates, text messages,
210
212
  and push notifications, sent through the outbox
211
- - [docs/i18n.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/i18n.md): responses in the caller's language,
213
+ - [docs/i18n.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/i18n.md): responses in the caller's language,
212
214
  time zones, and number and date formats
213
- - [docs/uploads.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/uploads.md): file storages, receiving uploads,
215
+ - [docs/uploads.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/uploads.md): file storages, receiving uploads,
214
216
  and serving files
215
- - [docs/live.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/live.md): WebSockets and Server-Sent Events,
217
+ - [docs/live.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/live.md): WebSockets and Server-Sent Events,
216
218
  bounded and re-authorized while open, and committed events streamed live
217
- - [docs/privacy.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/privacy.md): exporting and erasing a person's
219
+ - [docs/privacy.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/privacy.md): exporting and erasing a person's
218
220
  data, and retention
219
- - [docs/testing.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/testing.md): the pytest plugin: test databases,
221
+ - [docs/testing.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/testing.md): the pytest plugin: test databases,
220
222
  sync and async clients, factories, a clock to freeze, and query counts
221
- - [docs/performance.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/performance.md): what a request costs, the
223
+ - [docs/performance.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/performance.md): what a request costs, the
222
224
  benchmark ladder CI gates on, and how to make requests cheaper
223
- - [docs/versioning.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/versioning.md): compatibility, deprecations,
225
+ - [docs/versioning.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/versioning.md): compatibility, deprecations,
224
226
  releases, and which releases get security fixes
225
- - [docs/threat-model.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/threat-model.md): what domainkit protects,
227
+ - [docs/threat-model.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/threat-model.md): what domainkit protects,
226
228
  where the trust boundaries are, what it does at each, and what is left to
227
229
  a project
228
- - [docs/fintech.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/fintech.md): a bank's first review, answered: each
230
+ - [docs/fintech.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/fintech.md): a bank's first review, answered: each
229
231
  control's page, setting, and test, and `domainkit init --profile fintech`,
230
232
  a project with them all on and wired
231
- - [docs/audit/0.9.0.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/audit/0.9.0.md): the 0.9.0 audit's findings
233
+ - [docs/audit/0.9.0.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/audit/0.9.0.md): the 0.9.0 audit's findings
232
234
  that the CHANGELOG names, with their status
233
- - [docs/api.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/api.md): the public API, module by module, one line a name;
235
+ - [docs/api.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/api.md): the public API, module by module, one line a name;
234
236
  `mkdocs.yml` builds these pages into a site, with every name's docstring
235
237
  - [docs/adr/](https://github.com/karimmattar/domainkit/tree/main/docs/adr): the decisions behind the design
236
- - [CHANGELOG.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/CHANGELOG.md) and [SECURITY.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/SECURITY.md)
238
+ - [CHANGELOG.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/CHANGELOG.md) and [SECURITY.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/SECURITY.md)
237
239
 
238
240
  ## Quick start
239
241
 
@@ -279,7 +281,7 @@ grow it. Without `--minimal`, `startdomain` writes a fuller example (notes
279
281
  as child entities, an owner, events and a handler, filters); the tutorial
280
282
  starts from that one. A route the caller may not reach answers 404, as an unknown path does,
281
283
  so check the path first (`/docs` lists every route). `createsuperuser`
282
- without options asks for each value instead. [docs/tutorial.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/tutorial.md)
284
+ without options asks for each value instead. [docs/tutorial.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/tutorial.md)
283
285
  goes on from here, in six parts from a first route: rules written by
284
286
  hand, permissions, events run by the worker, and tests.
285
287
 
@@ -287,7 +289,7 @@ hand, permissions, events run by the worker, and tests.
287
289
  Users, groups, and permissions are installed, requests are authenticated,
288
290
  and every route must say who may call it: generated domains need their
289
291
  model permissions, and `/auth` and `/admin/auth` log users in and manage
290
- them ([docs/auth.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/auth.md)).
292
+ them ([docs/auth.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/auth.md)).
291
293
 
292
294
 
293
295
  ```text
@@ -319,13 +321,13 @@ also turn the API docs off, send HSTS for a year, and limit each caller to
319
321
 
320
322
  Serve it with one worker process per core, each on its own event loop:
321
323
  `uvicorn config.asgi:application --workers 4 --loop uvloop`, or Granian
322
- (`pip install 'domainkit[granian]'`). [docs/reference/servers.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/reference/servers.md)
323
- gives the whole command with its limits, and [docs/performance.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/performance.md)
324
+ (`pip install 'domainkit[granian]'`). [docs/reference/servers.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/reference/servers.md)
325
+ gives the whole command with its limits, and [docs/performance.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/performance.md)
324
326
  how many cores a load needs.
325
327
 
326
328
  ## Developing domainkit
327
329
 
328
- [CONTRIBUTING.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/CONTRIBUTING.md)
330
+ [CONTRIBUTING.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/CONTRIBUTING.md)
329
331
  says how to set up, which checks a change must pass, and how to write it
330
332
  up. In short:
331
333
 
@@ -375,9 +377,9 @@ not the whole suite. A release reuses the run of its commit's push to
375
377
  A full mutation testing run happens weekly, in 17 shards that run side by
376
378
  side; each writes its score and the mutants no test caught to its job
377
379
  summary. Releases are published to PyPI
378
- from a version tag; see [docs/versioning.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/versioning.md).
380
+ from a version tag; see [docs/versioning.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/versioning.md).
379
381
 
380
382
  ## License
381
383
 
382
- MIT; see [LICENSE](https://github.com/karimmattar/domainkit/blob/v2.0.0/LICENSE).
384
+ MIT; see [LICENSE](https://github.com/karimmattar/domainkit/blob/v2.1.1/LICENSE).
383
385
 
@@ -61,71 +61,71 @@ the pages of that release's tag; on GitHub, `main` describes the next
61
61
  release, and a release's pages are under its tag
62
62
  (`https://github.com/karimmattar/domainkit/tree/vX.Y.Z/docs`).
63
63
 
64
- - [docs/tutorial.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/tutorial.md): getting started, in five
64
+ - [docs/tutorial.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/tutorial.md): getting started, in five
65
65
  parts: a first resource, rules, permissions, events and the worker, and
66
66
  tests and production; every command and code change run in CI
67
- - [docs/operations.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/operations.md): running in production:
67
+ - [docs/operations.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/operations.md): running in production:
68
68
  processes, configuration, sizing, migrations in a rollout, the worker,
69
- sealing, backups, and what to alert on; [docs/runbook.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/runbook.md)
70
- for each alarm, [docs/security.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/security.md) the hardening
71
- checklist, and [docs/upgrading.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/upgrading.md) from one version
69
+ sealing, backups, and what to alert on; [docs/runbook.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/runbook.md)
70
+ for each alarm, [docs/security.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/security.md) the hardening
71
+ checklist, and [docs/upgrading.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/upgrading.md) from one version
72
72
  to the next, and from 0.12 to 1.0
73
73
 
74
- - [docs/reference.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/reference.md): settings, deployment checks,
74
+ - [docs/reference.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/reference.md): settings, deployment checks,
75
75
  middleware, errors, the API surface (OpenAPI, versions, deprecations),
76
76
  observability, testing, commands, and extension points, a page for each
77
- - [docs/databases.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/databases.md): several databases, routing,
77
+ - [docs/databases.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/databases.md): several databases, routing,
78
78
  sharding, partitioning, and ledgers
79
- - [docs/queries.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/queries.md): querying repositories,
79
+ - [docs/queries.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/queries.md): querying repositories,
80
80
  pages, filters, soft delete, row locks, and savepoints
81
- - [docs/resources.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/resources.md): aggregates over REST:
81
+ - [docs/resources.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/resources.md): aggregates over REST:
82
82
  resource routes, commands and queries, derived schemas, partial changes,
83
83
  ETags and conditional writes, field policies, nesting, the generators,
84
84
  and the generic admin
85
- - [docs/runtime.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/runtime.md): how async work runs
85
+ - [docs/runtime.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/runtime.md): how async work runs
86
86
  (event loops, background tasks, clean contexts, logging off the loop,
87
87
  finding blocking code, free-threaded Python, the shutdown budget,
88
88
  readiness, event-handler timeouts, workers and the outbox), running under
89
89
  load (request deadlines, load shedding, database timeouts and PgBouncer,
90
90
  outgoing HTTP calls), and servers
91
- - [docs/cache.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/cache.md): caches in memory, Redis, and Valkey,
91
+ - [docs/cache.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/cache.md): caches in memory, Redis, and Valkey,
92
92
  and shared rate limits
93
- - [docs/money.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/money.md): amounts, currencies, rounding, and
93
+ - [docs/money.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/money.md): amounts, currencies, rounding, and
94
94
  allocation, and money in tables, queries, and schemas
95
- - [docs/contrib.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/contrib.md): messaging (and workers on RabbitMQ),
95
+ - [docs/contrib.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/contrib.md): messaging (and workers on RabbitMQ),
96
96
  webhooks, audit and records' history, idempotency, evidence, feature
97
97
  flags, keys and encrypted fields, the double-entry ledger, approvals,
98
98
  and limits
99
- - [docs/auth.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/auth.md): users, groups, permissions, content
99
+ - [docs/auth.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/auth.md): users, groups, permissions, content
100
100
  types, passwords, backends, tokens, route rules, and the admin API
101
- - [docs/mail.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/mail.md): email, mail templates, text messages,
101
+ - [docs/mail.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/mail.md): email, mail templates, text messages,
102
102
  and push notifications, sent through the outbox
103
- - [docs/i18n.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/i18n.md): responses in the caller's language,
103
+ - [docs/i18n.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/i18n.md): responses in the caller's language,
104
104
  time zones, and number and date formats
105
- - [docs/uploads.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/uploads.md): file storages, receiving uploads,
105
+ - [docs/uploads.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/uploads.md): file storages, receiving uploads,
106
106
  and serving files
107
- - [docs/live.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/live.md): WebSockets and Server-Sent Events,
107
+ - [docs/live.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/live.md): WebSockets and Server-Sent Events,
108
108
  bounded and re-authorized while open, and committed events streamed live
109
- - [docs/privacy.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/privacy.md): exporting and erasing a person's
109
+ - [docs/privacy.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/privacy.md): exporting and erasing a person's
110
110
  data, and retention
111
- - [docs/testing.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/testing.md): the pytest plugin: test databases,
111
+ - [docs/testing.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/testing.md): the pytest plugin: test databases,
112
112
  sync and async clients, factories, a clock to freeze, and query counts
113
- - [docs/performance.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/performance.md): what a request costs, the
113
+ - [docs/performance.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/performance.md): what a request costs, the
114
114
  benchmark ladder CI gates on, and how to make requests cheaper
115
- - [docs/versioning.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/versioning.md): compatibility, deprecations,
115
+ - [docs/versioning.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/versioning.md): compatibility, deprecations,
116
116
  releases, and which releases get security fixes
117
- - [docs/threat-model.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/threat-model.md): what domainkit protects,
117
+ - [docs/threat-model.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/threat-model.md): what domainkit protects,
118
118
  where the trust boundaries are, what it does at each, and what is left to
119
119
  a project
120
- - [docs/fintech.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/fintech.md): a bank's first review, answered: each
120
+ - [docs/fintech.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/fintech.md): a bank's first review, answered: each
121
121
  control's page, setting, and test, and `domainkit init --profile fintech`,
122
122
  a project with them all on and wired
123
- - [docs/audit/0.9.0.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/audit/0.9.0.md): the 0.9.0 audit's findings
123
+ - [docs/audit/0.9.0.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/audit/0.9.0.md): the 0.9.0 audit's findings
124
124
  that the CHANGELOG names, with their status
125
- - [docs/api.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/api.md): the public API, module by module, one line a name;
125
+ - [docs/api.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/api.md): the public API, module by module, one line a name;
126
126
  `mkdocs.yml` builds these pages into a site, with every name's docstring
127
127
  - [docs/adr/](https://github.com/karimmattar/domainkit/tree/main/docs/adr): the decisions behind the design
128
- - [CHANGELOG.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/CHANGELOG.md) and [SECURITY.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/SECURITY.md)
128
+ - [CHANGELOG.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/CHANGELOG.md) and [SECURITY.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/SECURITY.md)
129
129
 
130
130
  ## Quick start
131
131
 
@@ -171,7 +171,7 @@ grow it. Without `--minimal`, `startdomain` writes a fuller example (notes
171
171
  as child entities, an owner, events and a handler, filters); the tutorial
172
172
  starts from that one. A route the caller may not reach answers 404, as an unknown path does,
173
173
  so check the path first (`/docs` lists every route). `createsuperuser`
174
- without options asks for each value instead. [docs/tutorial.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/tutorial.md)
174
+ without options asks for each value instead. [docs/tutorial.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/tutorial.md)
175
175
  goes on from here, in six parts from a first route: rules written by
176
176
  hand, permissions, events run by the worker, and tests.
177
177
 
@@ -179,7 +179,7 @@ hand, permissions, events run by the worker, and tests.
179
179
  Users, groups, and permissions are installed, requests are authenticated,
180
180
  and every route must say who may call it: generated domains need their
181
181
  model permissions, and `/auth` and `/admin/auth` log users in and manage
182
- them ([docs/auth.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/auth.md)).
182
+ them ([docs/auth.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/auth.md)).
183
183
 
184
184
 
185
185
  ```text
@@ -211,13 +211,13 @@ also turn the API docs off, send HSTS for a year, and limit each caller to
211
211
 
212
212
  Serve it with one worker process per core, each on its own event loop:
213
213
  `uvicorn config.asgi:application --workers 4 --loop uvloop`, or Granian
214
- (`pip install 'domainkit[granian]'`). [docs/reference/servers.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/reference/servers.md)
215
- gives the whole command with its limits, and [docs/performance.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/performance.md)
214
+ (`pip install 'domainkit[granian]'`). [docs/reference/servers.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/reference/servers.md)
215
+ gives the whole command with its limits, and [docs/performance.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/performance.md)
216
216
  how many cores a load needs.
217
217
 
218
218
  ## Developing domainkit
219
219
 
220
- [CONTRIBUTING.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/CONTRIBUTING.md)
220
+ [CONTRIBUTING.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/CONTRIBUTING.md)
221
221
  says how to set up, which checks a change must pass, and how to write it
222
222
  up. In short:
223
223
 
@@ -267,8 +267,8 @@ not the whole suite. A release reuses the run of its commit's push to
267
267
  A full mutation testing run happens weekly, in 17 shards that run side by
268
268
  side; each writes its score and the mutants no test caught to its job
269
269
  summary. Releases are published to PyPI
270
- from a version tag; see [docs/versioning.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/versioning.md).
270
+ from a version tag; see [docs/versioning.md](https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/versioning.md).
271
271
 
272
272
  ## License
273
273
 
274
- MIT; see [LICENSE](https://github.com/karimmattar/domainkit/blob/v2.0.0/LICENSE).
274
+ MIT; see [LICENSE](https://github.com/karimmattar/domainkit/blob/v2.1.1/LICENSE).
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "domainkit"
3
- version = "2.0.0"
3
+ version = "2.1.1"
4
4
  description = "A Django-style framework for domain-driven FastAPI services."
5
5
  readme = "README.md"
6
6
  license = "MIT"
@@ -53,8 +53,12 @@ jwt = ["pyjwt[crypto] (>=2.15.0,<3.0.0)"]
53
53
  # Second factors for domainkit.contrib.auth: AES-GCM for the TOTP secrets
54
54
  # it stores (auth.mfa).
55
55
  mfa = ["cryptography (>=50.0.2,<51.0.0)"]
56
+ # Passkeys and bound devices (domainkit.contrib.devices, and the sign-in
57
+ # approvals of domainkit.contrib.ciba): their signatures are checked with
58
+ # cryptography.
59
+ devices = ["cryptography (>=50.0.2,<51.0.0)"]
56
60
  # Signed checkpoints of the audit trail (AUDIT.CHECKPOINT_KEY, Ed25519):
57
- # auditprune and auditverify --export.
61
+ # "audit prune" and "audit verify --export".
58
62
  audit = ["cryptography (>=50.0.2,<51.0.0)"]
59
63
  # Ledgers for evidence (WORM): immudb's SDK, with its verified operations.
60
64
  # grpcio for TLS channels, ecdsa's signature error, and protobuf's Empty
@@ -148,8 +152,8 @@ domainkit = "domainkit.management:execute_from_command_line"
148
152
 
149
153
  [project.urls]
150
154
  Homepage = "https://github.com/karimmattar/domainkit"
151
- Documentation = "https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/reference.md"
152
- Changelog = "https://github.com/karimmattar/domainkit/blob/v2.0.0/CHANGELOG.md"
155
+ Documentation = "https://github.com/karimmattar/domainkit/blob/v2.1.1/docs/reference.md"
156
+ Changelog = "https://github.com/karimmattar/domainkit/blob/v2.1.1/CHANGELOG.md"
153
157
  Issues = "https://github.com/karimmattar/domainkit/issues"
154
158
 
155
159
  [build-system]
@@ -20,6 +20,11 @@ if TYPE_CHECKING:
20
20
  from domainkit.db.routing import DatabaseRouter
21
21
 
22
22
  CONFIG_MODULE = "apps"
23
+ EXTRAS: Final = {
24
+ "domainkit.contrib.ciba": "devices",
25
+ "domainkit.contrib.devices": "devices",
26
+ }
27
+ """The extra each of domainkit's apps needs to be imported at all, if any."""
23
28
  MODELS_MODULE: Final = "models"
24
29
  CONTROLLERS_MODULE: Final = "controllers"
25
30
  """Where a four-file domain's use cases and ``@handles`` handlers live."""
@@ -249,7 +254,7 @@ def defined_hook_methods(config: DomainConfig) -> list[tuple[str, str]]:
249
254
 
250
255
 
251
256
  def _import_domain(name: str) -> ModuleType:
252
- """Import a domain package, explaining a missing one."""
257
+ """Import a domain package, explaining a missing one, or a missing extra."""
253
258
  try:
254
259
  module = import_module(name)
255
260
  except ModuleNotFoundError as exc:
@@ -259,6 +264,11 @@ def _import_domain(name: str) -> ModuleType:
259
264
  raise ImproperlyConfigured(
260
265
  f"Installed domain {name!r} cannot be imported."
261
266
  ) from exc
267
+ if name in EXTRAS:
268
+ raise ImproperlyConfigured(
269
+ f"Installed domain {name!r} needs {exc.name!r}, which is not "
270
+ f'installed: pip install "domainkit[{EXTRAS[name]}]".'
271
+ ) from exc
262
272
  raise
263
273
  if not hasattr(module, "__path__"):
264
274
  raise ImproperlyConfigured(f"Installed domain {name!r} must be a package.")
@@ -50,6 +50,7 @@ from .devices import (
50
50
  proven_limits,
51
51
  )
52
52
  from .events import UserLoggedOut
53
+ from .gates import check_gates_passed, pass_login_gates
53
54
  from .hashers import acheck_password
54
55
  from .models import AbstractBaseUser, UserId
55
56
  from .settings import auth_settings
@@ -190,6 +191,7 @@ async def login(
190
191
  """Check an identifier and password; return tokens, or a second-factor challenge."""
191
192
  _no_store(response)
192
193
  user = await check_password(request, body)
194
+ await pass_login_gates(request, user)
193
195
  from .mfa import challenge # Imports this module.
194
196
 
195
197
  if (pending := await challenge(user)) is not None:
@@ -278,7 +280,10 @@ async def issue_login(
278
280
  """Record the user's login, and issue them tokens (the first class's).
279
281
 
280
282
  Past ``AUTH.MAX_LOGINS``, the user's oldest logins end. The login is
281
- held to what was checked (``held_login``).
283
+ held to what was checked (``held_login``). A route of the project's
284
+ that issues a login runs ``pass_login_gates(request, user)`` first:
285
+ while a login gate is registered, one that skipped them raises
286
+ ``LoginNotGated``.
282
287
  """
283
288
  with _acting_as(user):
284
289
  async with audited_changes(), AuthUnitOfWork() as uow:
@@ -303,10 +308,15 @@ async def held_login(
303
308
  a factor on hold, so a login checked before them and issued after
304
309
  never survives them (SEC-16a-6).
305
310
 
311
+ The user passed the login gates first (``gates``): a login that skipped
312
+ them is refused while any is registered.
313
+
306
314
  Raises:
307
315
  AuthenticationFailed: The password changed, or a factor was turned
308
316
  on, since the check: the login starts again.
317
+ LoginNotGated: A gate is registered, and the login skipped them.
309
318
  """
319
+ check_gates_passed(user)
310
320
  await uow.tokens.lock_user(user.id)
311
321
  stored = await uow.users.get(UserId(user.id))
312
322
  if stored.password != user.password or (
@@ -197,6 +197,7 @@ class AuthConfig(DomainConfig):
197
197
  NotFound: No user has the id.
198
198
  """
199
199
  from .cookies import cookie_names, start_session
200
+ from .gates import gates_passed
200
201
  from .uow import AuthUnitOfWork
201
202
 
202
203
  _only_in_tests("issue_test_session")
@@ -209,7 +210,8 @@ class AuthConfig(DomainConfig):
209
210
  async with AuthUnitOfWork() as uow:
210
211
  user = await uow.users.get(user_id)
211
212
  response = Response()
212
- started = await start_session(user, response)
213
+ with gates_passed(user.id): # A test's session: no request to judge.
214
+ started = await start_session(user, response)
213
215
  cookies: SimpleCookie = SimpleCookie()
214
216
  for header in response.headers.getlist("set-cookie"):
215
217
  cookies.load(header)
@@ -79,6 +79,7 @@ from .authentication import (
79
79
  from .captcha import captcha
80
80
  from .devices import hand_out
81
81
  from .events import UserLoggedOut
82
+ from .gates import pass_login_gates
82
83
  from .mfa import MfaLoginIn, challenge, first_use_after_code, verify_challenge
83
84
  from .models import AbstractBaseUser, UserId
84
85
  from .principals import forget
@@ -280,6 +281,7 @@ async def log_in(
280
281
  _no_store(response)
281
282
  check_origin(request)
282
283
  user = await check_password(request, body)
284
+ await pass_login_gates(request, user)
283
285
  if (pending := await challenge(user)) is not None:
284
286
  response.status_code = status.HTTP_202_ACCEPTED
285
287
  return pending # The device proof waits for the second factor.
@@ -309,6 +311,7 @@ async def log_in_with_code(
309
311
  user = await first_use_after_code(
310
312
  await verify_challenge(request, body.mfa_token, body.code), body.new_password
311
313
  )
314
+ await pass_login_gates(request, user)
312
315
  started = await start_session(user, response, previous=_session_of(request))
313
316
  await hand_out(request, response, user)
314
317
  return started
@@ -405,6 +408,19 @@ async def start_session(
405
408
  return CsrfOut(csrf_token=token)
406
409
 
407
410
 
411
+ async def start_browser_session(
412
+ request: Request, user: AbstractBaseUser, response: Response
413
+ ) -> CsrfOut:
414
+ """A browser session for ``user``, whose login was checked another way.
415
+
416
+ For apps that log users in by other means (a sign-in approved from
417
+ the phone): the session the request's cookie held ends, as at
418
+ ``/session``. Check the request's origin first (``check_origin``),
419
+ before anything is spent, and run the login gates or pass them.
420
+ """
421
+ return await start_session(user, response, previous=_session_of(request))
422
+
423
+
408
424
  def _session_of(request: Request) -> str | None:
409
425
  """The session token a browser's cookie authenticated the request with."""
410
426
  credentials = request.scope.get("auth")
@@ -0,0 +1,104 @@
1
+ """Login gates: checks every login passes before it is issued (ADR 0128).
2
+
3
+ A domain registers a gate in ``DomainConfig.ready()``. The gate takes the
4
+ request and the user, and raises to refuse the login::
5
+
6
+ from domainkit.contrib.auth.gates import on_login_gate
7
+
8
+ async def approved_from_the_phone(request: Request, user: AbstractBaseUser) -> None:
9
+ if not await approved(request, user):
10
+ raise PhoneApprovalRequired()
11
+
12
+ class SignInConfig(DomainConfig):
13
+ def ready(self) -> None:
14
+ on_login_gate(approved_from_the_phone)
15
+
16
+ Every auth route that issues a login calls ``pass_login_gates`` with its
17
+ request and the user before issuing. These are ``/login``, ``/session``,
18
+ ``/mfa/login``, ``/session/mfa``, the passkey and device logins, and the
19
+ identity providers' logins. Gates run in ``INSTALLED_DOMAINS`` order, and
20
+ the first that raises refuses the login.
21
+
22
+ Gates fail closed. While a gate is registered, ``held_login`` refuses a
23
+ login whose user did not pass them in the current context
24
+ (``LoginNotGated``), so a route that forgets the call cannot issue.
25
+ Code that issues a login on the server side, with no request for the
26
+ gates to judge, says so with ``gates_passed(user_id)``. Examples are a
27
+ sign-in approved from a phone and a test's session.
28
+ """
29
+
30
+ from collections.abc import Awaitable, Callable, Iterator
31
+ from contextlib import contextmanager
32
+ from contextvars import ContextVar
33
+ from typing import Any, Final
34
+ from uuid import UUID
35
+
36
+ from starlette.requests import Request
37
+
38
+ from domainkit.apps.hooks import HookPoint
39
+ from domainkit.exceptions import DomainkitError
40
+
41
+ from .models import AbstractBaseUser
42
+
43
+ __all__ = [
44
+ "LoginGate",
45
+ "LoginNotGated",
46
+ "check_gates_passed",
47
+ "gates_passed",
48
+ "on_login_gate",
49
+ "pass_login_gates",
50
+ ]
51
+
52
+ type LoginGate = Callable[[Request, AbstractBaseUser], Awaitable[None]]
53
+ """A check of a login: return to let it through, raise to refuse it."""
54
+
55
+ on_login_gate: Final[HookPoint[LoginGate]] = HookPoint(
56
+ "login gate", arguments=2, awaited=True
57
+ )
58
+ """Register a gate every login passes (``on_login_gate(gate)`` in ``ready()``)."""
59
+
60
+ _passed: ContextVar[Any] = ContextVar("login_gates_passed", default=None)
61
+ """The id of the user whose login passed the gates in this context."""
62
+
63
+
64
+ class LoginNotGated(RuntimeError, DomainkitError):
65
+ """A login was issued without passing the gates: a route forgot them (500)."""
66
+
67
+
68
+ async def pass_login_gates(request: Request, user: AbstractBaseUser) -> None:
69
+ """Run every gate on the login of ``user``; record that it passed.
70
+
71
+ Raises:
72
+ Exception: Whatever the first refusing gate raises.
73
+ """
74
+ for hook in on_login_gate:
75
+ await hook.call(request, user)
76
+ _passed.set(user.id)
77
+
78
+
79
+ @contextmanager
80
+ def gates_passed(user_id: UUID | object) -> Iterator[None]:
81
+ """Let the login of ``user_id`` through, in the block, with no gate run.
82
+
83
+ For code that issues a login on the server side: a sign-in approved
84
+ from the user's phone, or a test's session. Never wrap a login a
85
+ request asked for in it: run the gates on that request instead.
86
+ """
87
+ token = _passed.set(user_id)
88
+ try:
89
+ yield
90
+ finally:
91
+ _passed.reset(token)
92
+
93
+
94
+ def check_gates_passed(user: AbstractBaseUser) -> None:
95
+ """Refuse the login of ``user`` if gates exist and it did not pass them.
96
+
97
+ Raises:
98
+ LoginNotGated: A gate is registered and the login skipped them.
99
+ """
100
+ if on_login_gate.hooks() and _passed.get() != user.id:
101
+ raise LoginNotGated(
102
+ "A login was issued without pass_login_gates(request, user): "
103
+ "every route that issues a login runs the login gates first."
104
+ )