python-ddd-framework 0.5.1__tar.gz → 0.7.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.
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/PKG-INFO +101 -10
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/README.md +100 -9
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/pyproject.toml +1 -1
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/pyproject.toml.orig +1 -1
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/application_services/bindings.py +0 -64
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/application_services/dispatcher.py +1 -1
- python_ddd_framework-0.7.0/src/python_ddd_framework/application_services/invocation.py +57 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/application_services/module.py +16 -5
- python_ddd_framework-0.7.0/src/python_ddd_framework/authorization/checking.py +35 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/authorization/module.py +1 -1
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_jobs/execution.py +1 -1
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_jobs/pgqueuer/enqueue.py +1 -1
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_workers/execution.py +1 -1
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_workers/runtime.py +1 -1
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/caching/unit_of_work.py +2 -4
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/cli/project.py +11 -10
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/generation.py +44 -43
- python_ddd_framework-0.7.0/src/python_ddd_framework/developer_kit/publication.py +442 -0
- python_ddd_framework-0.7.0/src/python_ddd_framework/developer_kit/templates/module/cookiecutter.json +1 -0
- python_ddd_framework-0.7.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/README.md +53 -0
- python_ddd_framework-0.7.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/module.py.jinja +48 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/module.py.jinja +1 -3
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/module.py.jinja +2 -3
- python_ddd_framework-0.7.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/module.py.jinja +49 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/sqlalchemy/module.py.jinja +1 -2
- python_ddd_framework-0.7.0/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/AGENTS.md +73 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/README.md +22 -10
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/src/host/main.py.jinja +4 -1
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/docs/architecture.md +55 -5
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/docs/development.md +233 -25
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/diagnostics/source.py +14 -1
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/domain/aggregates.py +5 -12
- python_ddd_framework-0.7.0/src/python_ddd_framework/domain/event_values.py +124 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/events/runtime.py +2 -7
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/events/unit_of_work.py +1 -4
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/__init__.py +2 -0
- python_ddd_framework-0.7.0/src/python_ddd_framework/fastapi/access.py +127 -0
- python_ddd_framework-0.7.0/src/python_ddd_framework/fastapi/access_options.py +13 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/action.py +8 -1
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/adapter.py +11 -117
- python_ddd_framework-0.7.0/src/python_ddd_framework/fastapi/application_services.py +287 -0
- python_ddd_framework-0.7.0/src/python_ddd_framework/fastapi/error_handlers.py +128 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/manual_action.py +33 -2
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/module.py +2 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/realtime/authentication.py +21 -10
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/realtime/options.py +0 -1
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/realtime/runtime.py +42 -27
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/request_context.py +12 -7
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/routing.py +16 -15
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/server.py +9 -0
- python_ddd_framework-0.7.0/src/python_ddd_framework/fastapi/service_endpoints.py +187 -0
- python_ddd_framework-0.7.0/src/python_ddd_framework/fastapi/service_routes.py +237 -0
- python_ddd_framework-0.7.0/src/python_ddd_framework/fastapi/streaming.py +95 -0
- python_ddd_framework-0.7.0/src/python_ddd_framework/fastapi/transfer.py +263 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/hosted_services/bridge.py +2 -6
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/hosted_services/runtime.py +1 -1
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/identity/__init__.py +21 -13
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/identity/application.py +12 -66
- python_ddd_framework-0.7.0/src/python_ddd_framework/identity/contracts.py +75 -0
- python_ddd_framework-0.7.0/src/python_ddd_framework/identity/domain_rules.py +17 -0
- python_ddd_framework-0.7.0/src/python_ddd_framework/identity/dtos.py +152 -0
- python_ddd_framework-0.7.0/src/python_ddd_framework/identity/extensions.py +9 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/identity/management.py +28 -25
- python_ddd_framework-0.7.0/src/python_ddd_framework/identity/models.py +86 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/identity/module.py +3 -4
- python_ddd_framework-0.7.0/src/python_ddd_framework/identity/options.py +54 -0
- python_ddd_framework-0.7.0/src/python_ddd_framework/identity/seeding.py +59 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/identity/services.py +1 -1
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/identity/sqlalchemy/module.py +9 -6
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/identity/sqlalchemy/repository.py +4 -5
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/identity/sqlalchemy/session_security.py +1 -3
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/identity/sqlalchemy/stores.py +35 -47
- python_ddd_framework-0.7.0/src/python_ddd_framework/identity/stores.py +120 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/identity/tokens.py +1 -1
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/invocation/callables.py +1 -1
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/invocation/dispatcher.py +3 -25
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/invocation/entrypoints.py +2 -1
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/invocation/function_runtime.py +2 -2
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/invocation/interception.py +1 -1
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/invocation/managed_proxy.py +2 -1
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/invocation/managed_services.py +8 -14
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/invocation/methods.py +2 -7
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/invocation/module.py +1 -1
- python_ddd_framework-0.5.1/src/python_ddd_framework/application_services/invocation.py → python_ddd_framework-0.7.0/src/python_ddd_framework/invocation/runtime.py +6 -136
- python_ddd_framework-0.7.0/src/python_ddd_framework/invocation/scopes.py +93 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/messaging/channel.py +1 -1
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/messaging/runtime.py +1 -1
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/modularity/discovery.py +2 -7
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/modularity/graph.py +2 -8
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/observability/formatting.py +1 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/observability/logging.py +1 -1
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/observability/tracing.py +1 -1
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/redis/cache.py +2 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/redis/notification_runtime.py +1 -1
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/services/arbitration.py +1 -20
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/services/composition.py +71 -2
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/services/provider.py +23 -1
- python_ddd_framework-0.7.0/src/python_ddd_framework/services/relocation.py +96 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/refresh.py +1 -1
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/sqlalchemy/store.py +1 -1
- python_ddd_framework-0.7.0/src/python_ddd_framework/sqlalchemy/metadata.py +278 -0
- python_ddd_framework-0.7.0/src/python_ddd_framework/sqlalchemy/metadata_builder.py +234 -0
- python_ddd_framework-0.7.0/src/python_ddd_framework/sqlalchemy/metadata_fingerprint.py +108 -0
- python_ddd_framework-0.7.0/src/python_ddd_framework/sqlalchemy/metadata_ownership.py +73 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/sqlalchemy/migration.py +2 -1
- python_ddd_framework-0.7.0/src/python_ddd_framework/sqlalchemy/migration_sources.py +38 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/sqlalchemy/module.py +2 -1
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/sqlalchemy/unit_of_work.py +1 -1
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/unit_of_work/contracts.py +68 -7
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/unit_of_work/manager.py +15 -9
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/unit_of_work/module.py +1 -1
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/cookiecutter.json +0 -1
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/README.md +0 -63
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/background_jobs/order_approval/handler.py.jinja +0 -45
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/background_jobs/order_approval/payload.py.jinja +0 -8
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/background_jobs/order_statistics/handler.py.jinja +0 -35
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/background_jobs/order_statistics/payload.py.jinja +0 -5
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/background_jobs/order_statistics/schedule.py.jinja +0 -15
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/background_workers/order_maintenance_worker.py.jinja +0 -28
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/background_workers/order_statistics_worker.py.jinja +0 -26
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/caching/order_cache.py.jinja +0 -9
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/caching/statistics_cache.py.jinja +0 -9
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/event_handlers/order_changed_handler.py.jinja +0 -23
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/hosted_services/order_integration_service.py.jinja +0 -71
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/hosted_services/order_observation_handler.py.jinja +0 -16
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/integration_services/order_reporting_service.py.jinja +0 -16
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/interceptors/order_timing_interceptor.py.jinja +0 -17
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/module.py.jinja +0 -115
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/options/order_options.py.jinja +0 -7
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/services/order_approval_service.py.jinja +0 -65
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/services/order_management_service.py.jinja +0 -35
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/services/order_query_service.py.jinja +0 -41
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/setting_handlers/approval_setting_observer.py.jinja +0 -17
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/inputs/approve_order.py.jinja +0 -6
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/inputs/create_order.py.jinja +0 -7
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/integration_services/order_reporting_service.py.jinja +0 -7
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/services/order_approval_service.py.jinja +0 -13
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/services/order_management_service.py.jinja +0 -10
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/services/order_query_service.py.jinja +0 -12
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/views/order_statistics_snapshot.py.jinja +0 -9
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/views/order_view.py.jinja +0 -12
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/entities/order.py.jinja +0 -48
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/events/order_changed.py.jinja +0 -13
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/repositories/order_repository.py.jinja +0 -17
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/seeding/order_seed_contributor.py.jinja +0 -22
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/services/order_approval_service.py.jinja +0 -23
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/settings/approval_settings.py.jinja +0 -17
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/value_objects/order_title.py.jinja +0 -10
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/constants/order_constants.py.jinja +0 -3
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/enums/order_status.py.jinja +0 -6
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/errors/order_errors.py.jinja +0 -11
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/messages/order_messages.py.jinja +0 -26
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/messages/order_observation.py.jinja +0 -13
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/permissions/order_permission_provider.py.jinja +0 -19
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/permissions/order_permissions.py.jinja +0 -7
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/value_objects/money.py.jinja +0 -18
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/filters/export_filter.py.jinja +0 -15
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/models/refresh_orders.py.jinja +0 -5
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/module.py.jinja +0 -103
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/routers/order_files.py.jinja +0 -76
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/websockets/__init__.py.jinja +0 -1
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/websockets/order_socket.py.jinja +0 -44
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/sqlalchemy/models/order_model.py.jinja +0 -29
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/sqlalchemy/repositories/order_repository.py.jinja +0 -79
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/tests/__init__.py.jinja +0 -1
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/tests/test_domain.py.jinja +0 -19
- python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/AGENTS.md +0 -58
- python_ddd_framework-0.5.1/src/python_ddd_framework/fastapi/application_services.py +0 -672
- python_ddd_framework-0.5.1/src/python_ddd_framework/fastapi/transfer.py +0 -128
- python_ddd_framework-0.5.1/src/python_ddd_framework/identity/contracts.py +0 -448
- python_ddd_framework-0.5.1/src/python_ddd_framework/sqlalchemy/metadata.py +0 -680
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/LICENSE +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/__init__.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/application/__init__.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/application/build_spec.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/application/builder.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/application/composition.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/application/runtime.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/application/runtime_hooks.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/application/state.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/application_services/__init__.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/application_services/catalog.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/application_services/contracts.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/application_services/errors.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/application_services/pagination.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/auditing/__init__.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/auditing/contracts.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/auditing/control.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/auditing/module.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/auditing/sqlalchemy/__init__.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/auditing/sqlalchemy/migrations/0001_auditing.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/auditing/sqlalchemy/migrations/__init__.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/auditing/sqlalchemy/models.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/auditing/sqlalchemy/module.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/auditing/sqlalchemy/store.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/authorization/__init__.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/authorization/catalog.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/authorization/contracts.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/authorization/definition_discovery.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/authorization/definitions.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/authorization/errors.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/authorization/options.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_execution/__init__.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_execution/application.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_execution/child.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_execution/contracts.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_execution/declarations.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_execution/lifecycle.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_execution/local.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_execution/locks.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_execution/management.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_execution/module.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_execution/permissions.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_execution/processes.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_jobs/__init__.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_jobs/catalog.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_jobs/contracts.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_jobs/declaration.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_jobs/errors.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_jobs/pgqueuer/UPSTREAM_LICENSE.txt +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_jobs/pgqueuer/__init__.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_jobs/pgqueuer/migrations/0001_pgqueuer_1_3_2.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_jobs/pgqueuer/migrations/__init__.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_jobs/pgqueuer/module.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_jobs/pgqueuer/options.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_jobs/pgqueuer/runtime.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_jobs/pgqueuer/sql/pgqueuer_1_3_2_install.sql +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_jobs/pgqueuer/supervision.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_workers/__init__.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_workers/catalog.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_workers/contracts.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_workers/errors.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/caching/__init__.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/caching/contracts.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/caching/errors.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/caching/module.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/caching/naming.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/caching/options.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/cli/__init__.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/cli/development.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/cli/errors.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/cli/inspection.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/cli/runtime.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/configuration/__init__.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/configuration/composition.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/configuration/contracts.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/configuration/dotenv_source.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/configuration/environment_source.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/configuration/immutability.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/configuration/input_shape.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/configuration/merge.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/configuration/root.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/configuration/sources.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/configuration/values.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/configuration/yaml_source.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/__init__.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/project_metadata.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/source.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/templates/basic/cookiecutter.json +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/templates/basic/{{cookiecutter.module_name}}/README.md +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/templates/basic/{{cookiecutter.module_name}}/__init__.py.jinja +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/templates/basic/{{cookiecutter.module_name}}/contracts/__init__.py.jinja +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/templates/basic/{{cookiecutter.module_name}}/contracts/conversion_service.py.jinja +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/templates/basic/{{cookiecutter.module_name}}/module.py.jinja +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/templates/basic/{{cookiecutter.module_name}}/services/__init__.py.jinja +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/templates/basic/{{cookiecutter.module_name}}/services/default_conversion_service.py.jinja +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/__init__.py.jinja +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/__init__.py.jinja +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/background_jobs/__init__.py.jinja +0 -0
- {python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/background_jobs/order_approval → python_ddd_framework-0.7.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/background_workers}/__init__.py.jinja +0 -0
- {python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/background_jobs/order_statistics → python_ddd_framework-0.7.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/caching}/__init__.py.jinja +0 -0
- {python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/background_workers → python_ddd_framework-0.7.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/event_handlers}/__init__.py.jinja +0 -0
- {python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/caching → python_ddd_framework-0.7.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/hosted_services}/__init__.py.jinja +0 -0
- {python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/event_handlers → python_ddd_framework-0.7.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/integration_services}/__init__.py.jinja +0 -0
- {python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/hosted_services → python_ddd_framework-0.7.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/interceptors}/__init__.py.jinja +0 -0
- {python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/integration_services → python_ddd_framework-0.7.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/options}/__init__.py.jinja +0 -0
- {python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/interceptors → python_ddd_framework-0.7.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/services}/__init__.py.jinja +0 -0
- {python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/options → python_ddd_framework-0.7.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/setting_handlers}/__init__.py.jinja +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/__init__.py.jinja +0 -0
- {python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/services → python_ddd_framework-0.7.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/inputs}/__init__.py.jinja +0 -0
- {python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/setting_handlers → python_ddd_framework-0.7.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/integration_services}/__init__.py.jinja +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/module.py.jinja +0 -0
- {python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/inputs → python_ddd_framework-0.7.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/services}/__init__.py.jinja +0 -0
- {python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/integration_services → python_ddd_framework-0.7.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/views}/__init__.py.jinja +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/__init__.py.jinja +0 -0
- {python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/services → python_ddd_framework-0.7.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/entities}/__init__.py.jinja +0 -0
- {python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/views → python_ddd_framework-0.7.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/events}/__init__.py.jinja +0 -0
- {python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/entities → python_ddd_framework-0.7.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/repositories}/__init__.py.jinja +0 -0
- {python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/events → python_ddd_framework-0.7.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/seeding}/__init__.py.jinja +0 -0
- {python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/repositories → python_ddd_framework-0.7.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/services}/__init__.py.jinja +0 -0
- {python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/seeding → python_ddd_framework-0.7.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/settings}/__init__.py.jinja +0 -0
- {python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/services → python_ddd_framework-0.7.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/value_objects}/__init__.py.jinja +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/__init__.py.jinja +0 -0
- {python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/settings → python_ddd_framework-0.7.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/constants}/__init__.py.jinja +0 -0
- {python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/value_objects → python_ddd_framework-0.7.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/enums}/__init__.py.jinja +0 -0
- {python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/constants → python_ddd_framework-0.7.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/errors}/__init__.py.jinja +0 -0
- {python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/enums → python_ddd_framework-0.7.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/messages}/__init__.py.jinja +0 -0
- {python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/errors → python_ddd_framework-0.7.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/permissions}/__init__.py.jinja +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/value_objects/__init__.py.jinja +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/__init__.py.jinja +0 -0
- {python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/messages → python_ddd_framework-0.7.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/filters}/__init__.py.jinja +0 -0
- {python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/permissions → python_ddd_framework-0.7.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/models}/__init__.py.jinja +0 -0
- {python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/filters → python_ddd_framework-0.7.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/routers}/__init__.py.jinja +0 -0
- {python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/models → python_ddd_framework-0.7.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/websockets}/__init__.py.jinja +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/sqlalchemy/__init__.py.jinja +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/sqlalchemy/migrations/__init__.py.jinja +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/sqlalchemy/models/__init__.py.jinja +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/sqlalchemy/models/base.py.jinja +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/sqlalchemy/repositories/__init__.py.jinja +0 -0
- {python_ddd_framework-0.5.1/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/routers → python_ddd_framework-0.7.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/tests}/__init__.py.jinja +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/templates/project/cookiecutter.json +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/.dockerignore +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/.gitignore +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/.python-version +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/Dockerfile +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/app.development.yaml.jinja +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/compose.dev.yaml.jinja +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/compose.production.yaml.jinja +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/pyproject.toml.jinja +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/src/host/__init__.py.jinja +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/src/host/module.py.jinja +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/tests/conftest.py.jinja +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/tests/host/test_http.py.jinja +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/scripts/.gitkeep +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/wiring.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/diagnostics/__init__.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/diagnostics/journal.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/diagnostics/model.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/distributed_lock/__init__.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/distributed_lock/contracts.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/distributed_lock/options.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/domain/__init__.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/domain/entities.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/domain/errors.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/domain/services.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/domain/value_objects.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/errors/__init__.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/errors/base.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/errors/business.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/errors/configuration.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/errors/diagnostics.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/errors/lifecycle.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/errors/modularity.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/errors/services.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/events/__init__.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/events/aggregate.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/events/catalog.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/events/contracts.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/events/contribution.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/events/discovery.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/events/entities.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/events/errors.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/events/module.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/events/subscription.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/extensions/__init__.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/extensions/catalog.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/extensions/contracts.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/extensions/models.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/extensions/module.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/background.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/contracts.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/errors.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/filters.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/health.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/http.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/http_router.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/middleware.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/parameters.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/realtime/__init__.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/realtime/connection.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/realtime/module.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/route_integrity.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/settings.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/tracing.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/upload_limits.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/uploads.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/hosted_services/__init__.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/hosted_services/catalog.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/hosted_services/contracts.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/hosted_services/declarations.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/hosted_services/errors.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/hosted_services/module.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/hosted_services/options.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/hosted_services/state.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/hosting/__init__.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/hosting/instance.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/identity/errors.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/identity/http_api.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/identity/passwords.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/identity/permissions.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/identity/sqlalchemy/__init__.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/identity/sqlalchemy/migrations/0001_identity.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/identity/sqlalchemy/migrations/0002_physical_delete.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/identity/sqlalchemy/migrations/0003_extra_properties.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/identity/sqlalchemy/migrations/0004_concurrency_version.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/identity/sqlalchemy/migrations/__init__.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/identity/sqlalchemy/models.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/invocation/__init__.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/invocation/arguments.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/invocation/contracts.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/invocation/contribution.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/invocation/entries.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/invocation/execution.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/invocation/interceptors.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/invocation/policies.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/invocation/signature.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/invocation/validation.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/lifecycle/__init__.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/lifecycle/composition.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/lifecycle/context.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/lifecycle/participants.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/lifecycle/runtime.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/lifecycle/state.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/messaging/__init__.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/messaging/contracts.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/messaging/module.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/messaging/options.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/messaging/receipt.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/modularity/__init__.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/modularity/contracts.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/modularity/registry.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/modularity/selection.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/notifications/__init__.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/notifications/catalog.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/notifications/contracts.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/notifications/declarations.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/notifications/module.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/observability/__init__.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/observability/context.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/observability/export.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/observability/options.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/options/__init__.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/options/aliases.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/options/contribution.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/options/immutability.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/options/input_keys.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/options/issues.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/options/models.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/options/registry.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/options/schema.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/options/validation.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/py.typed +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/realtime/__init__.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/realtime/contracts.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/realtime/diagnostics.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/realtime/messages.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/redis/__init__.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/redis/cache_scripts.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/redis/distributed_lock.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/redis/lease_lock.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/redis/module.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/redis/notifications.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/redis/options.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/redis/runtime.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/seeding/__init__.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/seeding/contracts.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/seeding/module.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/seeding/runtime.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/services/__init__.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/services/binding.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/services/contribution.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/services/convention.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/services/convention_contracts.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/services/exposure.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/services/fixed_lifetime.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/services/framework_provider.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/services/native_graph.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/services/registration.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/services/repository.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/services/runtime.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/__init__.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/application.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/binding.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/catalog.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/changes.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/contracts.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/declarations.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/definition_discovery.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/definitions.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/errors.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/handlers.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/management.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/manager.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/module.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/notifications.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/permissions.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/provider.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/refresh_module.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/sqlalchemy/__init__.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/sqlalchemy/migrations/0001_settings.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/sqlalchemy/migrations/0002_physical_delete.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/sqlalchemy/migrations/0003_version_tokens.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/sqlalchemy/migrations/__init__.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/sqlalchemy/models.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/sqlalchemy/module.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/store.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/values.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/sqlalchemy/__init__.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/sqlalchemy/alembic_runtime/__init__.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/sqlalchemy/alembic_runtime/env.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/sqlalchemy/alembic_runtime/script.py.mako +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/sqlalchemy/auditing.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/sqlalchemy/errors.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/sqlalchemy/extensions.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/sqlalchemy/migration_operations.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/sqlalchemy/migration_options.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/sqlalchemy/module_migration.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/sqlalchemy/options.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/sqlalchemy/repository.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/sqlalchemy/runtime.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/sqlalchemy/session_provider.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/testing/__init__.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/testing/runtime.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/unit_of_work/__init__.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/unit_of_work/errors.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/unit_of_work/lifecycle.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/unit_of_work/options.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/validation/__init__.py +0 -0
- {python_ddd_framework-0.5.1 → python_ddd_framework-0.7.0}/src/python_ddd_framework/validation/models.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: python-ddd-framework
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.7.0
|
|
4
4
|
Summary: Modular DDD application framework with project CLI and bundled templates
|
|
5
5
|
License-Expression: LicenseRef-Proprietary
|
|
6
6
|
License-File: LICENSE
|
|
@@ -86,7 +86,7 @@ Runtime integrations ship in the base package; the Host explicitly enables the m
|
|
|
86
86
|
|
|
87
87
|
The supported versions and dependencies are defined in [pyproject.toml](https://github.com/componet-architecture/python-ddd-framework/blob/main/pyproject.toml). The framework, CLI, and bundled templates share one package version.
|
|
88
88
|
|
|
89
|
-
> **Version 0.
|
|
89
|
+
> **Version 0.6:** This version separates Identity credential and management contracts, enforces stable aggregate event values, corrects joined Unit of Work diagnostics, and adds recoverable CLI module publication. Apply the migration instructions below; previous Identity imports have no compatibility aliases. Check [release status](https://github.com/componet-architecture/python-ddd-framework/blob/main/docs/status.md#当前发布) for publication and validation evidence. Use the local-wheel route below when evaluating a checkout that has not been published.
|
|
90
90
|
|
|
91
91
|
### 1. Install the CLI and create a project
|
|
92
92
|
|
|
@@ -127,28 +127,33 @@ pddd add module conversions --template basic
|
|
|
127
127
|
|
|
128
128
|
`dev-init` starts or reuses local PostgreSQL and Redis using `backend/app.development.yaml`. It preserves existing data; database migration and seeding are separate steps.
|
|
129
129
|
|
|
130
|
-
`add module orders` generates
|
|
130
|
+
`add module orders` generates a DDD skeleton named `orders` and registers its Application, SQLAlchemy, and HttpApi Modules with the Host. It retains all responsibility directories, package markers, lifecycle hooks, ORM Base, model discovery, migration registration, and a module README. It creates no business entities, services, tables, endpoints, tasks, or test cases. Add them from confirmed requirements. The former order implementation is available as a separate [order-management example](examples/order_management/README.md), outside the runtime wheel.
|
|
131
131
|
|
|
132
132
|
`ddd` is the default six-layer template. `basic` generates only a Module, a synchronous Protocol service, its transient implementation, and an English README. It has no database/Redis requirement or implicit HTTP/interception. Both templates support `--dry-run` and refuse existing targets.
|
|
133
133
|
|
|
134
134
|
### 3. Initialize the database
|
|
135
135
|
|
|
136
|
-
Apply the provider migrations selected by the generated Host
|
|
136
|
+
Apply the provider migrations selected by the generated Host:
|
|
137
137
|
|
|
138
138
|
```sh
|
|
139
139
|
pddd db upgrade --module identity
|
|
140
140
|
pddd db upgrade --module settings
|
|
141
141
|
pddd db upgrade --module auditing
|
|
142
142
|
pddd db upgrade --module background_jobs
|
|
143
|
+
pddd db seed --module identity
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
An empty DDD skeleton retains model and migration registration but has no business tables or revisions. Add actual models before generating a business revision; migration commands still use the configured database. For a module named `orders`:
|
|
147
|
+
|
|
148
|
+
```sh
|
|
143
149
|
pddd db revision --module orders
|
|
144
150
|
```
|
|
145
151
|
|
|
146
|
-
Review the generated revision in `backend/src/modules/orders/sqlalchemy/migrations/` before applying it.
|
|
152
|
+
Review the generated revision in `backend/src/modules/orders/sqlalchemy/migrations/` before applying it. Run seed only after declaring the intended contributors:
|
|
147
153
|
|
|
148
154
|
```sh
|
|
149
155
|
pddd db upgrade --module orders
|
|
150
156
|
pddd db status --module orders
|
|
151
|
-
pddd db seed --module identity
|
|
152
157
|
pddd db seed --module orders
|
|
153
158
|
```
|
|
154
159
|
|
|
@@ -162,7 +167,7 @@ pddd dev
|
|
|
162
167
|
|
|
163
168
|
Open **http://127.0.0.1:8000/docs**. Use the generated `identity.seed_admin_username` and `identity.seed_admin_password` in `backend/app.development.yaml` to call `/api/auth/login`, then enter the returned access token in Swagger's **Authorize** dialog.
|
|
164
169
|
|
|
165
|
-
|
|
170
|
+
The empty `orders` skeleton contributes no business routes. The independent [order-management example](examples/order_management/README.md) supplies `/api/orders`, approval and queued approval, file transfer, and an authenticated WebSocket at `/ws/orders`; use its initializer when you want to explore those capabilities.
|
|
166
171
|
|
|
167
172
|
The default business API prefix is `/api`. Liveness and readiness are exposed at `/health/live` and `/health/ready`; readiness describes application lifecycle state, not continuous database or Redis health.
|
|
168
173
|
|
|
@@ -194,6 +199,34 @@ pddd db status --module orders --environment production
|
|
|
194
199
|
|
|
195
200
|
Generation supports `--dry-run` without writing files. Database commands require `--module`; aliases come from installed `python_ddd_framework.modules` entry points and must belong to the current application's module graph.
|
|
196
201
|
|
|
202
|
+
### Recovering a failed module addition
|
|
203
|
+
|
|
204
|
+
`add module` prints a recovery directory under the identified backend's
|
|
205
|
+
`.python-ddd-framework/generation/<operation-id>/`. It retains original bytes, proposed
|
|
206
|
+
startup/metadata files, a module file manifest, step records and `uv-sync.log`. The rendered
|
|
207
|
+
template and any unfinished sibling copies are retained too. Open that operation's
|
|
208
|
+
`RECOVERY.md` for its paths and a copyable, read-only inspection procedure.
|
|
209
|
+
|
|
210
|
+
Stop other generators and editors before recovery. Compare the actual files with the
|
|
211
|
+
recorded digests: continue only from the recorded original content, or restore an original
|
|
212
|
+
file only while the target still matches this operation's proposed content. Review any
|
|
213
|
+
other content manually. Keep generated directories and markers until you explicitly decide
|
|
214
|
+
what to do with them; rerunning `add module` does not repair a partial publication.
|
|
215
|
+
|
|
216
|
+
When all project files match the proposed contents but installation failed, use the
|
|
217
|
+
independent sync script in that operation's `RECOVERY.md`. Run it with `python -I` as
|
|
218
|
+
instructed. It clears the CLI's recorded Python/uv environment overrides before running
|
|
219
|
+
`uv sync` in the identified backend, including overrides set after generation. A bare
|
|
220
|
+
`uv sync --directory` still inherits environment overrides and can select another
|
|
221
|
+
virtual environment. The retry preserves your shell environment and the original records.
|
|
222
|
+
|
|
223
|
+
File publication and installation have separate results. An interrupted or missing step
|
|
224
|
+
record requires checking the files; it does not prove that the write failed. The CLI does
|
|
225
|
+
not automatically restore, move or delete the failure site, roll back the environment or
|
|
226
|
+
lockfile, or guarantee a transaction across files or power-loss recovery.
|
|
227
|
+
|
|
228
|
+
### Project command environment
|
|
229
|
+
|
|
197
230
|
`db` and `inspect` use `--environment`, then `PYTHON_DDD_FRAMEWORK_ENVIRONMENT`, then `development`. `dev` always selects development, and `dev-init` is restricted to development infrastructure.
|
|
198
231
|
|
|
199
232
|
`inspect` builds and closes the application without starting services or running migrations. Its output describes a newly composed Host, not a running process. Configuration output contains input values and their sources; it does not include Options defaults or later module contributions.
|
|
@@ -267,6 +300,22 @@ The image uses `python -m host.main` without development reload. Runtime install
|
|
|
267
300
|
|
|
268
301
|
<a id="版本与升级"></a>
|
|
269
302
|
|
|
303
|
+
### DDD skeleton generation (0.7)
|
|
304
|
+
|
|
305
|
+
New `ddd` modules contain the full responsibility directories and necessary composition, with no preset business code or tests. `basic` is unchanged. This affects subsequent generation only: upgrades do not delete or rewrite existing consumers' order code. Keep existing business contracts and data under their application owners. The former order implementation and its existing domain test now live in [the independent example](examples/order_management/README.md); its initializer uses the official CLI, requires a new destination, and is not bundled in the runtime wheel. No CLI parameter or dependency has been added.
|
|
306
|
+
|
|
307
|
+
<a id="streaming-and-access-migration-07-unreleased"></a>
|
|
308
|
+
|
|
309
|
+
## Streaming and access migration (0.7)
|
|
310
|
+
|
|
311
|
+
- Move `fastapi_realtime.authentication_refresh_seconds` to `fastapi_access.authentication_refresh_seconds`. The shared `FastApiAccessOptions` applies to managed HTTP streams and WebSocket connections; its default is 60 seconds and minimum is 1. The old realtime field is rejected.
|
|
312
|
+
- HTTP endpoints on `HttpRouter` can directly yield synchronous or asynchronous values using native FastAPI SSE, JSONL, or `StreamingResponse`. Keep checks required before the response starts in preparation dependencies or Filters. Authorization precedes binding; function dependencies, commit, and business resource cleanup finish before sending. The framework does not read the first item during preparation. Application services keep their existing return contract and may return a native streaming Response.
|
|
313
|
+
- Register subscriptions acquired during preparation with a native request-scoped yield dependency. An unstarted generator's `finally` cannot release those subscriptions. Database work in preparation or during iteration must use an independent short service call or UoW and finish before yielding data. Generator cleanup that awaits must shield its own `finally`, without holding a cancellation scope across `yield`.
|
|
314
|
+
- Streams with authorization declarations automatically recheck identity and endpoint permissions, including while idle or blocked on a slow client. Anonymous declarations retain their meaning. WebSocket `invoke` continues to authorize each service call separately. Failed checks terminate the transport; after `http.response.start`, no replacement JSON response is sent.
|
|
315
|
+
- `run_host(..., timeout_graceful_shutdown=10)` passes a non-negative integer to Uvicorn. When that period expires, cancellation is requested and framework drain still waits for actual resource release. Direct Uvicorn consumers must configure its native timeout themselves. A synchronous generator's running `next()` must eventually return; a timeout does not abandon its thread.
|
|
316
|
+
|
|
317
|
+
Runnable examples: [HTTP generators](docs/development.md#http-生成器与持续访问). Verification and limitations: [0.7.0 status](docs/status.md#070-通用生成器与持续访问未发布).
|
|
318
|
+
|
|
270
319
|
## Capability module migration (0.4)
|
|
271
320
|
|
|
272
321
|
Capability composition now uses the same `AppModule` model as customer modules. Existing applications must migrate their declarations together; there is no compatibility path.
|
|
@@ -290,6 +339,17 @@ The current contracts are in [architecture](https://github.com/componet-architec
|
|
|
290
339
|
- Replace `CacheDefinition`/`CacheDefinitions`/`CacheCatalog` with injected `DistributedCache[ValueType]`; remove cache declarations from Modules. Use `@cache_name("stable.name")` on the value type if required. Calls take keys/values directly. Configure global `caching.default_entry_options` or pass a complete `DistributedCacheEntryOptions`; omitted options use the default 20-minute sliding expiration, while an empty options object is persistent. Development Hosts explicitly set `caching.hide_errors: false`.
|
|
291
340
|
- Redis cache keys and entry encoding changed; old disposable entries are not read or migrated. They expire under their old TTL. `consider_uow=True` stages writes/deletions per concrete UoW; completion failures retain the committed database fact and do not make the two resources atomic. Do not retry an entire committed business operation merely because an AFTER_COMMIT handler or cache write failed.
|
|
292
341
|
|
|
342
|
+
## Aggregate event values (0.6)
|
|
343
|
+
|
|
344
|
+
`AggregateRoot.raise_local_event` now checks nested field values before enqueueing. Events must be frozen dataclass instances or frozen Pydantic models whose fields follow the [aggregate event value contract](https://github.com/componet-architecture/python-ddd-framework/blob/main/docs/architecture.md#聚合事件值).
|
|
345
|
+
|
|
346
|
+
- Replace mutable containers with tuples, frozensets, or explicit frozen value records. Decorating a mutable-container subclass with `frozen=True` does not make it an accepted event value. Map entity references to the IDs and values the event needs at the publishing point. A `MappingProxyType` still exposes changes to its backing dictionary and is rejected.
|
|
347
|
+
- Remove private, cached, or undeclared instance state from event records. Pydantic models with `extra="allow"` are rejected. Dataclass subclasses must themselves be decorated with `frozen=True`.
|
|
348
|
+
- Normalize database-driver scalar subclasses at the repository mapping boundary. For example, rebuild an asyncpg UUID as `UUID(bytes=row.id.bytes)` before passing it to a domain aggregate; the event validator accepts native `uuid.UUID` values.
|
|
349
|
+
- Rejected events raise `TypeError` before altering the aggregate queue. Accepted events retain their identity; the framework does not copy or convert them. Direct `LocalEventBus.publish` and repository entity-change notifications retain their existing behavior.
|
|
350
|
+
|
|
351
|
+
Redis batch calls keep serial I/O to preserve first-error, cancellation, and expiry side effects. Cache keys, entry encoding, and UoW pending-write behavior retain their existing contracts.
|
|
352
|
+
|
|
293
353
|
## Message processing (0.4)
|
|
294
354
|
|
|
295
355
|
Opt in with `MessagingModule`, `MessageChannelDefinition[T]`, `MessageHandler[T]` and the
|
|
@@ -335,6 +395,31 @@ Slice 7 adds user/role management and an application-local authorization switch.
|
|
|
335
395
|
|
|
336
396
|
See the [Identity guide](https://github.com/componet-architecture/python-ddd-framework/blob/main/docs/development.md#identity-管理与授权配置) and [validation limits](https://github.com/componet-architecture/python-ddd-framework/blob/main/docs/status.md#identity-与授权切片-7未发布). Consumer delivery is described in the layout migration below; fresh acceptance and remaining release limits are recorded on the status page.
|
|
337
397
|
|
|
398
|
+
## Identity contract refactor (0.6)
|
|
399
|
+
|
|
400
|
+
Version 0.6 replaces `IdentityRepository` with two independent contracts exported from `python_ddd_framework.identity`:
|
|
401
|
+
|
|
402
|
+
- `IdentityCredentialStore`: `get_user` and `set_password`, including the existing concurrency version and expected password hash.
|
|
403
|
+
- `IdentityManagementStore`: user/role creation, queries, edits, deletion and relationship updates. Password writes belong to the credential contract.
|
|
404
|
+
|
|
405
|
+
Authentication now receives `credentials`; management receives `store` and `credentials`; administrator seeding receives `store`. Update custom providers and directly constructed or subclassed defaults to these contracts. A shared implementation can use Dishka's native registration:
|
|
406
|
+
|
|
407
|
+
```python
|
|
408
|
+
from dishka import AnyOf, Provider, Scope
|
|
409
|
+
from python_ddd_framework.identity import IdentityCredentialStore, IdentityManagementStore
|
|
410
|
+
|
|
411
|
+
provider = Provider()
|
|
412
|
+
provider.provide(
|
|
413
|
+
MyIdentityStore,
|
|
414
|
+
provides=AnyOf[MyIdentityStore, IdentityCredentialStore, IdentityManagementStore],
|
|
415
|
+
scope=Scope.REQUEST,
|
|
416
|
+
)
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
`MyIdentityStore` is the consumer's implementation. The built-in SQLAlchemy provider registers its existing implementation this way. Providers may also implement and register the two contracts separately. Each implementation must keep the existing transaction and credential concurrency rules.
|
|
420
|
+
|
|
421
|
+
For direct submodule imports, use `identity.options`, `identity.dtos`, `identity.models`, `identity.stores`, and `identity.extensions`. `identity.contracts` owns application-service contracts and permission names. `IdentityAdminSeedContributor` is defined in `identity.seeding`, which `IdentityModule` scans. The former `IdentityRepository` export and old definition paths have no compatibility shims. This refactor changes no HTTP payload, token format, database schema or migration.
|
|
422
|
+
|
|
338
423
|
## Extension migration (0.4)
|
|
339
424
|
|
|
340
425
|
- Identity exposes `DefaultAuthenticationApplicationService` and `DefaultIdentityManagementApplicationService`. Specialize these public defaults and use the existing module override registration; keep policies on the final methods. Remove imports of the former private implementations.
|
|
@@ -368,6 +453,12 @@ During `0.x`, compatible fixes use a patch release; changes requiring consumer a
|
|
|
368
453
|
|
|
369
454
|
These notes remain the authoritative consumer migration instructions. Historical versions below refer to the former package name.
|
|
370
455
|
|
|
456
|
+
#### Unit of Work participant diagnostics (0.6)
|
|
457
|
+
|
|
458
|
+
An inner `begin()` that joins an existing Unit of Work now reads all transaction and cleanup facts from the owner. Completing or leaving the inner scope does not imply that the owner has committed or released its resources. Retained participant references continue to report the owner's latest outcome, including unknown commit results, saved batches and cleanup failures, while rejecting further operations after local completion or exit.
|
|
459
|
+
|
|
460
|
+
Do not use a participant's `resources_released` to detect exit from the inner scope; use the context manager boundary. Public types, signatures and provider hooks retain their existing contracts. This correction is introduced in 0.6.0.
|
|
461
|
+
|
|
371
462
|
#### Lifecycle shutdown migration (0.5)
|
|
372
463
|
|
|
373
464
|
Version 0.5.1 changes shutdown after the published 0.4.0 baseline. Custom `RuntimeParticipant` implementations must use the new global barriers: `quiesce` → `stopping(reason)` → `close_admission` → `drain` → `stop(reason)` → Module/container cleanup. Move accepted-work draining out of resource `stop`; keep dependencies alive until all drains complete. `prepare(bool)` still selects the startup mode.
|
|
@@ -382,7 +473,7 @@ Channels that must accept these callbacks declare `stopping_owners=(ServiceType,
|
|
|
382
473
|
|
|
383
474
|
The developer-kit dependency constrains `binaryornot` to `0.5.x`, because `0.6.0` can classify bundled templates containing Chinese comments as binary and skip rendering them. Re-resolve the developer-kit environment when installing 0.4.0. Updating the dependency does not replace existing generated application code.
|
|
384
475
|
|
|
385
|
-
The new `DomainService` marker uses existing constructor injection and transient REQUEST lifetime. It does not create transactions or expose HTTP endpoints.
|
|
476
|
+
The new `DomainService` marker uses existing constructor injection and transient REQUEST lifetime. It does not create transactions or expose HTTP endpoints. The independent order example places approval policy in `domain/services/order_approval_service.py`; existing projects can adopt it explicitly after upgrading. The example application checks existence and the submitted version before the domain policy; a stale or missing order therefore takes precedence over a disabled approval setting when both inputs are invalid. Domain rules, schema, and installation files are not automatically rewritten.
|
|
386
477
|
|
|
387
478
|
<a id="框架更名迁移未发布"></a>
|
|
388
479
|
|
|
@@ -455,7 +546,7 @@ Do not remove durable job payload versions merely because their Python APIs were
|
|
|
455
546
|
<details>
|
|
456
547
|
<summary>For maintainers: publishing a changed version</summary>
|
|
457
548
|
|
|
458
|
-
Routine code and documentation commits may retain the current version. Pushes to `main`
|
|
549
|
+
Routine code and documentation commits may retain the current version. Pull requests to `main` run build, static checks, and short architecture/typing/release-intent checks with read-only permissions. Pushes to `main` run the full release gates, including locked, lowest-direct, and highest allowed dependency samples, but skip publication unless the version increased across the push; initial creation of `main` publishes its current version. Manual workflow runs validate only. A failed run may be retried, but a later same-version push does not resume publication: changed contents require another version bump. Follow [release operations](https://github.com/componet-architecture/python-ddd-framework/blob/main/docs/development.md#发布操作) for publisher setup and retry boundaries. Dependency samples and current API/type checks do not establish backward compatibility or a cross-version upgrade guarantee.
|
|
459
550
|
|
|
460
551
|
</details>
|
|
461
552
|
|
|
@@ -471,7 +562,7 @@ The engineering guides below are maintained in Chinese in the private GitHub rep
|
|
|
471
562
|
| Check release evidence and remaining validation limits | [Status and validation](https://github.com/componet-architecture/python-ddd-framework/blob/main/docs/status.md) |
|
|
472
563
|
| Change the framework itself | [Contributor guidance](https://github.com/componet-architecture/python-ddd-framework/blob/main/AGENTS.md) and [focused reading paths](https://github.com/componet-architecture/python-ddd-framework/blob/main/docs/README.md#重构的最短阅读路径) |
|
|
473
564
|
|
|
474
|
-
Generated applications include a self-contained English README, `AGENTS.md`, architecture document, and development guide for their template version.
|
|
565
|
+
Generated applications include a self-contained English README, `AGENTS.md`, architecture document, and development guide for their template version. They require an owner/layer/directory/API check before implementation and a review of the seven design principles, DDD boundaries, and actual verification before delivery. The development guide provides CLI entry points, installed-artifact/source comparison, capability recipes, and a complete native HTTP generator example; architecture owns streaming/access boundaries, and the generated README owns configuration migration and shutdown operations. These instructions do not imply an automated architecture gate. Each DDD module README records the empty skeleton and guides the first authorized use case; the independent order example owns its own business documentation and acceptance source. The application maintains these documents after generation; upgrades do not overwrite them. Existing applications can use their installed package's `developer_kit/templates` as a read-only reference while preserving application rules and decisions. A user-provided framework checkout is also read-only; matching version numbers alone do not prove it matches the consumed artifact.
|
|
475
566
|
|
|
476
567
|
## License
|
|
477
568
|
|
|
@@ -42,7 +42,7 @@ Runtime integrations ship in the base package; the Host explicitly enables the m
|
|
|
42
42
|
|
|
43
43
|
The supported versions and dependencies are defined in [pyproject.toml](https://github.com/componet-architecture/python-ddd-framework/blob/main/pyproject.toml). The framework, CLI, and bundled templates share one package version.
|
|
44
44
|
|
|
45
|
-
> **Version 0.
|
|
45
|
+
> **Version 0.6:** This version separates Identity credential and management contracts, enforces stable aggregate event values, corrects joined Unit of Work diagnostics, and adds recoverable CLI module publication. Apply the migration instructions below; previous Identity imports have no compatibility aliases. Check [release status](https://github.com/componet-architecture/python-ddd-framework/blob/main/docs/status.md#当前发布) for publication and validation evidence. Use the local-wheel route below when evaluating a checkout that has not been published.
|
|
46
46
|
|
|
47
47
|
### 1. Install the CLI and create a project
|
|
48
48
|
|
|
@@ -83,28 +83,33 @@ pddd add module conversions --template basic
|
|
|
83
83
|
|
|
84
84
|
`dev-init` starts or reuses local PostgreSQL and Redis using `backend/app.development.yaml`. It preserves existing data; database migration and seeding are separate steps.
|
|
85
85
|
|
|
86
|
-
`add module orders` generates
|
|
86
|
+
`add module orders` generates a DDD skeleton named `orders` and registers its Application, SQLAlchemy, and HttpApi Modules with the Host. It retains all responsibility directories, package markers, lifecycle hooks, ORM Base, model discovery, migration registration, and a module README. It creates no business entities, services, tables, endpoints, tasks, or test cases. Add them from confirmed requirements. The former order implementation is available as a separate [order-management example](examples/order_management/README.md), outside the runtime wheel.
|
|
87
87
|
|
|
88
88
|
`ddd` is the default six-layer template. `basic` generates only a Module, a synchronous Protocol service, its transient implementation, and an English README. It has no database/Redis requirement or implicit HTTP/interception. Both templates support `--dry-run` and refuse existing targets.
|
|
89
89
|
|
|
90
90
|
### 3. Initialize the database
|
|
91
91
|
|
|
92
|
-
Apply the provider migrations selected by the generated Host
|
|
92
|
+
Apply the provider migrations selected by the generated Host:
|
|
93
93
|
|
|
94
94
|
```sh
|
|
95
95
|
pddd db upgrade --module identity
|
|
96
96
|
pddd db upgrade --module settings
|
|
97
97
|
pddd db upgrade --module auditing
|
|
98
98
|
pddd db upgrade --module background_jobs
|
|
99
|
+
pddd db seed --module identity
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
An empty DDD skeleton retains model and migration registration but has no business tables or revisions. Add actual models before generating a business revision; migration commands still use the configured database. For a module named `orders`:
|
|
103
|
+
|
|
104
|
+
```sh
|
|
99
105
|
pddd db revision --module orders
|
|
100
106
|
```
|
|
101
107
|
|
|
102
|
-
Review the generated revision in `backend/src/modules/orders/sqlalchemy/migrations/` before applying it.
|
|
108
|
+
Review the generated revision in `backend/src/modules/orders/sqlalchemy/migrations/` before applying it. Run seed only after declaring the intended contributors:
|
|
103
109
|
|
|
104
110
|
```sh
|
|
105
111
|
pddd db upgrade --module orders
|
|
106
112
|
pddd db status --module orders
|
|
107
|
-
pddd db seed --module identity
|
|
108
113
|
pddd db seed --module orders
|
|
109
114
|
```
|
|
110
115
|
|
|
@@ -118,7 +123,7 @@ pddd dev
|
|
|
118
123
|
|
|
119
124
|
Open **http://127.0.0.1:8000/docs**. Use the generated `identity.seed_admin_username` and `identity.seed_admin_password` in `backend/app.development.yaml` to call `/api/auth/login`, then enter the returned access token in Swagger's **Authorize** dialog.
|
|
120
125
|
|
|
121
|
-
|
|
126
|
+
The empty `orders` skeleton contributes no business routes. The independent [order-management example](examples/order_management/README.md) supplies `/api/orders`, approval and queued approval, file transfer, and an authenticated WebSocket at `/ws/orders`; use its initializer when you want to explore those capabilities.
|
|
122
127
|
|
|
123
128
|
The default business API prefix is `/api`. Liveness and readiness are exposed at `/health/live` and `/health/ready`; readiness describes application lifecycle state, not continuous database or Redis health.
|
|
124
129
|
|
|
@@ -150,6 +155,34 @@ pddd db status --module orders --environment production
|
|
|
150
155
|
|
|
151
156
|
Generation supports `--dry-run` without writing files. Database commands require `--module`; aliases come from installed `python_ddd_framework.modules` entry points and must belong to the current application's module graph.
|
|
152
157
|
|
|
158
|
+
### Recovering a failed module addition
|
|
159
|
+
|
|
160
|
+
`add module` prints a recovery directory under the identified backend's
|
|
161
|
+
`.python-ddd-framework/generation/<operation-id>/`. It retains original bytes, proposed
|
|
162
|
+
startup/metadata files, a module file manifest, step records and `uv-sync.log`. The rendered
|
|
163
|
+
template and any unfinished sibling copies are retained too. Open that operation's
|
|
164
|
+
`RECOVERY.md` for its paths and a copyable, read-only inspection procedure.
|
|
165
|
+
|
|
166
|
+
Stop other generators and editors before recovery. Compare the actual files with the
|
|
167
|
+
recorded digests: continue only from the recorded original content, or restore an original
|
|
168
|
+
file only while the target still matches this operation's proposed content. Review any
|
|
169
|
+
other content manually. Keep generated directories and markers until you explicitly decide
|
|
170
|
+
what to do with them; rerunning `add module` does not repair a partial publication.
|
|
171
|
+
|
|
172
|
+
When all project files match the proposed contents but installation failed, use the
|
|
173
|
+
independent sync script in that operation's `RECOVERY.md`. Run it with `python -I` as
|
|
174
|
+
instructed. It clears the CLI's recorded Python/uv environment overrides before running
|
|
175
|
+
`uv sync` in the identified backend, including overrides set after generation. A bare
|
|
176
|
+
`uv sync --directory` still inherits environment overrides and can select another
|
|
177
|
+
virtual environment. The retry preserves your shell environment and the original records.
|
|
178
|
+
|
|
179
|
+
File publication and installation have separate results. An interrupted or missing step
|
|
180
|
+
record requires checking the files; it does not prove that the write failed. The CLI does
|
|
181
|
+
not automatically restore, move or delete the failure site, roll back the environment or
|
|
182
|
+
lockfile, or guarantee a transaction across files or power-loss recovery.
|
|
183
|
+
|
|
184
|
+
### Project command environment
|
|
185
|
+
|
|
153
186
|
`db` and `inspect` use `--environment`, then `PYTHON_DDD_FRAMEWORK_ENVIRONMENT`, then `development`. `dev` always selects development, and `dev-init` is restricted to development infrastructure.
|
|
154
187
|
|
|
155
188
|
`inspect` builds and closes the application without starting services or running migrations. Its output describes a newly composed Host, not a running process. Configuration output contains input values and their sources; it does not include Options defaults or later module contributions.
|
|
@@ -223,6 +256,22 @@ The image uses `python -m host.main` without development reload. Runtime install
|
|
|
223
256
|
|
|
224
257
|
<a id="版本与升级"></a>
|
|
225
258
|
|
|
259
|
+
### DDD skeleton generation (0.7)
|
|
260
|
+
|
|
261
|
+
New `ddd` modules contain the full responsibility directories and necessary composition, with no preset business code or tests. `basic` is unchanged. This affects subsequent generation only: upgrades do not delete or rewrite existing consumers' order code. Keep existing business contracts and data under their application owners. The former order implementation and its existing domain test now live in [the independent example](examples/order_management/README.md); its initializer uses the official CLI, requires a new destination, and is not bundled in the runtime wheel. No CLI parameter or dependency has been added.
|
|
262
|
+
|
|
263
|
+
<a id="streaming-and-access-migration-07-unreleased"></a>
|
|
264
|
+
|
|
265
|
+
## Streaming and access migration (0.7)
|
|
266
|
+
|
|
267
|
+
- Move `fastapi_realtime.authentication_refresh_seconds` to `fastapi_access.authentication_refresh_seconds`. The shared `FastApiAccessOptions` applies to managed HTTP streams and WebSocket connections; its default is 60 seconds and minimum is 1. The old realtime field is rejected.
|
|
268
|
+
- HTTP endpoints on `HttpRouter` can directly yield synchronous or asynchronous values using native FastAPI SSE, JSONL, or `StreamingResponse`. Keep checks required before the response starts in preparation dependencies or Filters. Authorization precedes binding; function dependencies, commit, and business resource cleanup finish before sending. The framework does not read the first item during preparation. Application services keep their existing return contract and may return a native streaming Response.
|
|
269
|
+
- Register subscriptions acquired during preparation with a native request-scoped yield dependency. An unstarted generator's `finally` cannot release those subscriptions. Database work in preparation or during iteration must use an independent short service call or UoW and finish before yielding data. Generator cleanup that awaits must shield its own `finally`, without holding a cancellation scope across `yield`.
|
|
270
|
+
- Streams with authorization declarations automatically recheck identity and endpoint permissions, including while idle or blocked on a slow client. Anonymous declarations retain their meaning. WebSocket `invoke` continues to authorize each service call separately. Failed checks terminate the transport; after `http.response.start`, no replacement JSON response is sent.
|
|
271
|
+
- `run_host(..., timeout_graceful_shutdown=10)` passes a non-negative integer to Uvicorn. When that period expires, cancellation is requested and framework drain still waits for actual resource release. Direct Uvicorn consumers must configure its native timeout themselves. A synchronous generator's running `next()` must eventually return; a timeout does not abandon its thread.
|
|
272
|
+
|
|
273
|
+
Runnable examples: [HTTP generators](docs/development.md#http-生成器与持续访问). Verification and limitations: [0.7.0 status](docs/status.md#070-通用生成器与持续访问未发布).
|
|
274
|
+
|
|
226
275
|
## Capability module migration (0.4)
|
|
227
276
|
|
|
228
277
|
Capability composition now uses the same `AppModule` model as customer modules. Existing applications must migrate their declarations together; there is no compatibility path.
|
|
@@ -246,6 +295,17 @@ The current contracts are in [architecture](https://github.com/componet-architec
|
|
|
246
295
|
- Replace `CacheDefinition`/`CacheDefinitions`/`CacheCatalog` with injected `DistributedCache[ValueType]`; remove cache declarations from Modules. Use `@cache_name("stable.name")` on the value type if required. Calls take keys/values directly. Configure global `caching.default_entry_options` or pass a complete `DistributedCacheEntryOptions`; omitted options use the default 20-minute sliding expiration, while an empty options object is persistent. Development Hosts explicitly set `caching.hide_errors: false`.
|
|
247
296
|
- Redis cache keys and entry encoding changed; old disposable entries are not read or migrated. They expire under their old TTL. `consider_uow=True` stages writes/deletions per concrete UoW; completion failures retain the committed database fact and do not make the two resources atomic. Do not retry an entire committed business operation merely because an AFTER_COMMIT handler or cache write failed.
|
|
248
297
|
|
|
298
|
+
## Aggregate event values (0.6)
|
|
299
|
+
|
|
300
|
+
`AggregateRoot.raise_local_event` now checks nested field values before enqueueing. Events must be frozen dataclass instances or frozen Pydantic models whose fields follow the [aggregate event value contract](https://github.com/componet-architecture/python-ddd-framework/blob/main/docs/architecture.md#聚合事件值).
|
|
301
|
+
|
|
302
|
+
- Replace mutable containers with tuples, frozensets, or explicit frozen value records. Decorating a mutable-container subclass with `frozen=True` does not make it an accepted event value. Map entity references to the IDs and values the event needs at the publishing point. A `MappingProxyType` still exposes changes to its backing dictionary and is rejected.
|
|
303
|
+
- Remove private, cached, or undeclared instance state from event records. Pydantic models with `extra="allow"` are rejected. Dataclass subclasses must themselves be decorated with `frozen=True`.
|
|
304
|
+
- Normalize database-driver scalar subclasses at the repository mapping boundary. For example, rebuild an asyncpg UUID as `UUID(bytes=row.id.bytes)` before passing it to a domain aggregate; the event validator accepts native `uuid.UUID` values.
|
|
305
|
+
- Rejected events raise `TypeError` before altering the aggregate queue. Accepted events retain their identity; the framework does not copy or convert them. Direct `LocalEventBus.publish` and repository entity-change notifications retain their existing behavior.
|
|
306
|
+
|
|
307
|
+
Redis batch calls keep serial I/O to preserve first-error, cancellation, and expiry side effects. Cache keys, entry encoding, and UoW pending-write behavior retain their existing contracts.
|
|
308
|
+
|
|
249
309
|
## Message processing (0.4)
|
|
250
310
|
|
|
251
311
|
Opt in with `MessagingModule`, `MessageChannelDefinition[T]`, `MessageHandler[T]` and the
|
|
@@ -291,6 +351,31 @@ Slice 7 adds user/role management and an application-local authorization switch.
|
|
|
291
351
|
|
|
292
352
|
See the [Identity guide](https://github.com/componet-architecture/python-ddd-framework/blob/main/docs/development.md#identity-管理与授权配置) and [validation limits](https://github.com/componet-architecture/python-ddd-framework/blob/main/docs/status.md#identity-与授权切片-7未发布). Consumer delivery is described in the layout migration below; fresh acceptance and remaining release limits are recorded on the status page.
|
|
293
353
|
|
|
354
|
+
## Identity contract refactor (0.6)
|
|
355
|
+
|
|
356
|
+
Version 0.6 replaces `IdentityRepository` with two independent contracts exported from `python_ddd_framework.identity`:
|
|
357
|
+
|
|
358
|
+
- `IdentityCredentialStore`: `get_user` and `set_password`, including the existing concurrency version and expected password hash.
|
|
359
|
+
- `IdentityManagementStore`: user/role creation, queries, edits, deletion and relationship updates. Password writes belong to the credential contract.
|
|
360
|
+
|
|
361
|
+
Authentication now receives `credentials`; management receives `store` and `credentials`; administrator seeding receives `store`. Update custom providers and directly constructed or subclassed defaults to these contracts. A shared implementation can use Dishka's native registration:
|
|
362
|
+
|
|
363
|
+
```python
|
|
364
|
+
from dishka import AnyOf, Provider, Scope
|
|
365
|
+
from python_ddd_framework.identity import IdentityCredentialStore, IdentityManagementStore
|
|
366
|
+
|
|
367
|
+
provider = Provider()
|
|
368
|
+
provider.provide(
|
|
369
|
+
MyIdentityStore,
|
|
370
|
+
provides=AnyOf[MyIdentityStore, IdentityCredentialStore, IdentityManagementStore],
|
|
371
|
+
scope=Scope.REQUEST,
|
|
372
|
+
)
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
`MyIdentityStore` is the consumer's implementation. The built-in SQLAlchemy provider registers its existing implementation this way. Providers may also implement and register the two contracts separately. Each implementation must keep the existing transaction and credential concurrency rules.
|
|
376
|
+
|
|
377
|
+
For direct submodule imports, use `identity.options`, `identity.dtos`, `identity.models`, `identity.stores`, and `identity.extensions`. `identity.contracts` owns application-service contracts and permission names. `IdentityAdminSeedContributor` is defined in `identity.seeding`, which `IdentityModule` scans. The former `IdentityRepository` export and old definition paths have no compatibility shims. This refactor changes no HTTP payload, token format, database schema or migration.
|
|
378
|
+
|
|
294
379
|
## Extension migration (0.4)
|
|
295
380
|
|
|
296
381
|
- Identity exposes `DefaultAuthenticationApplicationService` and `DefaultIdentityManagementApplicationService`. Specialize these public defaults and use the existing module override registration; keep policies on the final methods. Remove imports of the former private implementations.
|
|
@@ -324,6 +409,12 @@ During `0.x`, compatible fixes use a patch release; changes requiring consumer a
|
|
|
324
409
|
|
|
325
410
|
These notes remain the authoritative consumer migration instructions. Historical versions below refer to the former package name.
|
|
326
411
|
|
|
412
|
+
#### Unit of Work participant diagnostics (0.6)
|
|
413
|
+
|
|
414
|
+
An inner `begin()` that joins an existing Unit of Work now reads all transaction and cleanup facts from the owner. Completing or leaving the inner scope does not imply that the owner has committed or released its resources. Retained participant references continue to report the owner's latest outcome, including unknown commit results, saved batches and cleanup failures, while rejecting further operations after local completion or exit.
|
|
415
|
+
|
|
416
|
+
Do not use a participant's `resources_released` to detect exit from the inner scope; use the context manager boundary. Public types, signatures and provider hooks retain their existing contracts. This correction is introduced in 0.6.0.
|
|
417
|
+
|
|
327
418
|
#### Lifecycle shutdown migration (0.5)
|
|
328
419
|
|
|
329
420
|
Version 0.5.1 changes shutdown after the published 0.4.0 baseline. Custom `RuntimeParticipant` implementations must use the new global barriers: `quiesce` → `stopping(reason)` → `close_admission` → `drain` → `stop(reason)` → Module/container cleanup. Move accepted-work draining out of resource `stop`; keep dependencies alive until all drains complete. `prepare(bool)` still selects the startup mode.
|
|
@@ -338,7 +429,7 @@ Channels that must accept these callbacks declare `stopping_owners=(ServiceType,
|
|
|
338
429
|
|
|
339
430
|
The developer-kit dependency constrains `binaryornot` to `0.5.x`, because `0.6.0` can classify bundled templates containing Chinese comments as binary and skip rendering them. Re-resolve the developer-kit environment when installing 0.4.0. Updating the dependency does not replace existing generated application code.
|
|
340
431
|
|
|
341
|
-
The new `DomainService` marker uses existing constructor injection and transient REQUEST lifetime. It does not create transactions or expose HTTP endpoints.
|
|
432
|
+
The new `DomainService` marker uses existing constructor injection and transient REQUEST lifetime. It does not create transactions or expose HTTP endpoints. The independent order example places approval policy in `domain/services/order_approval_service.py`; existing projects can adopt it explicitly after upgrading. The example application checks existence and the submitted version before the domain policy; a stale or missing order therefore takes precedence over a disabled approval setting when both inputs are invalid. Domain rules, schema, and installation files are not automatically rewritten.
|
|
342
433
|
|
|
343
434
|
<a id="框架更名迁移未发布"></a>
|
|
344
435
|
|
|
@@ -411,7 +502,7 @@ Do not remove durable job payload versions merely because their Python APIs were
|
|
|
411
502
|
<details>
|
|
412
503
|
<summary>For maintainers: publishing a changed version</summary>
|
|
413
504
|
|
|
414
|
-
Routine code and documentation commits may retain the current version. Pushes to `main`
|
|
505
|
+
Routine code and documentation commits may retain the current version. Pull requests to `main` run build, static checks, and short architecture/typing/release-intent checks with read-only permissions. Pushes to `main` run the full release gates, including locked, lowest-direct, and highest allowed dependency samples, but skip publication unless the version increased across the push; initial creation of `main` publishes its current version. Manual workflow runs validate only. A failed run may be retried, but a later same-version push does not resume publication: changed contents require another version bump. Follow [release operations](https://github.com/componet-architecture/python-ddd-framework/blob/main/docs/development.md#发布操作) for publisher setup and retry boundaries. Dependency samples and current API/type checks do not establish backward compatibility or a cross-version upgrade guarantee.
|
|
415
506
|
|
|
416
507
|
</details>
|
|
417
508
|
|
|
@@ -427,7 +518,7 @@ The engineering guides below are maintained in Chinese in the private GitHub rep
|
|
|
427
518
|
| Check release evidence and remaining validation limits | [Status and validation](https://github.com/componet-architecture/python-ddd-framework/blob/main/docs/status.md) |
|
|
428
519
|
| Change the framework itself | [Contributor guidance](https://github.com/componet-architecture/python-ddd-framework/blob/main/AGENTS.md) and [focused reading paths](https://github.com/componet-architecture/python-ddd-framework/blob/main/docs/README.md#重构的最短阅读路径) |
|
|
429
520
|
|
|
430
|
-
Generated applications include a self-contained English README, `AGENTS.md`, architecture document, and development guide for their template version.
|
|
521
|
+
Generated applications include a self-contained English README, `AGENTS.md`, architecture document, and development guide for their template version. They require an owner/layer/directory/API check before implementation and a review of the seven design principles, DDD boundaries, and actual verification before delivery. The development guide provides CLI entry points, installed-artifact/source comparison, capability recipes, and a complete native HTTP generator example; architecture owns streaming/access boundaries, and the generated README owns configuration migration and shutdown operations. These instructions do not imply an automated architecture gate. Each DDD module README records the empty skeleton and guides the first authorized use case; the independent order example owns its own business documentation and acceptance source. The application maintains these documents after generation; upgrades do not overwrite them. Existing applications can use their installed package's `developer_kit/templates` as a read-only reference while preserving application rules and decisions. A user-provided framework checkout is also read-only; matching version numbers alone do not prove it matches the consumed artifact.
|
|
431
522
|
|
|
432
523
|
## License
|
|
433
524
|
|
|
@@ -9,15 +9,12 @@ from typing import get_origin
|
|
|
9
9
|
from dishka import (
|
|
10
10
|
DEFAULT_COMPONENT,
|
|
11
11
|
DependencyKey,
|
|
12
|
-
Provider,
|
|
13
12
|
Scope,
|
|
14
13
|
)
|
|
15
14
|
|
|
16
15
|
from ..diagnostics import SourceLocation
|
|
17
16
|
from ..modularity import ModuleRegistry
|
|
18
17
|
from ..services.arbitration import (
|
|
19
|
-
_ArbitrationResult,
|
|
20
|
-
_provider_with_active_sources,
|
|
21
18
|
_RegistrationDraft,
|
|
22
19
|
)
|
|
23
20
|
from ..services.native_graph import _NativeServiceGraph
|
|
@@ -201,64 +198,3 @@ def _validate_application_service_bindings(
|
|
|
201
198
|
"or private implementation binding"
|
|
202
199
|
),
|
|
203
200
|
)
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
def _runtime_providers(
|
|
207
|
-
arbitration: _ArbitrationResult,
|
|
208
|
-
services: tuple[_BoundApplicationService, ...],
|
|
209
|
-
) -> tuple[Provider, ...]:
|
|
210
|
-
"""仅重定位 Application Service factories;其他 Dishka provider 保持原生形状。"""
|
|
211
|
-
|
|
212
|
-
related_draft_ids = frozenset(
|
|
213
|
-
draft_id for service in services for draft_id in service.related_draft_ids
|
|
214
|
-
)
|
|
215
|
-
drafts_by_entry: dict[int, list[_RegistrationDraft]] = {}
|
|
216
|
-
for draft in arbitration.drafts:
|
|
217
|
-
drafts_by_entry.setdefault(draft.entry.entry_id, []).append(draft)
|
|
218
|
-
|
|
219
|
-
providers: list[Provider] = []
|
|
220
|
-
for entry in arbitration.ordered_entries:
|
|
221
|
-
entry_drafts = drafts_by_entry[entry.entry_id]
|
|
222
|
-
active = tuple(
|
|
223
|
-
draft
|
|
224
|
-
for draft in entry_drafts
|
|
225
|
-
if draft.decision is not RegistrationDecision.BACKED_OFF
|
|
226
|
-
and id(draft) not in related_draft_ids
|
|
227
|
-
)
|
|
228
|
-
if not active:
|
|
229
|
-
continue
|
|
230
|
-
if len(active) == len(entry_drafts):
|
|
231
|
-
providers.append(entry.contribution.provider)
|
|
232
|
-
else:
|
|
233
|
-
providers.append(_provider_with_active_sources(entry.contribution.provider, active))
|
|
234
|
-
|
|
235
|
-
# default component 只发布 REQUEST proxy;ACTION implementation 统一藏入框架私有 component。
|
|
236
|
-
implementation_provider = Provider(component=_APPLICATION_SERVICE_COMPONENT)
|
|
237
|
-
for service in services:
|
|
238
|
-
winner = service.winner
|
|
239
|
-
assert winner.factory is not None
|
|
240
|
-
# internal contributor 被 override 时仍以原声明 key 调度;
|
|
241
|
-
# winner class 只是实现事实,不能改写契约 key。
|
|
242
|
-
contract = (
|
|
243
|
-
service.binding.discovery.definition.contract or service.binding.discovery.service_type
|
|
244
|
-
)
|
|
245
|
-
implementation_provider.factories.append(
|
|
246
|
-
winner.factory.replace(
|
|
247
|
-
dependencies=tuple(
|
|
248
|
-
dependency.with_component(DEFAULT_COMPONENT)
|
|
249
|
-
for dependency in winner.factory.dependencies
|
|
250
|
-
),
|
|
251
|
-
kw_dependencies={
|
|
252
|
-
name: dependency.with_component(DEFAULT_COMPONENT)
|
|
253
|
-
for name, dependency in winner.factory.kw_dependencies.items()
|
|
254
|
-
},
|
|
255
|
-
provides=DependencyKey(contract, None),
|
|
256
|
-
when_override=None,
|
|
257
|
-
when_component=DEFAULT_COMPONENT,
|
|
258
|
-
)
|
|
259
|
-
)
|
|
260
|
-
# ServiceCatalog 的 accepted row 必须描述 relocated native binding,而非旧 default key。
|
|
261
|
-
winner.key = DependencyKey(contract, _APPLICATION_SERVICE_COMPONENT)
|
|
262
|
-
if services:
|
|
263
|
-
providers.append(implementation_provider)
|
|
264
|
-
return tuple(providers)
|
|
@@ -13,6 +13,7 @@ from dishka import AsyncContainer
|
|
|
13
13
|
from ..invocation.dispatcher import _MethodDispatcher
|
|
14
14
|
from ..invocation.execution import _InterceptorPipeline
|
|
15
15
|
from ..invocation.methods import _CompiledMethod
|
|
16
|
+
from ..invocation.runtime import _current_task, _InvocationRuntime
|
|
16
17
|
from ..settings.provider import SettingProvider
|
|
17
18
|
from .catalog import (
|
|
18
19
|
_APPLICATION_SERVICE_COMPONENT,
|
|
@@ -22,7 +23,6 @@ from .contracts import ApplicationService
|
|
|
22
23
|
from .errors import (
|
|
23
24
|
CrossTaskInvocationError,
|
|
24
25
|
)
|
|
25
|
-
from .invocation import _current_task, _InvocationRuntime
|
|
26
26
|
|
|
27
27
|
|
|
28
28
|
@dataclass(slots=True)
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"""应用服务 Contract 的 REQUEST 代理入口;准入与 scope 清理由 Invocation 拥有。"""
|
|
2
|
+
|
|
3
|
+
from collections.abc import Awaitable, Callable
|
|
4
|
+
from typing import cast
|
|
5
|
+
|
|
6
|
+
from dishka import AsyncContainer, Scope
|
|
7
|
+
|
|
8
|
+
from ..authorization import CurrentUser
|
|
9
|
+
from ..invocation.runtime import _InvocationRuntime
|
|
10
|
+
from ..invocation.scopes import _managed_request
|
|
11
|
+
from .catalog import ApplicationServiceCatalog
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class _ScopedApplicationServiceInvoker:
|
|
15
|
+
"""从 Application root 或其 SESSION 建立 REQUEST,不向 caller 暴露 resolver。"""
|
|
16
|
+
|
|
17
|
+
__slots__ = ("_catalog", "_root_container", "_runtime")
|
|
18
|
+
|
|
19
|
+
def __init__(
|
|
20
|
+
self,
|
|
21
|
+
container: AsyncContainer,
|
|
22
|
+
runtime: _InvocationRuntime,
|
|
23
|
+
catalog: ApplicationServiceCatalog,
|
|
24
|
+
) -> None:
|
|
25
|
+
self._root_container = container
|
|
26
|
+
self._runtime = runtime
|
|
27
|
+
self._catalog = catalog
|
|
28
|
+
|
|
29
|
+
async def invoke(
|
|
30
|
+
self,
|
|
31
|
+
parent: AsyncContainer,
|
|
32
|
+
current_user: CurrentUser,
|
|
33
|
+
correlation_id: str,
|
|
34
|
+
method: Callable[..., Awaitable[object]],
|
|
35
|
+
args: tuple[object, ...],
|
|
36
|
+
kwargs: dict[str, object],
|
|
37
|
+
) -> object:
|
|
38
|
+
self._require_owned_parent(parent)
|
|
39
|
+
service, compiled = self._catalog._resolve_method(method)
|
|
40
|
+
async with self._runtime.outer_lease():
|
|
41
|
+
caller_token = self._runtime.bind_caller(current_user, correlation_id)
|
|
42
|
+
try:
|
|
43
|
+
async with _managed_request(parent) as request_container:
|
|
44
|
+
proxy = await request_container.get(service.registration.contract)
|
|
45
|
+
call = cast(
|
|
46
|
+
Callable[..., Awaitable[object]],
|
|
47
|
+
getattr(proxy, compiled.name),
|
|
48
|
+
)
|
|
49
|
+
return await call(*args, **kwargs)
|
|
50
|
+
finally:
|
|
51
|
+
self._runtime.reset_caller(caller_token)
|
|
52
|
+
|
|
53
|
+
def _require_owned_parent(self, parent: AsyncContainer) -> None:
|
|
54
|
+
if parent is self._root_container:
|
|
55
|
+
return
|
|
56
|
+
if parent.scope is not Scope.SESSION or parent.parent_container is not self._root_container:
|
|
57
|
+
raise RuntimeError("scoped invocation parent is not owned by this Application")
|