domainkit 1.7.1__tar.gz → 2.0.0__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-1.7.1 → domainkit-2.0.0}/PKG-INFO +38 -38
- {domainkit-1.7.1 → domainkit-2.0.0}/README.md +35 -35
- {domainkit-1.7.1 → domainkit-2.0.0}/pyproject.toml +3 -3
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/conf/global_settings.py +1 -1
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/audit/apps.py +7 -2
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/audit/baseline.py +111 -22
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/audit/management/commands/audit.py +6 -4
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/audit/pruning.py +108 -53
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/audit/trails.py +5 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/__init__.py +10 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/admin.py +3 -1
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/api.py +21 -11
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/apps.py +34 -17
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/backends.py +13 -6
- domainkit-2.0.0/src/domainkit/contrib/auth/codes.py +177 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/cookies.py +1 -1
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/events.py +6 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/exceptions.py +24 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/management/commands/cleartokens.py +2 -1
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/management/commands/createsuperuser.py +66 -16
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/models.py +118 -13
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/onetime.py +10 -46
- domainkit-2.0.0/src/domainkit/contrib/auth/recovery.py +513 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/repositories.py +131 -17
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/settings.py +42 -31
- domainkit-2.0.0/src/domainkit/contrib/auth/signup.py +389 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/tables.py +48 -5
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/tasks.py +5 -4
- domainkit-2.0.0/src/domainkit/contrib/auth/templates/mail/auth/email_verification_code.subject.txt +1 -0
- domainkit-2.0.0/src/domainkit/contrib/auth/templates/mail/auth/email_verification_code.txt +9 -0
- domainkit-2.0.0/src/domainkit/contrib/auth/templates/mail/auth/password_reset_code.subject.txt +1 -0
- domainkit-2.0.0/src/domainkit/contrib/auth/templates/mail/auth/password_reset_code.txt +9 -0
- domainkit-2.0.0/src/domainkit/contrib/auth/templates/mail/auth/signup_code.subject.txt +1 -0
- domainkit-1.7.1/src/domainkit/contrib/auth/templates/mail/auth/signup_confirm.txt → domainkit-2.0.0/src/domainkit/contrib/auth/templates/mail/auth/signup_code.txt +4 -2
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/testing.py +24 -1
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/throttling.py +5 -2
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/uow.py +24 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/mail/backends.py +1 -1
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/mail/templates.py +4 -4
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/messaging/apps.py +6 -3
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/messaging/dispatch.py +2 -3
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/messaging/erasure.py +6 -6
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/messaging/management/commands/runworker.py +2 -1
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/messaging/outbox.py +10 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/messaging/settings.py +1 -1
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/phones/services.py +6 -8
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/webhooks/admin.py +2 -1
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/webhooks/guard.py +4 -26
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/db/connections.py +81 -13
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/db/routing.py +17 -7
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/db/uow.py +4 -1
- domainkit-2.0.0/src/domainkit/i18n/locale/ar/LC_MESSAGES/messages.mo +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/i18n/locale/ar/LC_MESSAGES/messages.po +9 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/i18n/locale/en/LC_MESSAGES/messages.po +9 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/commands/startdomain.py +4 -3
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/generators.py +15 -9
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/profiles/fintech/src/config/settings/base.py-tpl +2 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/project/Dockerfile-tpl +5 -4
- domainkit-2.0.0/src/domainkit/management/templates/project/dot-github/dependabot.yml-tpl +19 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/project/src/config/settings/base.py-tpl +8 -4
- domainkit-1.7.1/src/domainkit/contrib/auth/recovery.py +0 -361
- domainkit-1.7.1/src/domainkit/contrib/auth/signup.py +0 -332
- domainkit-1.7.1/src/domainkit/contrib/auth/templates/mail/auth/email_verification.subject.txt +0 -1
- domainkit-1.7.1/src/domainkit/contrib/auth/templates/mail/auth/email_verification.txt +0 -7
- domainkit-1.7.1/src/domainkit/contrib/auth/templates/mail/auth/password_reset.subject.txt +0 -1
- domainkit-1.7.1/src/domainkit/contrib/auth/templates/mail/auth/password_reset.txt +0 -8
- domainkit-1.7.1/src/domainkit/contrib/auth/templates/mail/auth/signup_confirm.subject.txt +0 -1
- domainkit-1.7.1/src/domainkit/i18n/locale/ar/LC_MESSAGES/messages.mo +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/LICENSE +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/__main__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/apps/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/apps/config.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/apps/hooks.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/apps/registry.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/architecture.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/broker/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/broker/base.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/broker/handler.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/broker/kafka.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/broker/memory.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/broker/nats_jetstream.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/broker/pull.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/broker/rabbitmq.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/broker/redis_streams.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/broker/sqs.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/cache/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/cache/base.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/cache/core.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/cache/decorators.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/cache/handler.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/cache/memory.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/cache/metrics.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/cache/pages.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/cache/redis.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/checks.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/clock.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/cloud/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/cloud/aws.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/cloud/azure.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/cloud/google.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/conf/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/conf/env.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/conf/lazy.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/context.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/accounting/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/accounting/api.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/accounting/apps.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/accounting/exceptions.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/accounting/holds.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/accounting/hooks.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/accounting/ledger.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/accounting/management/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/accounting/management/commands/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/accounting/management/commands/accounting.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/accounting/models.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/accounting/personal.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/accounting/protection.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/accounting/reconciliation.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/accounting/reports.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/accounting/schemas.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/accounting/settings.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/accounting/tables.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/accounting/tasks.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/accounting/uow.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/admin/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/admin/sites.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/approvals/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/approvals/api.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/approvals/apps.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/approvals/builtin.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/approvals/exceptions.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/approvals/guards.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/approvals/management/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/approvals/management/commands/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/approvals/management/commands/approvals.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/approvals/models.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/approvals/personal.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/approvals/rules.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/approvals/services.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/approvals/settings.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/approvals/tables.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/approvals/tasks.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/approvals/uow.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/audit/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/audit/api.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/audit/checkpoints.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/audit/history.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/audit/ledgerstates.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/audit/management/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/audit/management/commands/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/audit/models.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/audit/personal.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/audit/protection.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/audit/recorder.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/audit/seals.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/audit/settings.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/audit/tables.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/audit/tasks.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/audit/testing.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/access.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/authentication.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/captcha.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/certificates.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/common-passwords.NOTICE +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/common-passwords.txt.gz +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/devices.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/erasure.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/hashers.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/integration.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/management/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/management/commands/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/management/commands/addcertificate.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/management/commands/changepassword.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/management/commands/createtoken.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/management/commands/resealmfa.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/management/commands/resetmfa.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/metrics.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/mfa.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/middleware.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/permissions.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/personal_tokens.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/principals.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/sca.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/stepup.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/templates/mail/auth/signup_exists.subject.txt +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/templates/mail/auth/signup_exists.txt +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/tokens.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/totp.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/users.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/validators.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/contenttypes/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/contenttypes/apps.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/contenttypes/models.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/contenttypes/sync.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/contenttypes/tables.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/devices/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/devices/api.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/devices/apps.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/devices/binding.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/devices/events.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/devices/exceptions.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/devices/passkeys.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/devices/personal.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/devices/push.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/devices/settings.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/devices/stores.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/devices/tables.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/devices/webauthn.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/evidence/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/evidence/apps.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/evidence/management/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/evidence/management/commands/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/evidence/management/commands/evidence.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/evidence/models.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/evidence/settings.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/evidence/store.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/evidence/tasks.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/flags/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/flags/admin.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/flags/apps.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/flags/dependencies.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/flags/events.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/flags/exceptions.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/flags/management/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/flags/management/commands/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/flags/management/commands/flags.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/flags/models.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/flags/settings.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/flags/store.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/flags/tables.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/flags/uow.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/idempotency/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/idempotency/apps.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/idempotency/middleware.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/idempotency/operations.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/idempotency/settings.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/idempotency/statements.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/idempotency/tables.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/idempotency/tasks.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/identity/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/identity/api.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/identity/apps.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/identity/binding.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/identity/events.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/identity/exceptions.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/identity/ldap.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/identity/personal.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/identity/providers.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/identity/saml.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/identity/services.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/identity/settings.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/identity/stores.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/identity/tables.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/keys/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/keys/apps.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/keys/management/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/keys/management/commands/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/keys/management/commands/keys.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/keys/operations.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/keys/settings.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/keys/store.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/keys/tables.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/limits/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/limits/api.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/limits/apps.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/limits/exceptions.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/limits/management/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/limits/management/commands/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/limits/management/commands/limits.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/limits/models.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/limits/personal.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/limits/postings.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/limits/services.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/limits/settings.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/limits/tables.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/limits/tasks.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/limits/uow.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/limits/usage.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/mail/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/mail/admins.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/mail/apps.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/mail/delivery.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/mail/message.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/mail/providers.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/mail/settings.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/messaging/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/messaging/admin.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/messaging/breaker.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/messaging/budget.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/messaging/cron.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/messaging/management/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/messaging/management/commands/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/messaging/management/commands/messages.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/messaging/metrics.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/messaging/ordering.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/messaging/registry.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/messaging/retry.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/messaging/runs.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/messaging/tables.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/messaging/testing.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/messaging/worker.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/notifications/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/notifications/apps.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/notifications/backends.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/notifications/delivery.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/notifications/events.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/notifications/messages.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/notifications/push.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/notifications/settings.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/notifications/sms.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/objectpermissions/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/objectpermissions/apps.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/objectpermissions/backends.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/objectpermissions/criteria.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/objectpermissions/deletions.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/objectpermissions/models.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/objectpermissions/services.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/objectpermissions/tables.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/objectpermissions/uow.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/phones/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/phones/api.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/phones/apps.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/phones/events.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/phones/exceptions.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/phones/personal.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/phones/settings.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/phones/stores.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/phones/tables.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/privacy/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/privacy/apps.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/privacy/events.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/privacy/management/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/privacy/management/commands/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/privacy/management/commands/privacy.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/privacy/models.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/privacy/operations.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/privacy/retention.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/webhooks/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/webhooks/apps.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/webhooks/client.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/webhooks/delivery.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/webhooks/management/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/webhooks/management/commands/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/webhooks/management/commands/webhooks.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/webhooks/models.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/webhooks/owned.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/webhooks/settings.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/webhooks/signing.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/webhooks/tables.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/webhooks/uow.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/db/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/db/dbclock.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/db/derive.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/db/drivers.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/db/encrypted.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/db/errors.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/db/fixtures.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/db/hooks.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/db/migration_env/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/db/migration_env/env.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/db/migration_env/script.py.mako +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/db/migrations.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/db/models.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/db/money.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/db/orm.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/db/partitioning.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/db/places.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/db/query.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/db/refs.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/db/repository.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/db/snapshots.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/db/squashing.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/db/types.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/ddd/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/ddd/_dataclass.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/ddd/_validation.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/ddd/choices.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/ddd/events.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/ddd/exceptions.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/ddd/fields.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/ddd/markers.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/ddd/messages.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/ddd/model.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/ddd/pagination.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/ddd/personal.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/ddd/places.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/ddd/preconditions.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/ddd/query.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/ddd/refs.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/ddd/repository.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/ddd/stores.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/ddd/tenancy.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/ddd/uow.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/ddd/usecases.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/deadlines.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/debug/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/debug/middleware.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/debug/queries.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/deprecation.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/encryption.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/exceptions.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/access.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/apidocs.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/application.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/blocking.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/client.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/compression.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/deadlines.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/errors.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/filters.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/guard.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/health.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/live.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/live_events.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/locale.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/metrics.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/middleware.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/openapi.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/pagination.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/ratelimit.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/responses.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/routing.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/servers.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/shedding.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/sse.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/static/redoc/LICENSE +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/static/redoc/redoc.standalone.js +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/static/redoc/redoc.standalone.js.LICENSE.txt +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/static/swagger-ui/LICENSE +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/static/swagger-ui/NOTICE +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/static/swagger-ui/swagger-init.js +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/static/swagger-ui/swagger-ui-bundle.js +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/static/swagger-ui/swagger-ui-bundle.js.LICENSE.txt +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/static/swagger-ui/swagger-ui.css +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/uploads.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/versioning.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/websockets.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/i18n/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/i18n/catalogs.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/i18n/extraction.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/i18n/formats.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/i18n/locale/en/LC_MESSAGES/messages.mo +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/i18n/timezone.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/i18n/translation.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/i18n/validation.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/keys/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/keys/_http.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/keys/aws.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/keys/azure.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/keys/gcp.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/keys/huawei.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/keys/pkcs11.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/keys/ring.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/keys/vault.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/ledger/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/ledger/base.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/ledger/handler.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/ledger/immudb.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/ledger/memory.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/ledger/trust.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/lifecycle.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/log.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/actions.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/base.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/commands/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/commands/addcommand.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/commands/addevent.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/commands/addquery.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/commands/broker.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/commands/cache.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/commands/check.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/commands/compilemessages.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/commands/dbshell.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/commands/diffsettings.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/commands/dumpdata.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/commands/flush.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/commands/init.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/commands/inspectdb.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/commands/loaddata.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/commands/makemessages.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/commands/makemigrations.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/commands/migrate.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/commands/openapi.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/commands/partitions.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/commands/runserver.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/commands/seed.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/commands/shell.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/commands/showmigrations.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/commands/squashmigrations.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/commands/startaggregate.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/operators.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/minimal/package/__init__.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/minimal/package/api/__init__.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/minimal/package/api/routes.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/minimal/package/application/__init__.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/minimal/package/application/commands.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/minimal/package/application/services.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/minimal/package/application/unit_of_work.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/minimal/package/apps.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/minimal/package/domain/__init__.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/minimal/package/domain/model.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/minimal/package/infrastructure/__init__.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/minimal/package/infrastructure/orm.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/minimal/package/infrastructure/unit_of_work.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/minimal/tests/__init__.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/minimal/tests/fakes.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/minimal/tests/test_api.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/minimal/tests/test_services.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/package/__init__.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/package/api/__init__.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/package/api/routes.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/package/application/__init__.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/package/application/commands.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/package/application/handlers.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/package/application/services.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/package/application/unit_of_work.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/package/apps.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/package/domain/__init__.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/package/domain/events.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/package/domain/model.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/package/infrastructure/__init__.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/package/infrastructure/orm.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/package/infrastructure/unit_of_work.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/simple/package/__init__.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/simple/package/controllers.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/simple/package/domain.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/simple/package/models.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/simple/package/routes.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/simple/tests/__init__.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/simple/tests/test_api.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/simple/tests/test_controllers.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/tests/__init__.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/tests/fakes.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/tests/test_api.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/tests/test_model.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/tests/test_services.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/user/package/__init__.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/user/package/models.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/user/tests/__init__.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/user/tests/test_users.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/profiles/fintech/dot-github/workflows/ci.yml-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/profiles/fintech/pyproject.toml-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/profiles/fintech/src/config/rules.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/profiles/fintech/src/config/settings/local.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/profiles/fintech/src/config/settings/production.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/profiles/fintech/src/config/settings/test.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/profiles/fintech/src/config/urls.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/profiles/fintech/src/domains/payments/__init__.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/profiles/fintech/src/domains/payments/api/__init__.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/profiles/fintech/src/domains/payments/api/routes.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/profiles/fintech/src/domains/payments/application/__init__.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/profiles/fintech/src/domains/payments/application/commands.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/profiles/fintech/src/domains/payments/application/services.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/profiles/fintech/src/domains/payments/application/unit_of_work.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/profiles/fintech/src/domains/payments/apps.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/profiles/fintech/src/domains/payments/domain/__init__.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/profiles/fintech/src/domains/payments/domain/model.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/profiles/fintech/src/domains/payments/infrastructure/__init__.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/profiles/fintech/src/domains/payments/infrastructure/orm.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/profiles/fintech/src/domains/payments/infrastructure/unit_of_work.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/profiles/fintech/tests/conftest.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/profiles/fintech/tests/payments/__init__.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/profiles/fintech/tests/payments/test_cards.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/profiles/fintech/tests/payments/test_transfers.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/profiles/fintech/tests/people.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/profiles/fintech/tests/test_controls.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/project/dot-dockerignore-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/project/dot-env-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/project/dot-github/workflows/ci.yml-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/project/dot-gitignore-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/project/manage.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/project/pyproject.toml-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/project/src/config/__init__.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/project/src/config/asgi.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/project/src/config/settings/__init__.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/project/src/config/settings/local.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/project/src/config/settings/production.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/project/src/config/settings/test.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/project/src/config/urls.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/project/src/domains/__init__.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/project/tests/__init__.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/project/tests/test_health.py-tpl +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/money/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/money/iso4217.csv +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/py.typed +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/reporting.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/resources/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/resources/access.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/resources/batches.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/resources/conditional.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/resources/events.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/resources/policies.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/resources/renderers.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/resources/routing/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/resources/routing/batching.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/resources/routing/commands.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/resources/routing/context.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/resources/routing/crud.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/resources/routing/declaring.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/resources/routing/listing.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/resources/routing/presenting.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/resources/routing/queries.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/resources/routing/reach.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/resources/routing/reading.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/resources/routing/values.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/resources/schemas.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/search/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/search/_http.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/search/meilisearch.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/search/opensearch.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/signing.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/storage/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/storage/azure.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/storage/base.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/storage/filesystem.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/storage/gcs.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/storage/handler.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/storage/images.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/storage/memory.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/storage/remote.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/storage/s3.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/storage/scanning.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/tasks.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/tenancy.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/testing/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/testing/authenticators.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/testing/blocking.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/testing/clients.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/testing/databases.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/testing/factories.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/testing/kms.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/testing/live.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/testing/queries.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/tracing.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/utils/__init__.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/utils/closing.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/utils/decimals.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/utils/delivery.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/utils/formatting.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/utils/headers.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/utils/loops.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/utils/module_loading.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/utils/rates.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/utils/readiness.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/utils/redis_urls.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/utils/text.py +0 -0
- {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/utils/unset.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: domainkit
|
|
3
|
-
Version:
|
|
3
|
+
Version: 2.0.0
|
|
4
4
|
Summary: A Django-style framework for domain-driven FastAPI services.
|
|
5
5
|
License-Expression: MIT
|
|
6
6
|
License-File: LICENSE
|
|
@@ -100,8 +100,8 @@ Requires-Dist: starlette (>=1.8.0,<2.0.0)
|
|
|
100
100
|
Requires-Dist: tzdata (>=2025.2) ; extra == "tzdata"
|
|
101
101
|
Requires-Dist: uvicorn[standard] (>=0.54.0,<1.0.0)
|
|
102
102
|
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/
|
|
104
|
-
Project-URL: Documentation, https://github.com/karimmattar/domainkit/blob/
|
|
103
|
+
Project-URL: Changelog, https://github.com/karimmattar/domainkit/blob/v2.0.0/CHANGELOG.md
|
|
104
|
+
Project-URL: Documentation, https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/reference.md
|
|
105
105
|
Project-URL: Homepage, https://github.com/karimmattar/domainkit
|
|
106
106
|
Project-URL: Issues, https://github.com/karimmattar/domainkit/issues
|
|
107
107
|
Description-Content-Type: text/markdown
|
|
@@ -169,71 +169,71 @@ the pages of that release's tag; on GitHub, `main` describes the next
|
|
|
169
169
|
release, and a release's pages are under its tag
|
|
170
170
|
(`https://github.com/karimmattar/domainkit/tree/vX.Y.Z/docs`).
|
|
171
171
|
|
|
172
|
-
- [docs/tutorial.md](https://github.com/karimmattar/domainkit/blob/
|
|
172
|
+
- [docs/tutorial.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/tutorial.md): getting started, in five
|
|
173
173
|
parts: a first resource, rules, permissions, events and the worker, and
|
|
174
174
|
tests and production; every command and code change run in CI
|
|
175
|
-
- [docs/operations.md](https://github.com/karimmattar/domainkit/blob/
|
|
175
|
+
- [docs/operations.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/operations.md): running in production:
|
|
176
176
|
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/
|
|
178
|
-
for each alarm, [docs/security.md](https://github.com/karimmattar/domainkit/blob/
|
|
179
|
-
checklist, and [docs/upgrading.md](https://github.com/karimmattar/domainkit/blob/
|
|
177
|
+
sealing, backups, and what to alert on; [docs/runbook.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/runbook.md)
|
|
178
|
+
for each alarm, [docs/security.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/security.md) the hardening
|
|
179
|
+
checklist, and [docs/upgrading.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/upgrading.md) from one version
|
|
180
180
|
to the next, and from 0.12 to 1.0
|
|
181
181
|
|
|
182
|
-
- [docs/reference.md](https://github.com/karimmattar/domainkit/blob/
|
|
182
|
+
- [docs/reference.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/reference.md): settings, deployment checks,
|
|
183
183
|
middleware, errors, the API surface (OpenAPI, versions, deprecations),
|
|
184
184
|
observability, testing, commands, and extension points, a page for each
|
|
185
|
-
- [docs/databases.md](https://github.com/karimmattar/domainkit/blob/
|
|
185
|
+
- [docs/databases.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/databases.md): several databases, routing,
|
|
186
186
|
sharding, partitioning, and ledgers
|
|
187
|
-
- [docs/queries.md](https://github.com/karimmattar/domainkit/blob/
|
|
187
|
+
- [docs/queries.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/queries.md): querying repositories,
|
|
188
188
|
pages, filters, soft delete, row locks, and savepoints
|
|
189
|
-
- [docs/resources.md](https://github.com/karimmattar/domainkit/blob/
|
|
189
|
+
- [docs/resources.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/resources.md): aggregates over REST:
|
|
190
190
|
resource routes, commands and queries, derived schemas, partial changes,
|
|
191
191
|
ETags and conditional writes, field policies, nesting, the generators,
|
|
192
192
|
and the generic admin
|
|
193
|
-
- [docs/runtime.md](https://github.com/karimmattar/domainkit/blob/
|
|
193
|
+
- [docs/runtime.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/runtime.md): how async work runs
|
|
194
194
|
(event loops, background tasks, clean contexts, logging off the loop,
|
|
195
195
|
finding blocking code, free-threaded Python, the shutdown budget,
|
|
196
196
|
readiness, event-handler timeouts, workers and the outbox), running under
|
|
197
197
|
load (request deadlines, load shedding, database timeouts and PgBouncer,
|
|
198
198
|
outgoing HTTP calls), and servers
|
|
199
|
-
- [docs/cache.md](https://github.com/karimmattar/domainkit/blob/
|
|
199
|
+
- [docs/cache.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/cache.md): caches in memory, Redis, and Valkey,
|
|
200
200
|
and shared rate limits
|
|
201
|
-
- [docs/money.md](https://github.com/karimmattar/domainkit/blob/
|
|
201
|
+
- [docs/money.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/money.md): amounts, currencies, rounding, and
|
|
202
202
|
allocation, and money in tables, queries, and schemas
|
|
203
|
-
- [docs/contrib.md](https://github.com/karimmattar/domainkit/blob/
|
|
203
|
+
- [docs/contrib.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/contrib.md): messaging (and workers on RabbitMQ),
|
|
204
204
|
webhooks, audit and records' history, idempotency, evidence, feature
|
|
205
205
|
flags, keys and encrypted fields, the double-entry ledger, approvals,
|
|
206
206
|
and limits
|
|
207
|
-
- [docs/auth.md](https://github.com/karimmattar/domainkit/blob/
|
|
207
|
+
- [docs/auth.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/auth.md): users, groups, permissions, content
|
|
208
208
|
types, passwords, backends, tokens, route rules, and the admin API
|
|
209
|
-
- [docs/mail.md](https://github.com/karimmattar/domainkit/blob/
|
|
209
|
+
- [docs/mail.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/mail.md): email, mail templates, text messages,
|
|
210
210
|
and push notifications, sent through the outbox
|
|
211
|
-
- [docs/i18n.md](https://github.com/karimmattar/domainkit/blob/
|
|
211
|
+
- [docs/i18n.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/i18n.md): responses in the caller's language,
|
|
212
212
|
time zones, and number and date formats
|
|
213
|
-
- [docs/uploads.md](https://github.com/karimmattar/domainkit/blob/
|
|
213
|
+
- [docs/uploads.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/uploads.md): file storages, receiving uploads,
|
|
214
214
|
and serving files
|
|
215
|
-
- [docs/live.md](https://github.com/karimmattar/domainkit/blob/
|
|
215
|
+
- [docs/live.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/live.md): WebSockets and Server-Sent Events,
|
|
216
216
|
bounded and re-authorized while open, and committed events streamed live
|
|
217
|
-
- [docs/privacy.md](https://github.com/karimmattar/domainkit/blob/
|
|
217
|
+
- [docs/privacy.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/privacy.md): exporting and erasing a person's
|
|
218
218
|
data, and retention
|
|
219
|
-
- [docs/testing.md](https://github.com/karimmattar/domainkit/blob/
|
|
219
|
+
- [docs/testing.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/testing.md): the pytest plugin: test databases,
|
|
220
220
|
sync and async clients, factories, a clock to freeze, and query counts
|
|
221
|
-
- [docs/performance.md](https://github.com/karimmattar/domainkit/blob/
|
|
221
|
+
- [docs/performance.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/performance.md): what a request costs, the
|
|
222
222
|
benchmark ladder CI gates on, and how to make requests cheaper
|
|
223
|
-
- [docs/versioning.md](https://github.com/karimmattar/domainkit/blob/
|
|
223
|
+
- [docs/versioning.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/versioning.md): compatibility, deprecations,
|
|
224
224
|
releases, and which releases get security fixes
|
|
225
|
-
- [docs/threat-model.md](https://github.com/karimmattar/domainkit/blob/
|
|
225
|
+
- [docs/threat-model.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/threat-model.md): what domainkit protects,
|
|
226
226
|
where the trust boundaries are, what it does at each, and what is left to
|
|
227
227
|
a project
|
|
228
|
-
- [docs/fintech.md](https://github.com/karimmattar/domainkit/blob/
|
|
228
|
+
- [docs/fintech.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/fintech.md): a bank's first review, answered: each
|
|
229
229
|
control's page, setting, and test, and `domainkit init --profile fintech`,
|
|
230
230
|
a project with them all on and wired
|
|
231
|
-
- [docs/audit/0.9.0.md](https://github.com/karimmattar/domainkit/blob/
|
|
231
|
+
- [docs/audit/0.9.0.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/audit/0.9.0.md): the 0.9.0 audit's findings
|
|
232
232
|
that the CHANGELOG names, with their status
|
|
233
|
-
- [docs/api.md](https://github.com/karimmattar/domainkit/blob/
|
|
233
|
+
- [docs/api.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/api.md): the public API, module by module, one line a name;
|
|
234
234
|
`mkdocs.yml` builds these pages into a site, with every name's docstring
|
|
235
235
|
- [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/
|
|
236
|
+
- [CHANGELOG.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/CHANGELOG.md) and [SECURITY.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/SECURITY.md)
|
|
237
237
|
|
|
238
238
|
## Quick start
|
|
239
239
|
|
|
@@ -261,7 +261,7 @@ shell history:
|
|
|
261
261
|
|
|
262
262
|
```bash
|
|
263
263
|
read -rsp "Password: " PASSWORD && export PASSWORD
|
|
264
|
-
TOKEN=$(python -c "import json, os; print(json.dumps({'
|
|
264
|
+
TOKEN=$(python -c "import json, os; print(json.dumps({'identifier': 'admin@example.com', 'password': os.environ['PASSWORD']}))" \
|
|
265
265
|
| curl -s http://127.0.0.1:8000/auth/login -H "Content-Type: application/json" -d @- \
|
|
266
266
|
| python -c "import json, sys; print(json.load(sys.stdin)['access_token'])")
|
|
267
267
|
unset PASSWORD
|
|
@@ -279,7 +279,7 @@ grow it. Without `--minimal`, `startdomain` writes a fuller example (notes
|
|
|
279
279
|
as child entities, an owner, events and a handler, filters); the tutorial
|
|
280
280
|
starts from that one. A route the caller may not reach answers 404, as an unknown path does,
|
|
281
281
|
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/
|
|
282
|
+
without options asks for each value instead. [docs/tutorial.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/tutorial.md)
|
|
283
283
|
goes on from here, in six parts from a first route: rules written by
|
|
284
284
|
hand, permissions, events run by the worker, and tests.
|
|
285
285
|
|
|
@@ -287,7 +287,7 @@ hand, permissions, events run by the worker, and tests.
|
|
|
287
287
|
Users, groups, and permissions are installed, requests are authenticated,
|
|
288
288
|
and every route must say who may call it: generated domains need their
|
|
289
289
|
model permissions, and `/auth` and `/admin/auth` log users in and manage
|
|
290
|
-
them ([docs/auth.md](https://github.com/karimmattar/domainkit/blob/
|
|
290
|
+
them ([docs/auth.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/auth.md)).
|
|
291
291
|
|
|
292
292
|
|
|
293
293
|
```text
|
|
@@ -319,13 +319,13 @@ also turn the API docs off, send HSTS for a year, and limit each caller to
|
|
|
319
319
|
|
|
320
320
|
Serve it with one worker process per core, each on its own event loop:
|
|
321
321
|
`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/
|
|
323
|
-
gives the whole command with its limits, and [docs/performance.md](https://github.com/karimmattar/domainkit/blob/
|
|
322
|
+
(`pip install 'domainkit[granian]'`). [docs/reference/servers.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/reference/servers.md)
|
|
323
|
+
gives the whole command with its limits, and [docs/performance.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/performance.md)
|
|
324
324
|
how many cores a load needs.
|
|
325
325
|
|
|
326
326
|
## Developing domainkit
|
|
327
327
|
|
|
328
|
-
[CONTRIBUTING.md](https://github.com/karimmattar/domainkit/blob/
|
|
328
|
+
[CONTRIBUTING.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/CONTRIBUTING.md)
|
|
329
329
|
says how to set up, which checks a change must pass, and how to write it
|
|
330
330
|
up. In short:
|
|
331
331
|
|
|
@@ -375,9 +375,9 @@ not the whole suite. A release reuses the run of its commit's push to
|
|
|
375
375
|
A full mutation testing run happens weekly, in 17 shards that run side by
|
|
376
376
|
side; each writes its score and the mutants no test caught to its job
|
|
377
377
|
summary. Releases are published to PyPI
|
|
378
|
-
from a version tag; see [docs/versioning.md](https://github.com/karimmattar/domainkit/blob/
|
|
378
|
+
from a version tag; see [docs/versioning.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/versioning.md).
|
|
379
379
|
|
|
380
380
|
## License
|
|
381
381
|
|
|
382
|
-
MIT; see [LICENSE](https://github.com/karimmattar/domainkit/blob/
|
|
382
|
+
MIT; see [LICENSE](https://github.com/karimmattar/domainkit/blob/v2.0.0/LICENSE).
|
|
383
383
|
|
|
@@ -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/
|
|
64
|
+
- [docs/tutorial.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/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/
|
|
67
|
+
- [docs/operations.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/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/
|
|
70
|
-
for each alarm, [docs/security.md](https://github.com/karimmattar/domainkit/blob/
|
|
71
|
-
checklist, and [docs/upgrading.md](https://github.com/karimmattar/domainkit/blob/
|
|
69
|
+
sealing, backups, and what to alert on; [docs/runbook.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/runbook.md)
|
|
70
|
+
for each alarm, [docs/security.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/security.md) the hardening
|
|
71
|
+
checklist, and [docs/upgrading.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/upgrading.md) from one version
|
|
72
72
|
to the next, and from 0.12 to 1.0
|
|
73
73
|
|
|
74
|
-
- [docs/reference.md](https://github.com/karimmattar/domainkit/blob/
|
|
74
|
+
- [docs/reference.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/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/
|
|
77
|
+
- [docs/databases.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/databases.md): several databases, routing,
|
|
78
78
|
sharding, partitioning, and ledgers
|
|
79
|
-
- [docs/queries.md](https://github.com/karimmattar/domainkit/blob/
|
|
79
|
+
- [docs/queries.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/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/
|
|
81
|
+
- [docs/resources.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/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/
|
|
85
|
+
- [docs/runtime.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/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/
|
|
91
|
+
- [docs/cache.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/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/
|
|
93
|
+
- [docs/money.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/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/
|
|
95
|
+
- [docs/contrib.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/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/
|
|
99
|
+
- [docs/auth.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/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/
|
|
101
|
+
- [docs/mail.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/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/
|
|
103
|
+
- [docs/i18n.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/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/
|
|
105
|
+
- [docs/uploads.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/uploads.md): file storages, receiving uploads,
|
|
106
106
|
and serving files
|
|
107
|
-
- [docs/live.md](https://github.com/karimmattar/domainkit/blob/
|
|
107
|
+
- [docs/live.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/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/
|
|
109
|
+
- [docs/privacy.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/privacy.md): exporting and erasing a person's
|
|
110
110
|
data, and retention
|
|
111
|
-
- [docs/testing.md](https://github.com/karimmattar/domainkit/blob/
|
|
111
|
+
- [docs/testing.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/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/
|
|
113
|
+
- [docs/performance.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/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/
|
|
115
|
+
- [docs/versioning.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/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/
|
|
117
|
+
- [docs/threat-model.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/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/
|
|
120
|
+
- [docs/fintech.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/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/
|
|
123
|
+
- [docs/audit/0.9.0.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/audit/0.9.0.md): the 0.9.0 audit's findings
|
|
124
124
|
that the CHANGELOG names, with their status
|
|
125
|
-
- [docs/api.md](https://github.com/karimmattar/domainkit/blob/
|
|
125
|
+
- [docs/api.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/api.md): the public API, module by module, one line a name;
|
|
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/
|
|
128
|
+
- [CHANGELOG.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/CHANGELOG.md) and [SECURITY.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/SECURITY.md)
|
|
129
129
|
|
|
130
130
|
## Quick start
|
|
131
131
|
|
|
@@ -153,7 +153,7 @@ shell history:
|
|
|
153
153
|
|
|
154
154
|
```bash
|
|
155
155
|
read -rsp "Password: " PASSWORD && export PASSWORD
|
|
156
|
-
TOKEN=$(python -c "import json, os; print(json.dumps({'
|
|
156
|
+
TOKEN=$(python -c "import json, os; print(json.dumps({'identifier': 'admin@example.com', 'password': os.environ['PASSWORD']}))" \
|
|
157
157
|
| curl -s http://127.0.0.1:8000/auth/login -H "Content-Type: application/json" -d @- \
|
|
158
158
|
| python -c "import json, sys; print(json.load(sys.stdin)['access_token'])")
|
|
159
159
|
unset PASSWORD
|
|
@@ -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/
|
|
174
|
+
without options asks for each value instead. [docs/tutorial.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/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/
|
|
182
|
+
them ([docs/auth.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/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/
|
|
215
|
-
gives the whole command with its limits, and [docs/performance.md](https://github.com/karimmattar/domainkit/blob/
|
|
214
|
+
(`pip install 'domainkit[granian]'`). [docs/reference/servers.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/reference/servers.md)
|
|
215
|
+
gives the whole command with its limits, and [docs/performance.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/performance.md)
|
|
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/
|
|
220
|
+
[CONTRIBUTING.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/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/
|
|
270
|
+
from a version tag; see [docs/versioning.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/versioning.md).
|
|
271
271
|
|
|
272
272
|
## License
|
|
273
273
|
|
|
274
|
-
MIT; see [LICENSE](https://github.com/karimmattar/domainkit/blob/
|
|
274
|
+
MIT; see [LICENSE](https://github.com/karimmattar/domainkit/blob/v2.0.0/LICENSE).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "domainkit"
|
|
3
|
-
version = "
|
|
3
|
+
version = "2.0.0"
|
|
4
4
|
description = "A Django-style framework for domain-driven FastAPI services."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = "MIT"
|
|
@@ -148,8 +148,8 @@ domainkit = "domainkit.management:execute_from_command_line"
|
|
|
148
148
|
|
|
149
149
|
[project.urls]
|
|
150
150
|
Homepage = "https://github.com/karimmattar/domainkit"
|
|
151
|
-
Documentation = "https://github.com/karimmattar/domainkit/blob/
|
|
152
|
-
Changelog = "https://github.com/karimmattar/domainkit/blob/
|
|
151
|
+
Documentation = "https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/reference.md"
|
|
152
|
+
Changelog = "https://github.com/karimmattar/domainkit/blob/v2.0.0/CHANGELOG.md"
|
|
153
153
|
Issues = "https://github.com/karimmattar/domainkit/issues"
|
|
154
154
|
|
|
155
155
|
[build-system]
|
|
@@ -1543,7 +1543,7 @@ class Settings(BaseModel):
|
|
|
1543
1543
|
if self.SECRET_KEY is None:
|
|
1544
1544
|
yield CheckMessage(
|
|
1545
1545
|
"security.E016",
|
|
1546
|
-
f"SECRET_KEY is required {where}: it signs
|
|
1546
|
+
f"SECRET_KEY is required {where}: it signs cookies, codes, "
|
|
1547
1547
|
"and other values the service hands out",
|
|
1548
1548
|
"Make one with: python -c 'import secrets; "
|
|
1549
1549
|
"print(secrets.token_urlsafe(64))'.",
|
|
@@ -129,5 +129,10 @@ class AuditConfig(DomainConfig):
|
|
|
129
129
|
await write(uow.session, event_rows(events, config))
|
|
130
130
|
|
|
131
131
|
def databases(self, router: DatabaseRouter) -> frozenset[str]:
|
|
132
|
-
"""Every hosting target
|
|
133
|
-
|
|
132
|
+
"""Every hosting target, where events are audited as they commit.
|
|
133
|
+
|
|
134
|
+
And ``AUDIT.DATABASE``, which keeps the explicit records and the
|
|
135
|
+
ledger states, when no domain lives there.
|
|
136
|
+
"""
|
|
137
|
+
config = registry.settings(AuditSettings)
|
|
138
|
+
return frozenset({*router.hosting_targets(), config.DATABASE})
|
|
@@ -7,16 +7,17 @@ that seals on a schedule (the worker, with ``domainkit.contrib.messaging``,
|
|
|
7
7
|
or ``audit seal`` from cron, ``AUDIT.SEALED_EXTERNALLY``), and the
|
|
8
8
|
``protect()`` triggers on PostgreSQL. ``check`` lists the settings that
|
|
9
9
|
are missing; the application, when it starts, also asks each audited
|
|
10
|
-
PostgreSQL database for the triggers
|
|
11
|
-
|
|
12
|
-
``
|
|
13
|
-
|
|
14
|
-
``
|
|
10
|
+
PostgreSQL database for the triggers, in its own schema and in each
|
|
11
|
+
tenant's schema that holds a trail (``TENANCY.SCHEMA_DATABASES``). With
|
|
12
|
+
``AUDIT.REQUIRE_BASELINE``, the default since 0.10, both refuse: each
|
|
13
|
+
problem is an error (``audit.E001`` to ``audit.E005``), which
|
|
14
|
+
``SILENCED_CHECKS`` cannot silence. A project that sets it to False gets
|
|
15
|
+
the same problems as warnings (``audit.W001`` to ``audit.W005``), as in 0.9.
|
|
15
16
|
"""
|
|
16
17
|
|
|
17
18
|
import asyncio
|
|
18
19
|
import logging
|
|
19
|
-
from typing import Final
|
|
20
|
+
from typing import Any, Final
|
|
20
21
|
|
|
21
22
|
from sqlalchemy import text
|
|
22
23
|
from sqlalchemy.exc import SQLAlchemyError
|
|
@@ -26,6 +27,7 @@ from domainkit.checks import CheckFailed, CheckMessage
|
|
|
26
27
|
from domainkit.conf import settings
|
|
27
28
|
from domainkit.conf.global_settings import DEPLOYED_ENVIRONMENTS
|
|
28
29
|
from domainkit.db import connections
|
|
30
|
+
from domainkit.db.uow import tenant_schemas
|
|
29
31
|
|
|
30
32
|
from .personal import audited_databases
|
|
31
33
|
from .protection import ROW_TRIGGER, TRUNCATE_TRIGGER, function_body, trigger_names
|
|
@@ -48,6 +50,28 @@ _TRIGGERS: Final = text(
|
|
|
48
50
|
)
|
|
49
51
|
"""The triggers on the trail and its seals, as ``search_path`` finds them,
|
|
50
52
|
with what decides whether they fire and what they run."""
|
|
53
|
+
_OWN_TRAIL: Final = text("SELECT to_regclass(:log)")
|
|
54
|
+
"""The connection's own schema's trail, if it holds one."""
|
|
55
|
+
_TENANT_TRAILS: Final = text(
|
|
56
|
+
"SELECT n.nspname FROM pg_class AS c "
|
|
57
|
+
"JOIN pg_namespace AS n ON n.oid = c.relnamespace "
|
|
58
|
+
"WHERE c.relname = :log AND n.nspname = ANY(:schemas)"
|
|
59
|
+
)
|
|
60
|
+
"""The tenant schemas, of those named, that hold an audit trail."""
|
|
61
|
+
_TENANT_TRIGGERS: Final = text(
|
|
62
|
+
"SELECT n.nspname, c.relname, t.tgname, t.tgenabled::text AS enabled, "
|
|
63
|
+
"t.tgtype, "
|
|
64
|
+
"t.tgqual IS NULL AND t.tgnargs = 0 AND cardinality(t.tgattr::int2[]) = 0 "
|
|
65
|
+
"AS plain, p.proname, p.prosrc, l.lanname "
|
|
66
|
+
"FROM pg_trigger AS t "
|
|
67
|
+
"JOIN pg_class AS c ON c.oid = t.tgrelid "
|
|
68
|
+
"JOIN pg_namespace AS n ON n.oid = c.relnamespace "
|
|
69
|
+
"JOIN pg_proc AS p ON p.oid = t.tgfoid "
|
|
70
|
+
"JOIN pg_language AS l ON l.oid = p.prolang "
|
|
71
|
+
"WHERE c.relname IN (:log, :seals) AND n.nspname = ANY(:schemas) "
|
|
72
|
+
"AND NOT t.tgisinternal"
|
|
73
|
+
)
|
|
74
|
+
"""The same triggers in every tenant schema named, in one round trip."""
|
|
51
75
|
FIRING: Final = frozenset({"O", "A"})
|
|
52
76
|
"""``tgenabled`` of a trigger that fires for the application's sessions.
|
|
53
77
|
|
|
@@ -132,24 +156,76 @@ async def missing_triggers(database: str) -> list[str]:
|
|
|
132
156
|
same events, for each row or statement, with no ``WHEN``, columns, or
|
|
133
157
|
arguments, and running the plpgsql function ``protect()`` writes, its
|
|
134
158
|
body the same but for whitespace. None on databases other than
|
|
135
|
-
PostgreSQL: ``protect()`` does nothing there.
|
|
159
|
+
PostgreSQL: ``protect()`` does nothing there. None either on a database
|
|
160
|
+
that keeps a schema per tenant and holds no trail of its own: plain
|
|
161
|
+
``migrate`` leaves its own schema out (``missing_in_tenant_trails``).
|
|
136
162
|
"""
|
|
163
|
+
tenancy = settings.TENANCY
|
|
164
|
+
per_tenant = tenancy is not None and database in tenancy.SCHEMA_DATABASES
|
|
137
165
|
async with connections.engine(database).connect() as connection:
|
|
138
166
|
if connection.dialect.name != "postgresql":
|
|
139
167
|
return []
|
|
168
|
+
if (
|
|
169
|
+
per_tenant
|
|
170
|
+
and await connection.scalar(_OWN_TRAIL, {"log": audit_log.name}) is None
|
|
171
|
+
):
|
|
172
|
+
return []
|
|
140
173
|
found = await connection.execute(
|
|
141
174
|
_TRIGGERS, {"log": audit_log.name, "seals": audit_seals.name}
|
|
142
175
|
)
|
|
176
|
+
present = {(row.relname, row.tgname) for row in found if _as_protect_made(row)}
|
|
177
|
+
return sorted(name for table, name in PROTECTED.keys() - present)
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
async def missing_in_tenant_trails(database: str) -> dict[str, list[str]]:
|
|
181
|
+
"""The ``protect()`` triggers each tenant's trail of ``database`` lacks.
|
|
182
|
+
|
|
183
|
+
By trail (``<alias>/<schema>``), for each tenant schema that holds an
|
|
184
|
+
audit trail; empty where the database keeps no schema per tenant. Two
|
|
185
|
+
round trips, however many tenants there are.
|
|
186
|
+
"""
|
|
187
|
+
tenants = [schema for schema in await tenant_schemas(database) if schema]
|
|
188
|
+
if not tenants:
|
|
189
|
+
return {}
|
|
190
|
+
async with connections.engine(database).connect() as connection:
|
|
191
|
+
trails = set(
|
|
192
|
+
(
|
|
193
|
+
await connection.execute(
|
|
194
|
+
_TENANT_TRAILS, {"log": audit_log.name, "schemas": tenants}
|
|
195
|
+
)
|
|
196
|
+
).scalars()
|
|
197
|
+
)
|
|
198
|
+
found = await connection.execute(
|
|
199
|
+
_TENANT_TRIGGERS,
|
|
200
|
+
{"log": audit_log.name, "seals": audit_seals.name, "schemas": tenants},
|
|
201
|
+
)
|
|
143
202
|
present = {
|
|
144
|
-
(row.relname, row.tgname)
|
|
203
|
+
(row.nspname, row.relname, row.tgname)
|
|
145
204
|
for row in found
|
|
146
|
-
if row
|
|
147
|
-
and row.plain
|
|
148
|
-
and row.lanname == "plpgsql"
|
|
149
|
-
and PROTECTED.get((row.relname, row.tgname))
|
|
150
|
-
== (row.tgtype, row.proname, " ".join(row.prosrc.split()))
|
|
205
|
+
if _as_protect_made(row)
|
|
151
206
|
}
|
|
152
|
-
return
|
|
207
|
+
return {
|
|
208
|
+
f"{database}/{schema}": missing
|
|
209
|
+
for schema in sorted(trails)
|
|
210
|
+
if (
|
|
211
|
+
missing := sorted(
|
|
212
|
+
name
|
|
213
|
+
for table, name in PROTECTED
|
|
214
|
+
if (schema, table, name) not in present
|
|
215
|
+
)
|
|
216
|
+
)
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
def _as_protect_made(row: Any) -> bool: # noqa: ANN401 - a row of either query.
|
|
221
|
+
"""Whether a trigger fires, and runs, as ``protect()`` made it."""
|
|
222
|
+
return bool(
|
|
223
|
+
row.enabled in FIRING
|
|
224
|
+
and row.plain
|
|
225
|
+
and row.lanname == "plpgsql"
|
|
226
|
+
and PROTECTED.get((row.relname, row.tgname))
|
|
227
|
+
== (row.tgtype, row.proname, " ".join(row.prosrc.split()))
|
|
228
|
+
)
|
|
153
229
|
|
|
154
230
|
|
|
155
231
|
async def protection_problems() -> list[str]:
|
|
@@ -159,6 +235,8 @@ async def protection_problems() -> list[str]:
|
|
|
159
235
|
try:
|
|
160
236
|
async with asyncio.timeout(PROBE_TIMEOUT):
|
|
161
237
|
missing = await missing_triggers(database)
|
|
238
|
+
by_trail = {database: missing} if missing else {}
|
|
239
|
+
by_trail |= await missing_in_tenant_trails(database)
|
|
162
240
|
except (SQLAlchemyError, OSError, TimeoutError) as exc:
|
|
163
241
|
problems.append(
|
|
164
242
|
_problem(
|
|
@@ -169,18 +247,29 @@ async def protection_problems() -> list[str]:
|
|
|
169
247
|
)
|
|
170
248
|
)
|
|
171
249
|
continue
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
"'manage.py migrate', which makes them.",
|
|
179
|
-
)
|
|
250
|
+
problems.extend(
|
|
251
|
+
_problem(
|
|
252
|
+
5,
|
|
253
|
+
f"The audit trail in {trail!r} is not append-only: triggers "
|
|
254
|
+
f"{', '.join(lacking)} are missing, disabled, or changed. Run "
|
|
255
|
+
f"'manage.py {_migrate(trail)}', which makes them.",
|
|
180
256
|
)
|
|
257
|
+
for trail, lacking in by_trail.items()
|
|
258
|
+
)
|
|
181
259
|
return problems
|
|
182
260
|
|
|
183
261
|
|
|
262
|
+
def _migrate(trail: str) -> str:
|
|
263
|
+
"""The command that makes a trail's triggers: a tenant's is migrated as it."""
|
|
264
|
+
_, _, schema = trail.partition("/")
|
|
265
|
+
config = settings.TENANCY
|
|
266
|
+
if not schema or config is None:
|
|
267
|
+
return "migrate"
|
|
268
|
+
prefix, _, suffix = config.SCHEMA.partition("{tenant}")
|
|
269
|
+
tenant = schema.removeprefix(prefix).removesuffix(suffix)
|
|
270
|
+
return f"migrate --tenant {tenant}"
|
|
271
|
+
|
|
272
|
+
|
|
184
273
|
async def check_at_startup() -> None:
|
|
185
274
|
"""Warn, or refuse with ``AUDIT.REQUIRE_BASELINE``, in staging and production.
|
|
186
275
|
|
{domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/audit/management/commands/audit.py
RENAMED
|
@@ -262,17 +262,19 @@ class Command(ActionCommand):
|
|
|
262
262
|
before = clock.now() - timedelta(days=keep_days)
|
|
263
263
|
async with self.recorded("auditprune", keep_days=keep_days) as record:
|
|
264
264
|
record["rows"] = 0
|
|
265
|
-
|
|
265
|
+
aliases = (database,) if database else audited_databases()
|
|
266
|
+
for alias, schema in await trails(aliases):
|
|
266
267
|
try:
|
|
267
|
-
|
|
268
|
+
with in_trail(schema):
|
|
269
|
+
pruned = await prune(alias, before=before, ledger=ledger)
|
|
268
270
|
except PruneRefused as exc:
|
|
269
271
|
raise CommandError(str(exc)) from None
|
|
270
272
|
record["rows"] = int(str(record["rows"])) + pruned.rows
|
|
271
273
|
if pruned.checkpoint is None:
|
|
272
|
-
self.write(f"{
|
|
274
|
+
self.write(f"{pruned.database}: nothing to prune.")
|
|
273
275
|
else:
|
|
274
276
|
self.write(
|
|
275
|
-
f"{
|
|
277
|
+
f"{pruned.database}: pruned {pruned.rows} "
|
|
276
278
|
f"row{'' if pruned.rows == 1 else 's'} below seal "
|
|
277
279
|
f"#{pruned.checkpoint.seq}."
|
|
278
280
|
)
|