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.
- {domainkit-2.0.0 → domainkit-2.1.1}/PKG-INFO +39 -37
- {domainkit-2.0.0 → domainkit-2.1.1}/README.md +34 -34
- {domainkit-2.0.0 → domainkit-2.1.1}/pyproject.toml +8 -4
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/apps/config.py +11 -1
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/api.py +11 -1
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/apps.py +3 -1
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/cookies.py +16 -0
- domainkit-2.1.1/src/domainkit/contrib/auth/gates.py +104 -0
- domainkit-2.1.1/src/domainkit/contrib/auth/integration.py +84 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/mfa.py +32 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/recovery.py +35 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/sca.py +87 -23
- domainkit-2.1.1/src/domainkit/contrib/ciba/__init__.py +92 -0
- domainkit-2.1.1/src/domainkit/contrib/ciba/api.py +664 -0
- domainkit-2.1.1/src/domainkit/contrib/ciba/apps.py +173 -0
- domainkit-2.1.1/src/domainkit/contrib/ciba/clients.py +357 -0
- domainkit-2.1.1/src/domainkit/contrib/ciba/events.py +37 -0
- domainkit-2.1.1/src/domainkit/contrib/ciba/exceptions.py +271 -0
- domainkit-2.1.1/src/domainkit/contrib/ciba/gate.py +64 -0
- domainkit-2.1.1/src/domainkit/contrib/ciba/management/__init__.py +1 -0
- domainkit-2.1.1/src/domainkit/contrib/ciba/management/commands/__init__.py +1 -0
- domainkit-2.1.1/src/domainkit/contrib/ciba/management/commands/ciba.py +103 -0
- domainkit-2.1.1/src/domainkit/contrib/ciba/oidc.py +482 -0
- domainkit-2.1.1/src/domainkit/contrib/ciba/personal.py +79 -0
- domainkit-2.1.1/src/domainkit/contrib/ciba/services.py +552 -0
- domainkit-2.1.1/src/domainkit/contrib/ciba/settings.py +87 -0
- domainkit-2.1.1/src/domainkit/contrib/ciba/stores.py +420 -0
- domainkit-2.1.1/src/domainkit/contrib/ciba/tables.py +92 -0
- domainkit-2.1.1/src/domainkit/contrib/ciba/tasks.py +22 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/devices/__init__.py +10 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/devices/api.py +174 -3
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/devices/apps.py +13 -1
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/devices/binding.py +32 -14
- domainkit-2.1.1/src/domainkit/contrib/devices/enrollment.py +198 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/devices/exceptions.py +47 -0
- domainkit-2.1.1/src/domainkit/contrib/devices/management/__init__.py +1 -0
- domainkit-2.1.1/src/domainkit/contrib/devices/management/commands/__init__.py +1 -0
- domainkit-2.1.1/src/domainkit/contrib/devices/management/commands/unbinddevices.py +52 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/devices/settings.py +8 -0
- domainkit-2.1.1/src/domainkit/contrib/devices/templates/mail/devices/enrollment_code.subject.txt +1 -0
- domainkit-2.1.1/src/domainkit/contrib/devices/templates/mail/devices/enrollment_code.txt +10 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/identity/api.py +11 -6
- domainkit-2.1.1/src/domainkit/i18n/locale/ar/LC_MESSAGES/messages.mo +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/i18n/locale/ar/LC_MESSAGES/messages.po +45 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/i18n/locale/en/LC_MESSAGES/messages.po +45 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/commands/dbshell.py +24 -4
- domainkit-2.0.0/src/domainkit/contrib/auth/integration.py +0 -52
- domainkit-2.0.0/src/domainkit/i18n/locale/ar/LC_MESSAGES/messages.mo +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/LICENSE +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/__main__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/apps/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/apps/hooks.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/apps/registry.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/architecture.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/broker/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/broker/base.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/broker/handler.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/broker/kafka.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/broker/memory.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/broker/nats_jetstream.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/broker/pull.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/broker/rabbitmq.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/broker/redis_streams.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/broker/sqs.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/cache/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/cache/base.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/cache/core.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/cache/decorators.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/cache/handler.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/cache/memory.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/cache/metrics.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/cache/pages.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/cache/redis.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/checks.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/clock.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/cloud/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/cloud/aws.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/cloud/azure.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/cloud/google.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/conf/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/conf/env.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/conf/global_settings.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/conf/lazy.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/context.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/accounting/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/accounting/api.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/accounting/apps.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/accounting/exceptions.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/accounting/holds.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/accounting/hooks.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/accounting/ledger.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/accounting/management/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/accounting/management/commands/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/accounting/management/commands/accounting.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/accounting/models.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/accounting/personal.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/accounting/protection.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/accounting/reconciliation.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/accounting/reports.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/accounting/schemas.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/accounting/settings.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/accounting/tables.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/accounting/tasks.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/accounting/uow.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/admin/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/admin/sites.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/approvals/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/approvals/api.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/approvals/apps.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/approvals/builtin.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/approvals/exceptions.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/approvals/guards.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/approvals/management/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/approvals/management/commands/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/approvals/management/commands/approvals.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/approvals/models.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/approvals/personal.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/approvals/rules.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/approvals/services.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/approvals/settings.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/approvals/tables.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/approvals/tasks.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/approvals/uow.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/audit/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/audit/api.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/audit/apps.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/audit/baseline.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/audit/checkpoints.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/audit/history.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/audit/ledgerstates.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/audit/management/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/audit/management/commands/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/audit/management/commands/audit.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/audit/models.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/audit/personal.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/audit/protection.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/audit/pruning.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/audit/recorder.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/audit/seals.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/audit/settings.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/audit/tables.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/audit/tasks.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/audit/testing.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/audit/trails.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/access.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/admin.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/authentication.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/backends.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/captcha.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/certificates.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/codes.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/common-passwords.NOTICE +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/common-passwords.txt.gz +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/devices.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/erasure.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/events.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/exceptions.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/hashers.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/management/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/management/commands/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/management/commands/addcertificate.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/management/commands/changepassword.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/management/commands/cleartokens.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/management/commands/createsuperuser.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/management/commands/createtoken.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/management/commands/resealmfa.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/management/commands/resetmfa.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/metrics.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/middleware.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/models.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/onetime.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/permissions.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/personal_tokens.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/principals.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/repositories.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/settings.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/signup.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/stepup.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/tables.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/tasks.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/templates/mail/auth/email_verification_code.subject.txt +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/templates/mail/auth/email_verification_code.txt +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/templates/mail/auth/password_reset_code.subject.txt +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/templates/mail/auth/password_reset_code.txt +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/templates/mail/auth/signup_code.subject.txt +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/templates/mail/auth/signup_code.txt +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/templates/mail/auth/signup_exists.subject.txt +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/templates/mail/auth/signup_exists.txt +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/testing.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/throttling.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/tokens.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/totp.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/uow.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/users.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/auth/validators.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/contenttypes/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/contenttypes/apps.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/contenttypes/models.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/contenttypes/sync.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/contenttypes/tables.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/devices/events.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/devices/passkeys.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/devices/personal.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/devices/push.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/devices/stores.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/devices/tables.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/devices/webauthn.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/evidence/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/evidence/apps.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/evidence/management/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/evidence/management/commands/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/evidence/management/commands/evidence.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/evidence/models.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/evidence/settings.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/evidence/store.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/evidence/tasks.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/flags/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/flags/admin.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/flags/apps.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/flags/dependencies.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/flags/events.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/flags/exceptions.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/flags/management/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/flags/management/commands/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/flags/management/commands/flags.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/flags/models.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/flags/settings.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/flags/store.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/flags/tables.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/flags/uow.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/idempotency/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/idempotency/apps.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/idempotency/middleware.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/idempotency/operations.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/idempotency/settings.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/idempotency/statements.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/idempotency/tables.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/idempotency/tasks.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/identity/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/identity/apps.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/identity/binding.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/identity/events.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/identity/exceptions.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/identity/ldap.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/identity/personal.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/identity/providers.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/identity/saml.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/identity/services.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/identity/settings.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/identity/stores.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/identity/tables.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/keys/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/keys/apps.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/keys/management/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/keys/management/commands/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/keys/management/commands/keys.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/keys/operations.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/keys/settings.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/keys/store.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/keys/tables.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/limits/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/limits/api.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/limits/apps.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/limits/exceptions.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/limits/management/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/limits/management/commands/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/limits/management/commands/limits.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/limits/models.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/limits/personal.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/limits/postings.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/limits/services.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/limits/settings.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/limits/tables.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/limits/tasks.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/limits/uow.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/limits/usage.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/mail/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/mail/admins.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/mail/apps.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/mail/backends.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/mail/delivery.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/mail/message.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/mail/providers.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/mail/settings.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/mail/templates.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/messaging/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/messaging/admin.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/messaging/apps.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/messaging/breaker.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/messaging/budget.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/messaging/cron.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/messaging/dispatch.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/messaging/erasure.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/messaging/management/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/messaging/management/commands/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/messaging/management/commands/messages.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/messaging/management/commands/runworker.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/messaging/metrics.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/messaging/ordering.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/messaging/outbox.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/messaging/registry.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/messaging/retry.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/messaging/runs.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/messaging/settings.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/messaging/tables.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/messaging/testing.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/messaging/worker.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/notifications/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/notifications/apps.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/notifications/backends.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/notifications/delivery.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/notifications/events.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/notifications/messages.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/notifications/push.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/notifications/settings.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/notifications/sms.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/objectpermissions/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/objectpermissions/apps.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/objectpermissions/backends.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/objectpermissions/criteria.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/objectpermissions/deletions.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/objectpermissions/models.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/objectpermissions/services.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/objectpermissions/tables.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/objectpermissions/uow.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/phones/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/phones/api.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/phones/apps.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/phones/events.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/phones/exceptions.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/phones/personal.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/phones/services.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/phones/settings.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/phones/stores.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/phones/tables.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/privacy/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/privacy/apps.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/privacy/events.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/privacy/management/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/privacy/management/commands/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/privacy/management/commands/privacy.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/privacy/models.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/privacy/operations.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/privacy/retention.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/webhooks/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/webhooks/admin.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/webhooks/apps.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/webhooks/client.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/webhooks/delivery.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/webhooks/guard.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/webhooks/management/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/webhooks/management/commands/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/webhooks/management/commands/webhooks.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/webhooks/models.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/webhooks/owned.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/webhooks/settings.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/webhooks/signing.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/webhooks/tables.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/contrib/webhooks/uow.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/db/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/db/connections.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/db/dbclock.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/db/derive.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/db/drivers.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/db/encrypted.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/db/errors.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/db/fixtures.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/db/hooks.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/db/migration_env/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/db/migration_env/env.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/db/migration_env/script.py.mako +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/db/migrations.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/db/models.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/db/money.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/db/orm.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/db/partitioning.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/db/places.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/db/query.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/db/refs.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/db/repository.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/db/routing.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/db/snapshots.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/db/squashing.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/db/types.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/db/uow.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/ddd/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/ddd/_dataclass.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/ddd/_validation.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/ddd/choices.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/ddd/events.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/ddd/exceptions.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/ddd/fields.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/ddd/markers.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/ddd/messages.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/ddd/model.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/ddd/pagination.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/ddd/personal.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/ddd/places.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/ddd/preconditions.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/ddd/query.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/ddd/refs.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/ddd/repository.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/ddd/stores.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/ddd/tenancy.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/ddd/uow.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/ddd/usecases.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/deadlines.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/debug/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/debug/middleware.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/debug/queries.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/deprecation.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/encryption.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/exceptions.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/access.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/apidocs.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/application.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/blocking.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/client.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/compression.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/deadlines.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/errors.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/filters.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/guard.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/health.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/live.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/live_events.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/locale.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/metrics.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/middleware.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/openapi.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/pagination.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/ratelimit.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/responses.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/routing.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/servers.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/shedding.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/sse.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/static/redoc/LICENSE +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/static/redoc/redoc.standalone.js +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/static/redoc/redoc.standalone.js.LICENSE.txt +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/static/swagger-ui/LICENSE +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/static/swagger-ui/NOTICE +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/static/swagger-ui/swagger-init.js +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/static/swagger-ui/swagger-ui-bundle.js +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/static/swagger-ui/swagger-ui-bundle.js.LICENSE.txt +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/static/swagger-ui/swagger-ui.css +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/uploads.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/versioning.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/http/websockets.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/i18n/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/i18n/catalogs.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/i18n/extraction.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/i18n/formats.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/i18n/locale/en/LC_MESSAGES/messages.mo +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/i18n/timezone.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/i18n/translation.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/i18n/validation.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/keys/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/keys/_http.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/keys/aws.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/keys/azure.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/keys/gcp.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/keys/huawei.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/keys/pkcs11.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/keys/ring.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/keys/vault.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/ledger/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/ledger/base.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/ledger/handler.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/ledger/immudb.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/ledger/memory.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/ledger/trust.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/lifecycle.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/log.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/actions.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/base.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/commands/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/commands/addcommand.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/commands/addevent.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/commands/addquery.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/commands/broker.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/commands/cache.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/commands/check.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/commands/compilemessages.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/commands/diffsettings.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/commands/dumpdata.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/commands/flush.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/commands/init.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/commands/inspectdb.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/commands/loaddata.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/commands/makemessages.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/commands/makemigrations.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/commands/migrate.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/commands/openapi.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/commands/partitions.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/commands/runserver.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/commands/seed.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/commands/shell.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/commands/showmigrations.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/commands/squashmigrations.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/commands/startaggregate.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/commands/startdomain.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/generators.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/operators.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/minimal/package/__init__.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/minimal/package/api/__init__.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/minimal/package/api/routes.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/minimal/package/application/__init__.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/minimal/package/application/commands.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/minimal/package/application/services.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/minimal/package/application/unit_of_work.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/minimal/package/apps.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/minimal/package/domain/__init__.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/minimal/package/domain/model.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/minimal/package/infrastructure/__init__.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/minimal/package/infrastructure/orm.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/minimal/package/infrastructure/unit_of_work.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/minimal/tests/__init__.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/minimal/tests/fakes.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/minimal/tests/test_api.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/minimal/tests/test_services.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/package/__init__.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/package/api/__init__.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/package/api/routes.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/package/application/__init__.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/package/application/commands.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/package/application/handlers.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/package/application/services.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/package/application/unit_of_work.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/package/apps.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/package/domain/__init__.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/package/domain/events.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/package/domain/model.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/package/infrastructure/__init__.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/package/infrastructure/orm.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/package/infrastructure/unit_of_work.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/simple/package/__init__.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/simple/package/controllers.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/simple/package/domain.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/simple/package/models.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/simple/package/routes.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/simple/tests/__init__.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/simple/tests/test_api.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/simple/tests/test_controllers.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/tests/__init__.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/tests/fakes.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/tests/test_api.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/tests/test_model.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/tests/test_services.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/user/package/__init__.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/user/package/models.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/user/tests/__init__.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/domain/user/tests/test_users.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/profiles/fintech/dot-github/workflows/ci.yml-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/profiles/fintech/pyproject.toml-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/profiles/fintech/src/config/rules.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/profiles/fintech/src/config/settings/base.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/profiles/fintech/src/config/settings/local.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/profiles/fintech/src/config/settings/production.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/profiles/fintech/src/config/settings/test.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/profiles/fintech/src/config/urls.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/profiles/fintech/src/domains/payments/__init__.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/profiles/fintech/src/domains/payments/api/__init__.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/profiles/fintech/src/domains/payments/api/routes.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/profiles/fintech/src/domains/payments/application/__init__.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/profiles/fintech/src/domains/payments/application/commands.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/profiles/fintech/src/domains/payments/application/services.py-tpl +0 -0
- {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
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/profiles/fintech/src/domains/payments/apps.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/profiles/fintech/src/domains/payments/domain/__init__.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/profiles/fintech/src/domains/payments/domain/model.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/profiles/fintech/src/domains/payments/infrastructure/__init__.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/profiles/fintech/src/domains/payments/infrastructure/orm.py-tpl +0 -0
- {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
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/profiles/fintech/tests/conftest.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/profiles/fintech/tests/payments/__init__.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/profiles/fintech/tests/payments/test_cards.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/profiles/fintech/tests/payments/test_transfers.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/profiles/fintech/tests/people.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/profiles/fintech/tests/test_controls.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/project/Dockerfile-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/project/dot-dockerignore-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/project/dot-env-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/project/dot-github/dependabot.yml-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/project/dot-github/workflows/ci.yml-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/project/dot-gitignore-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/project/manage.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/project/pyproject.toml-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/project/src/config/__init__.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/project/src/config/asgi.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/project/src/config/settings/__init__.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/project/src/config/settings/base.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/project/src/config/settings/local.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/project/src/config/settings/production.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/project/src/config/settings/test.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/project/src/config/urls.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/project/src/domains/__init__.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/project/tests/__init__.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/management/templates/project/tests/test_health.py-tpl +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/money/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/money/iso4217.csv +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/py.typed +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/reporting.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/resources/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/resources/access.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/resources/batches.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/resources/conditional.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/resources/events.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/resources/policies.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/resources/renderers.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/resources/routing/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/resources/routing/batching.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/resources/routing/commands.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/resources/routing/context.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/resources/routing/crud.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/resources/routing/declaring.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/resources/routing/listing.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/resources/routing/presenting.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/resources/routing/queries.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/resources/routing/reach.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/resources/routing/reading.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/resources/routing/values.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/resources/schemas.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/search/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/search/_http.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/search/meilisearch.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/search/opensearch.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/signing.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/storage/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/storage/azure.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/storage/base.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/storage/filesystem.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/storage/gcs.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/storage/handler.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/storage/images.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/storage/memory.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/storage/remote.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/storage/s3.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/storage/scanning.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/tasks.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/tenancy.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/testing/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/testing/authenticators.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/testing/blocking.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/testing/clients.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/testing/databases.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/testing/factories.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/testing/kms.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/testing/live.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/testing/queries.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/tracing.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/utils/__init__.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/utils/closing.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/utils/decimals.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/utils/delivery.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/utils/formatting.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/utils/headers.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/utils/loops.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/utils/module_loading.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/utils/rates.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/utils/readiness.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/utils/redis_urls.py +0 -0
- {domainkit-2.0.0 → domainkit-2.1.1}/src/domainkit/utils/text.py +0 -0
- {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.
|
|
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.
|
|
104
|
-
Project-URL: Documentation, https://github.com/karimmattar/domainkit/blob/v2.
|
|
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.
|
|
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.
|
|
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.
|
|
178
|
-
for each alarm, [docs/security.md](https://github.com/karimmattar/domainkit/blob/v2.
|
|
179
|
-
checklist, and [docs/upgrading.md](https://github.com/karimmattar/domainkit/blob/v2.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
323
|
-
gives the whole command with its limits, and [docs/performance.md](https://github.com/karimmattar/domainkit/blob/v2.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
70
|
-
for each alarm, [docs/security.md](https://github.com/karimmattar/domainkit/blob/v2.
|
|
71
|
-
checklist, and [docs/upgrading.md](https://github.com/karimmattar/domainkit/blob/v2.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
215
|
-
gives the whole command with its limits, and [docs/performance.md](https://github.com/karimmattar/domainkit/blob/v2.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
#
|
|
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.
|
|
152
|
-
Changelog = "https://github.com/karimmattar/domainkit/blob/v2.
|
|
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
|
-
|
|
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
|
+
)
|