python-ddd-framework 0.6.0__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.6.0 → python_ddd_framework-0.7.0}/PKG-INFO +29 -8
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/README.md +28 -7
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/pyproject.toml +1 -1
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/pyproject.toml.orig +1 -1
- python_ddd_framework-0.7.0/src/python_ddd_framework/authorization/checking.py +35 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/generation.py +0 -9
- 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.6.0 → 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.6.0 → 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.6.0 → 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.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/AGENTS.md +12 -8
- {python_ddd_framework-0.6.0 → 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.6.0 → 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.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/docs/architecture.md +40 -6
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/docs/development.md +177 -30
- {python_ddd_framework-0.6.0 → 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.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/action.py +6 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/manual_action.py +33 -2
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/module.py +2 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/realtime/authentication.py +21 -10
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/realtime/options.py +0 -1
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/realtime/runtime.py +41 -26
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/request_context.py +10 -2
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/routing.py +12 -5
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/server.py +9 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/service_endpoints.py +5 -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.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/invocation/dispatcher.py +2 -24
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/invocation/scopes.py +5 -3
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/observability/formatting.py +1 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/unit_of_work/manager.py +11 -2
- python_ddd_framework-0.6.0/src/python_ddd_framework/developer_kit/templates/module/cookiecutter.json +0 -1
- python_ddd_framework-0.6.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/README.md +0 -101
- python_ddd_framework-0.6.0/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.6.0/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.6.0/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.6.0/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.6.0/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.6.0/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.6.0/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.6.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/caching/order_cache.py.jinja +0 -9
- python_ddd_framework-0.6.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/caching/statistics_cache.py.jinja +0 -9
- python_ddd_framework-0.6.0/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.6.0/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.6.0/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.6.0/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.6.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/interceptors/order_timing_interceptor.py.jinja +0 -17
- python_ddd_framework-0.6.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/module.py.jinja +0 -115
- python_ddd_framework-0.6.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/options/order_options.py.jinja +0 -7
- python_ddd_framework-0.6.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/services/order_approval_service.py.jinja +0 -65
- python_ddd_framework-0.6.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/services/order_management_service.py.jinja +0 -35
- python_ddd_framework-0.6.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/services/order_query_service.py.jinja +0 -41
- python_ddd_framework-0.6.0/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.6.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/inputs/approve_order.py.jinja +0 -6
- python_ddd_framework-0.6.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/inputs/create_order.py.jinja +0 -7
- python_ddd_framework-0.6.0/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.6.0/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.6.0/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.6.0/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.6.0/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.6.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/views/order_view.py.jinja +0 -12
- python_ddd_framework-0.6.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/entities/order.py.jinja +0 -48
- python_ddd_framework-0.6.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/events/order_changed.py.jinja +0 -13
- python_ddd_framework-0.6.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/repositories/order_repository.py.jinja +0 -17
- python_ddd_framework-0.6.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/seeding/order_seed_contributor.py.jinja +0 -22
- python_ddd_framework-0.6.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/services/order_approval_service.py.jinja +0 -23
- python_ddd_framework-0.6.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/settings/approval_settings.py.jinja +0 -17
- python_ddd_framework-0.6.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/value_objects/order_title.py.jinja +0 -10
- python_ddd_framework-0.6.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/constants/order_constants.py.jinja +0 -3
- python_ddd_framework-0.6.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/enums/order_status.py.jinja +0 -6
- python_ddd_framework-0.6.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/errors/order_errors.py.jinja +0 -11
- python_ddd_framework-0.6.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/messages/order_messages.py.jinja +0 -26
- python_ddd_framework-0.6.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/messages/order_observation.py.jinja +0 -13
- python_ddd_framework-0.6.0/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.6.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/permissions/order_permissions.py.jinja +0 -7
- python_ddd_framework-0.6.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/value_objects/money.py.jinja +0 -18
- python_ddd_framework-0.6.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/filters/export_filter.py.jinja +0 -15
- python_ddd_framework-0.6.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/models/refresh_orders.py.jinja +0 -5
- python_ddd_framework-0.6.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/module.py.jinja +0 -103
- python_ddd_framework-0.6.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/routers/order_files.py.jinja +0 -76
- python_ddd_framework-0.6.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/websockets/__init__.py.jinja +0 -1
- python_ddd_framework-0.6.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/websockets/order_socket.py.jinja +0 -44
- python_ddd_framework-0.6.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/sqlalchemy/models/order_model.py.jinja +0 -29
- python_ddd_framework-0.6.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/sqlalchemy/repositories/order_repository.py.jinja +0 -81
- python_ddd_framework-0.6.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/tests/__init__.py.jinja +0 -1
- python_ddd_framework-0.6.0/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/tests/test_domain.py.jinja +0 -19
- python_ddd_framework-0.6.0/src/python_ddd_framework/fastapi/transfer.py +0 -128
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/LICENSE +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/__init__.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/application/__init__.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/application/build_spec.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/application/builder.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/application/composition.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/application/runtime.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/application/runtime_hooks.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/application/state.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/application_services/__init__.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/application_services/bindings.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/application_services/catalog.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/application_services/contracts.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/application_services/dispatcher.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/application_services/errors.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/application_services/invocation.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/application_services/module.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/application_services/pagination.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/auditing/__init__.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/auditing/contracts.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/auditing/control.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/auditing/module.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/auditing/sqlalchemy/__init__.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/auditing/sqlalchemy/migrations/0001_auditing.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/auditing/sqlalchemy/migrations/__init__.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/auditing/sqlalchemy/models.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/auditing/sqlalchemy/module.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/auditing/sqlalchemy/store.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/authorization/__init__.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/authorization/catalog.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/authorization/contracts.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/authorization/definition_discovery.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/authorization/definitions.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/authorization/errors.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/authorization/module.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/authorization/options.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_execution/__init__.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_execution/application.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_execution/child.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_execution/contracts.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_execution/declarations.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_execution/lifecycle.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_execution/local.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_execution/locks.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_execution/management.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_execution/module.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_execution/permissions.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_execution/processes.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_jobs/__init__.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_jobs/catalog.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_jobs/contracts.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_jobs/declaration.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_jobs/errors.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_jobs/execution.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_jobs/pgqueuer/UPSTREAM_LICENSE.txt +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_jobs/pgqueuer/__init__.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_jobs/pgqueuer/enqueue.py +0 -0
- {python_ddd_framework-0.6.0 → 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.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_jobs/pgqueuer/migrations/__init__.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_jobs/pgqueuer/module.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_jobs/pgqueuer/options.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_jobs/pgqueuer/runtime.py +0 -0
- {python_ddd_framework-0.6.0 → 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.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_jobs/pgqueuer/supervision.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_workers/__init__.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_workers/catalog.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_workers/contracts.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_workers/errors.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_workers/execution.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/background_workers/runtime.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/caching/__init__.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/caching/contracts.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/caching/errors.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/caching/module.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/caching/naming.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/caching/options.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/caching/unit_of_work.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/cli/__init__.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/cli/development.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/cli/errors.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/cli/inspection.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/cli/project.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/cli/runtime.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/configuration/__init__.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/configuration/composition.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/configuration/contracts.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/configuration/dotenv_source.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/configuration/environment_source.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/configuration/immutability.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/configuration/input_shape.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/configuration/merge.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/configuration/root.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/configuration/sources.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/configuration/values.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/configuration/yaml_source.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/__init__.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/project_metadata.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/publication.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/source.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/templates/basic/cookiecutter.json +0 -0
- {python_ddd_framework-0.6.0 → 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.6.0 → 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.6.0 → 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.6.0 → 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.6.0 → 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.6.0 → 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.6.0 → 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.6.0 → 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.6.0 → 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.6.0 → 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.6.0/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.6.0/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.6.0/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.6.0/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.6.0/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.6.0/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.6.0/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.6.0/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.6.0/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.6.0 → 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.6.0/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.6.0/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.6.0 → 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.6.0/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.6.0/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.6.0 → 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.6.0/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.6.0/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.6.0/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.6.0/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.6.0/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.6.0/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.6.0/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.6.0 → 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.6.0/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.6.0/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.6.0/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.6.0/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.6.0/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.6.0 → 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.6.0 → 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.6.0/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.6.0/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.6.0/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.6.0/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.6.0 → 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.6.0 → 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.6.0 → 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.6.0 → 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.6.0 → 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.6.0/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.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/templates/project/cookiecutter.json +0 -0
- {python_ddd_framework-0.6.0 → 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.6.0 → 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.6.0 → 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.6.0 → 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.6.0 → 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.6.0 → 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.6.0 → 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.6.0 → 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.6.0 → 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.6.0 → 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.6.0 → 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.6.0 → 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.6.0 → 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.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/developer_kit/wiring.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/diagnostics/__init__.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/diagnostics/journal.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/diagnostics/model.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/diagnostics/source.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/distributed_lock/__init__.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/distributed_lock/contracts.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/distributed_lock/options.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/domain/__init__.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/domain/aggregates.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/domain/entities.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/domain/errors.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/domain/event_values.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/domain/services.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/domain/value_objects.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/errors/__init__.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/errors/base.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/errors/business.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/errors/configuration.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/errors/diagnostics.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/errors/lifecycle.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/errors/modularity.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/errors/services.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/events/__init__.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/events/aggregate.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/events/catalog.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/events/contracts.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/events/contribution.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/events/discovery.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/events/entities.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/events/errors.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/events/module.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/events/runtime.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/events/subscription.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/events/unit_of_work.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/extensions/__init__.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/extensions/catalog.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/extensions/contracts.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/extensions/models.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/extensions/module.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/adapter.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/application_services.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/background.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/contracts.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/error_handlers.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/errors.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/filters.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/health.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/http.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/http_router.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/middleware.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/parameters.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/realtime/__init__.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/realtime/connection.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/realtime/module.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/route_integrity.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/service_routes.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/settings.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/tracing.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/upload_limits.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/fastapi/uploads.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/hosted_services/__init__.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/hosted_services/bridge.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/hosted_services/catalog.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/hosted_services/contracts.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/hosted_services/declarations.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/hosted_services/errors.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/hosted_services/module.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/hosted_services/options.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/hosted_services/runtime.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/hosted_services/state.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/hosting/__init__.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/hosting/instance.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/identity/__init__.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/identity/application.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/identity/contracts.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/identity/domain_rules.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/identity/dtos.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/identity/errors.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/identity/extensions.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/identity/http_api.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/identity/management.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/identity/models.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/identity/module.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/identity/options.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/identity/passwords.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/identity/permissions.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/identity/seeding.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/identity/services.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/identity/sqlalchemy/__init__.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/identity/sqlalchemy/migrations/0001_identity.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/identity/sqlalchemy/migrations/0002_physical_delete.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/identity/sqlalchemy/migrations/0003_extra_properties.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/identity/sqlalchemy/migrations/0004_concurrency_version.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/identity/sqlalchemy/migrations/__init__.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/identity/sqlalchemy/models.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/identity/sqlalchemy/module.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/identity/sqlalchemy/repository.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/identity/sqlalchemy/session_security.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/identity/sqlalchemy/stores.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/identity/stores.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/identity/tokens.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/invocation/__init__.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/invocation/arguments.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/invocation/callables.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/invocation/contracts.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/invocation/contribution.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/invocation/entries.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/invocation/entrypoints.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/invocation/execution.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/invocation/function_runtime.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/invocation/interception.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/invocation/interceptors.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/invocation/managed_proxy.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/invocation/managed_services.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/invocation/methods.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/invocation/module.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/invocation/policies.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/invocation/runtime.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/invocation/signature.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/invocation/validation.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/lifecycle/__init__.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/lifecycle/composition.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/lifecycle/context.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/lifecycle/participants.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/lifecycle/runtime.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/lifecycle/state.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/messaging/__init__.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/messaging/channel.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/messaging/contracts.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/messaging/module.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/messaging/options.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/messaging/receipt.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/messaging/runtime.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/modularity/__init__.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/modularity/contracts.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/modularity/discovery.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/modularity/graph.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/modularity/registry.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/modularity/selection.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/notifications/__init__.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/notifications/catalog.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/notifications/contracts.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/notifications/declarations.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/notifications/module.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/observability/__init__.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/observability/context.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/observability/export.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/observability/logging.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/observability/options.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/observability/tracing.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/options/__init__.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/options/aliases.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/options/contribution.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/options/immutability.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/options/input_keys.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/options/issues.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/options/models.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/options/registry.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/options/schema.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/options/validation.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/py.typed +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/realtime/__init__.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/realtime/contracts.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/realtime/diagnostics.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/realtime/messages.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/redis/__init__.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/redis/cache.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/redis/cache_scripts.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/redis/distributed_lock.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/redis/lease_lock.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/redis/module.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/redis/notification_runtime.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/redis/notifications.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/redis/options.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/redis/runtime.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/seeding/__init__.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/seeding/contracts.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/seeding/module.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/seeding/runtime.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/services/__init__.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/services/arbitration.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/services/binding.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/services/composition.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/services/contribution.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/services/convention.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/services/convention_contracts.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/services/exposure.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/services/fixed_lifetime.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/services/framework_provider.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/services/native_graph.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/services/provider.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/services/registration.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/services/relocation.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/services/repository.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/services/runtime.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/__init__.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/application.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/binding.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/catalog.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/changes.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/contracts.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/declarations.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/definition_discovery.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/definitions.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/errors.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/handlers.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/management.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/manager.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/module.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/notifications.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/permissions.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/provider.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/refresh.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/refresh_module.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/sqlalchemy/__init__.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/sqlalchemy/migrations/0001_settings.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/sqlalchemy/migrations/0002_physical_delete.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/sqlalchemy/migrations/0003_version_tokens.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/sqlalchemy/migrations/__init__.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/sqlalchemy/models.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/sqlalchemy/module.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/sqlalchemy/store.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/store.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/settings/values.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/sqlalchemy/__init__.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/sqlalchemy/alembic_runtime/__init__.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/sqlalchemy/alembic_runtime/env.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/sqlalchemy/alembic_runtime/script.py.mako +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/sqlalchemy/auditing.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/sqlalchemy/errors.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/sqlalchemy/extensions.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/sqlalchemy/metadata.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/sqlalchemy/metadata_builder.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/sqlalchemy/metadata_fingerprint.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/sqlalchemy/metadata_ownership.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/sqlalchemy/migration.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/sqlalchemy/migration_operations.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/sqlalchemy/migration_options.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/sqlalchemy/migration_sources.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/sqlalchemy/module.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/sqlalchemy/module_migration.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/sqlalchemy/options.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/sqlalchemy/repository.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/sqlalchemy/runtime.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/sqlalchemy/session_provider.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/sqlalchemy/unit_of_work.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/testing/__init__.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/testing/runtime.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/unit_of_work/__init__.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/unit_of_work/contracts.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/unit_of_work/errors.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/unit_of_work/lifecycle.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/unit_of_work/module.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/unit_of_work/options.py +0 -0
- {python_ddd_framework-0.6.0 → python_ddd_framework-0.7.0}/src/python_ddd_framework/validation/__init__.py +0 -0
- {python_ddd_framework-0.6.0 → 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
|
|
@@ -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
|
|
|
@@ -295,6 +300,22 @@ The image uses `python -m host.main` without development reload. Runtime install
|
|
|
295
300
|
|
|
296
301
|
<a id="版本与升级"></a>
|
|
297
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
|
+
|
|
298
319
|
## Capability module migration (0.4)
|
|
299
320
|
|
|
300
321
|
Capability composition now uses the same `AppModule` model as customer modules. Existing applications must migrate their declarations together; there is no compatibility path.
|
|
@@ -452,7 +473,7 @@ Channels that must accept these callbacks declare `stopping_owners=(ServiceType,
|
|
|
452
473
|
|
|
453
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.
|
|
454
475
|
|
|
455
|
-
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.
|
|
456
477
|
|
|
457
478
|
<a id="框架更名迁移未发布"></a>
|
|
458
479
|
|
|
@@ -541,7 +562,7 @@ The engineering guides below are maintained in Chinese in the private GitHub rep
|
|
|
541
562
|
| Check release evidence and remaining validation limits | [Status and validation](https://github.com/componet-architecture/python-ddd-framework/blob/main/docs/status.md) |
|
|
542
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#重构的最短阅读路径) |
|
|
543
564
|
|
|
544
|
-
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.
|
|
545
566
|
|
|
546
567
|
## License
|
|
547
568
|
|
|
@@ -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
|
|
|
@@ -251,6 +256,22 @@ The image uses `python -m host.main` without development reload. Runtime install
|
|
|
251
256
|
|
|
252
257
|
<a id="版本与升级"></a>
|
|
253
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
|
+
|
|
254
275
|
## Capability module migration (0.4)
|
|
255
276
|
|
|
256
277
|
Capability composition now uses the same `AppModule` model as customer modules. Existing applications must migrate their declarations together; there is no compatibility path.
|
|
@@ -408,7 +429,7 @@ Channels that must accept these callbacks declare `stopping_owners=(ServiceType,
|
|
|
408
429
|
|
|
409
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.
|
|
410
431
|
|
|
411
|
-
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.
|
|
412
433
|
|
|
413
434
|
<a id="框架更名迁移未发布"></a>
|
|
414
435
|
|
|
@@ -497,7 +518,7 @@ The engineering guides below are maintained in Chinese in the private GitHub rep
|
|
|
497
518
|
| Check release evidence and remaining validation limits | [Status and validation](https://github.com/componet-architecture/python-ddd-framework/blob/main/docs/status.md) |
|
|
498
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#重构的最短阅读路径) |
|
|
499
520
|
|
|
500
|
-
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.
|
|
501
522
|
|
|
502
523
|
## License
|
|
503
524
|
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"""所有调用与持续访问边界共用的授权规则;不拥有传输或调用 scope。"""
|
|
2
|
+
|
|
3
|
+
from collections.abc import Callable
|
|
4
|
+
|
|
5
|
+
from dishka import AsyncContainer
|
|
6
|
+
from dishka.exceptions import NoFactoryError
|
|
7
|
+
|
|
8
|
+
from ..options import Options
|
|
9
|
+
from .contracts import CurrentUser, PermissionChecker, _AuthorizationRequirement
|
|
10
|
+
from .errors import PermissionCheckerUnavailableError, PermissionDeniedError, UnauthenticatedError
|
|
11
|
+
from .options import AuthorizationOptions
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
async def _check_authorization(
|
|
15
|
+
container: AsyncContainer,
|
|
16
|
+
get_user: Callable[[], CurrentUser],
|
|
17
|
+
requirement: _AuthorizationRequirement,
|
|
18
|
+
) -> None:
|
|
19
|
+
if requirement.allows_anonymous or not requirement.requires_authenticated_user:
|
|
20
|
+
return
|
|
21
|
+
if (await container.get(Options[AuthorizationOptions])).value.always_allow:
|
|
22
|
+
return
|
|
23
|
+
# 认证阶段也可调用无需授权的服务;只有实际校验身份时才读取最终 CurrentUser。
|
|
24
|
+
user = get_user()
|
|
25
|
+
if not user.is_authenticated:
|
|
26
|
+
raise UnauthenticatedError
|
|
27
|
+
if not requirement.permissions:
|
|
28
|
+
return
|
|
29
|
+
try:
|
|
30
|
+
checker = await container.get(PermissionChecker)
|
|
31
|
+
except NoFactoryError:
|
|
32
|
+
raise PermissionCheckerUnavailableError from None
|
|
33
|
+
for permission in requirement.permissions:
|
|
34
|
+
if not await checker.is_granted(user, permission):
|
|
35
|
+
raise PermissionDeniedError(permission=str(permission))
|
|
@@ -219,15 +219,6 @@ def _add_module(
|
|
|
219
219
|
)
|
|
220
220
|
return
|
|
221
221
|
context = {"module_name": package, "class_prefix": class_prefix}
|
|
222
|
-
if template == "ddd":
|
|
223
|
-
from ..fastapi.service_routes import _operation_id, _service_path
|
|
224
|
-
|
|
225
|
-
# HTTP 身份由正式约定推导;basic 不读取或生成传输层配置。
|
|
226
|
-
http_identity = type(class_prefix + "ApplicationService", (), {})
|
|
227
|
-
context.update(
|
|
228
|
-
http_service_path=_service_path("", http_identity),
|
|
229
|
-
http_operation_prefix=_operation_id(http_identity, ""),
|
|
230
|
-
)
|
|
231
222
|
with publication.step("render"):
|
|
232
223
|
staged = _render(
|
|
233
224
|
"basic" if template == "basic" else "module", context, staging=publication.rendering
|
python_ddd_framework-0.7.0/src/python_ddd_framework/developer_kit/templates/module/cookiecutter.json
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"module_name": "capability", "class_prefix": "Capability"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# {{ cookiecutter.class_prefix }} module
|
|
2
|
+
|
|
3
|
+
This is a DDD module skeleton. It has no business rules, entities, DTOs, services, endpoints, database tables, seed data, background tasks, or test cases. The Host selects its Application, SQLAlchemy, and HttpApi Modules; infrastructure providers remain Host-owned.
|
|
4
|
+
|
|
5
|
+
[Project setup](../../../../README.md) · [Working rules](../../../../AGENTS.md) · [Architecture](../../../../docs/architecture.md) · [Design checks](../../../../docs/development.md#design-and-delivery-checks) · [Directory rules](../../../../docs/development.md#module-layout-and-coding-rules)
|
|
6
|
+
|
|
7
|
+
## Record the business responsibility
|
|
8
|
+
|
|
9
|
+
Before implementation, record the confirmed capability, caller, business language, public contracts, and data owner here. For each invariant, identify its aggregate or service owner, business operation, and a concrete rejection example. Record consistency, concurrency, idempotency, failure-after-commit, and collaboration decisions when relevant. Unresolved questions remain explicit; directory names and documentation recipes do not authorize business rules.
|
|
10
|
+
|
|
11
|
+
Keep this README current with the implementation and its actual verification. A small correction may reference existing conclusions rather than creating another design document.
|
|
12
|
+
|
|
13
|
+
## Layers and initial wiring
|
|
14
|
+
|
|
15
|
+
| Layer | Responsibility and current state |
|
|
16
|
+
| --- | --- |
|
|
17
|
+
| `domain_shared` | Shared contract values, constants, errors, permissions, and messages. No business declarations or framework capability dependencies yet. |
|
|
18
|
+
| `domain` | Aggregates, domain services, repository contracts, events, settings, and seed contributors. Depends on DomainShared; it contains no business implementation. |
|
|
19
|
+
| `application_contracts` | Public service Protocols and input/output DTOs. Depends on DomainShared; contracts do not depend on Domain or implementations. |
|
|
20
|
+
| `application` | Use-case orchestration and handlers. Depends on Domain and ApplicationContracts; its package is scanned but has no services or task declarations. |
|
|
21
|
+
| `sqlalchemy` | Persistence implementations and owned migrations. Depends on Domain and SqlAlchemyPersistenceModule; it retains its Base, model discovery, repository scanning, and migration registration. |
|
|
22
|
+
| `http_api` | Transport declarations. Depends on FastApiModule and exposes this module's contracts; empty contracts produce no business endpoints. |
|
|
23
|
+
|
|
24
|
+
All responsibility directories and package markers are retained for navigation. Add implementations only for authorized requirements; do not fill them with placeholder interfaces or services. `module.py` owns dependencies, registration, and the seven lifecycle hooks. Empty hooks use `pass`; package markers contain no business or compatibility exports. `tests/` initially contains only its package marker.
|
|
25
|
+
|
|
26
|
+
## Implement the first use case
|
|
27
|
+
|
|
28
|
+
1. Identify **owner -> layer -> directory -> verified framework API**, following the project design checks. Add shared values only when they are actually shared.
|
|
29
|
+
2. Model aggregate transitions and invariants in Domain. Define domain-facing repositories without ORM or Session types. Add public DTOs and service Protocols in ApplicationContracts, then implement the authorized use case in Application.
|
|
30
|
+
3. Declare the framework capability dependencies where used: for example, ApplicationServicesModule for application services, AuthorizationModule for permission definitions, or DataSeedingModule for seed contributors. The Host's provider choices do not repair missing module dependencies.
|
|
31
|
+
4. Implement persistence under `sqlalchemy/models` and `sqlalchemy/repositories`. The existing [Base](sqlalchemy/models/base.py) and [registration](sqlalchemy/module.py) own this module's metadata and migration branch. Business models, tables, and schema decisions must come from requirements.
|
|
32
|
+
5. Conventional HTTP exposure can discover the new public service contracts. Add manual routers only where the transport requires them; keep use-case rules out of HTTP. Register workers, jobs, hosted services, schedules, or event handlers explicitly when required.
|
|
33
|
+
6. Update this responsibility record and run the smallest relevant existing checks. New tests and infrastructure validation require the task's authorization; neither an empty test directory nor successful composition proves business correctness.
|
|
34
|
+
|
|
35
|
+
## Persistence and verification
|
|
36
|
+
|
|
37
|
+
An empty skeleton retains model and migration registration but has no business tables or revisions. Migration commands still use the configured database; an empty registered Base is different from a module with no model registration. Add actual models before generating a business revision, and review it before applying:
|
|
38
|
+
|
|
39
|
+
```sh
|
|
40
|
+
pddd db revision --module {{ cookiecutter.module_name }}
|
|
41
|
+
pddd db upgrade --module {{ cookiecutter.module_name }}
|
|
42
|
+
pddd db status --module {{ cookiecutter.module_name }}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Run `pddd db seed --module {{ cookiecutter.module_name }}` only after declaring the intended contributors and preparing their database. Keep applied revisions immutable and upgrade prerequisites explicitly. Host startup never migrates or seeds.
|
|
46
|
+
|
|
47
|
+
Run installed `pddd` commands from any application directory. Run native tools from `backend/`:
|
|
48
|
+
|
|
49
|
+
```sh
|
|
50
|
+
uv build --no-sources
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
After authorized test cases exist, run `uv run pytest src/modules/{{ cookiecutter.module_name }}/tests`. The empty skeleton has no tests to pass. Host tests cover generic health and identity and require their configured infrastructure; see the project verification guide. Module tests are excluded from production wheels and service discovery. The `basic` template remains available for an ordinary in-process service without DDD layers.
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"""应用层拥有用例编排;按真实业务需要声明能力依赖,provider 由 Host 选择。"""
|
|
2
|
+
|
|
3
|
+
from modules.{{ cookiecutter.module_name }}.domain.module import {{ cookiecutter.class_prefix }}DomainModule
|
|
4
|
+
from modules.{{ cookiecutter.module_name }}.application_contracts.module import {{ cookiecutter.class_prefix }}ApplicationContractsModule
|
|
5
|
+
|
|
6
|
+
from python_ddd_framework import (
|
|
7
|
+
AppModule,
|
|
8
|
+
ConfigureContext,
|
|
9
|
+
InitializeContext,
|
|
10
|
+
PostConfigureContext,
|
|
11
|
+
PostInitializeContext,
|
|
12
|
+
PreConfigureContext,
|
|
13
|
+
PreInitializeContext,
|
|
14
|
+
ShutdownContext,
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class {{ cookiecutter.class_prefix }}ApplicationModule(AppModule):
|
|
19
|
+
dependencies = ({{ cookiecutter.class_prefix }}DomainModule, {{ cookiecutter.class_prefix }}ApplicationContractsModule)
|
|
20
|
+
scan_packages = (__package__,)
|
|
21
|
+
|
|
22
|
+
def pre_configure(self, context: PreConfigureContext) -> None:
|
|
23
|
+
# 贡献影响后续注册的 PreOptions;此阶段不启动资源。
|
|
24
|
+
pass
|
|
25
|
+
|
|
26
|
+
def configure(self, context: ConfigureContext) -> None:
|
|
27
|
+
# 注册服务和普通 Options;业务执行留在所属能力。
|
|
28
|
+
pass
|
|
29
|
+
|
|
30
|
+
def post_configure(self, context: PostConfigureContext) -> None:
|
|
31
|
+
# 读取已冻结 PreOptions,补充 Options 或覆盖已有服务注册。
|
|
32
|
+
pass
|
|
33
|
+
|
|
34
|
+
async def pre_initialize(self, context: PreInitializeContext) -> None:
|
|
35
|
+
# 异步初始化前置条件;依赖模块在同一阶段先完成。
|
|
36
|
+
pass
|
|
37
|
+
|
|
38
|
+
async def initialize(self, context: InitializeContext) -> None:
|
|
39
|
+
# 初始化本模块资源;不手工启动框架管理的 Worker 或 HostedService。
|
|
40
|
+
pass
|
|
41
|
+
|
|
42
|
+
async def post_initialize(self, context: PostInitializeContext) -> None:
|
|
43
|
+
# 完成初始化收尾;应用此时尚未对外就绪。
|
|
44
|
+
pass
|
|
45
|
+
|
|
46
|
+
async def shutdown(self, context: ShutdownContext) -> None:
|
|
47
|
+
# 逆依赖关闭本模块拥有的资源;返回前等待清理结束。
|
|
48
|
+
pass
|
|
@@ -4,8 +4,6 @@ from modules.{{ cookiecutter.module_name }}.domain_shared.module import {{ cooki
|
|
|
4
4
|
|
|
5
5
|
from python_ddd_framework import (
|
|
6
6
|
AppModule,
|
|
7
|
-
SettingsModule,
|
|
8
|
-
DataSeedingModule,
|
|
9
7
|
ConfigureContext,
|
|
10
8
|
InitializeContext,
|
|
11
9
|
PostConfigureContext,
|
|
@@ -17,7 +15,7 @@ from python_ddd_framework import (
|
|
|
17
15
|
|
|
18
16
|
|
|
19
17
|
class {{ cookiecutter.class_prefix }}DomainModule(AppModule):
|
|
20
|
-
dependencies = ({{ cookiecutter.class_prefix }}DomainSharedModule,
|
|
18
|
+
dependencies = ({{ cookiecutter.class_prefix }}DomainSharedModule,)
|
|
21
19
|
scan_packages = (__package__,)
|
|
22
20
|
|
|
23
21
|
def pre_configure(self, context: PreConfigureContext) -> None:
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
"""
|
|
1
|
+
"""共享层拥有跨层契约值;按实际声明增加能力依赖,不预设业务规则。"""
|
|
2
2
|
|
|
3
3
|
from python_ddd_framework import (
|
|
4
4
|
AppModule,
|
|
5
|
-
AuthorizationModule,
|
|
6
5
|
ConfigureContext,
|
|
7
6
|
InitializeContext,
|
|
8
7
|
PostConfigureContext,
|
|
@@ -14,7 +13,7 @@ from python_ddd_framework import (
|
|
|
14
13
|
|
|
15
14
|
|
|
16
15
|
class {{ cookiecutter.class_prefix }}DomainSharedModule(AppModule):
|
|
17
|
-
dependencies = (
|
|
16
|
+
dependencies = ()
|
|
18
17
|
scan_packages = (__package__,)
|
|
19
18
|
|
|
20
19
|
def pre_configure(self, context: PreConfigureContext) -> None:
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"""HTTP 仅暴露本模块公开契约;空契约不产生业务端点。"""
|
|
2
|
+
|
|
3
|
+
from modules.{{ cookiecutter.module_name }}.application_contracts.module import {{ cookiecutter.class_prefix }}ApplicationContractsModule
|
|
4
|
+
|
|
5
|
+
from python_ddd_framework import (
|
|
6
|
+
AppModule,
|
|
7
|
+
ConfigureContext,
|
|
8
|
+
InitializeContext,
|
|
9
|
+
PostConfigureContext,
|
|
10
|
+
PostInitializeContext,
|
|
11
|
+
PreConfigureContext,
|
|
12
|
+
PreInitializeContext,
|
|
13
|
+
ShutdownContext,
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
from python_ddd_framework.fastapi import FastApiModule, exposes_application_services
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@exposes_application_services({{ cookiecutter.class_prefix }}ApplicationContractsModule)
|
|
20
|
+
class {{ cookiecutter.class_prefix }}HttpApiModule(AppModule):
|
|
21
|
+
dependencies = (FastApiModule,)
|
|
22
|
+
|
|
23
|
+
def pre_configure(self, context: PreConfigureContext) -> None:
|
|
24
|
+
# 贡献影响后续注册的 PreOptions;此阶段不启动资源。
|
|
25
|
+
pass
|
|
26
|
+
|
|
27
|
+
def configure(self, context: ConfigureContext) -> None:
|
|
28
|
+
# 注册服务和普通 Options;业务执行留在所属能力。
|
|
29
|
+
pass
|
|
30
|
+
|
|
31
|
+
def post_configure(self, context: PostConfigureContext) -> None:
|
|
32
|
+
# 读取已冻结 PreOptions,补充 Options 或覆盖已有服务注册。
|
|
33
|
+
pass
|
|
34
|
+
|
|
35
|
+
async def pre_initialize(self, context: PreInitializeContext) -> None:
|
|
36
|
+
# 异步初始化前置条件;依赖模块在同一阶段先完成。
|
|
37
|
+
pass
|
|
38
|
+
|
|
39
|
+
async def initialize(self, context: InitializeContext) -> None:
|
|
40
|
+
# 初始化本模块资源;不手工启动框架管理的 Worker 或 HostedService。
|
|
41
|
+
pass
|
|
42
|
+
|
|
43
|
+
async def post_initialize(self, context: PostInitializeContext) -> None:
|
|
44
|
+
# 完成初始化收尾;应用此时尚未对外就绪。
|
|
45
|
+
pass
|
|
46
|
+
|
|
47
|
+
async def shutdown(self, context: ShutdownContext) -> None:
|
|
48
|
+
# 逆依赖关闭本模块拥有的资源;返回前等待清理结束。
|
|
49
|
+
pass
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"""provider 依赖领域契约;Host 显式选择此实现。"""
|
|
2
2
|
|
|
3
3
|
from modules.{{ cookiecutter.module_name }}.domain.module import {{ cookiecutter.class_prefix }}DomainModule
|
|
4
|
-
from modules.{{ cookiecutter.module_name }}.domain_shared.constants.order_constants import MODULE_NAME
|
|
5
4
|
from modules.{{ cookiecutter.module_name }}.sqlalchemy.models.base import {{ cookiecutter.class_prefix }}Base
|
|
6
5
|
|
|
7
6
|
from python_ddd_framework import (
|
|
@@ -26,7 +25,7 @@ from python_ddd_framework.sqlalchemy import (
|
|
|
26
25
|
models_package=__package__ + ".models",
|
|
27
26
|
metadata={{ cookiecutter.class_prefix }}Base.metadata,
|
|
28
27
|
migrations_package=__package__ + ".migrations",
|
|
29
|
-
branch_label=
|
|
28
|
+
branch_label="{{ cookiecutter.module_name }}",
|
|
30
29
|
)
|
|
31
30
|
)
|
|
32
31
|
class {{ cookiecutter.class_prefix }}SqlAlchemyModule(AppModule):
|
|
@@ -5,17 +5,19 @@ These instructions apply to this application and its business modules. Follow th
|
|
|
5
5
|
## Start with the affected capability
|
|
6
6
|
|
|
7
7
|
1. Check the branch, worktree, requested outcome, and existing changes before editing. Analysis and review requests are read-only unless implementation is requested.
|
|
8
|
-
2.
|
|
8
|
+
2. Read the applicable project requirements and accepted decisions, then [architecture](docs/architecture.md) for ownership and dependencies and the relevant section of [development](docs/development.md) for framework usage. Use [README](README.md) for setup and operations. This reading order is required before implementation; reuse existing conclusions for a small change.
|
|
9
9
|
3. Before changing a business module, read its `backend/src/modules/<name>/README.md`, then inspect the affected source and direct callers. Use the workflow below to choose the layer and responsibility directory. Expand the investigation only when those facts reveal another affected boundary.
|
|
10
|
-
4. Read versions and dependencies from `backend/pyproject.toml` and exact resolutions from `backend/uv.lock`. Follow [installed framework lookup](docs/development.md#match-the-installed-framework) for the actual package, bundled examples, and
|
|
10
|
+
4. Read versions and dependencies from `backend/pyproject.toml` and exact resolutions from `backend/uv.lock`. Follow [installed framework lookup](docs/development.md#match-the-installed-framework) for the actual package, bundled examples, CLI, and any user-provided source reference. Check the consumed artifact before relying on a checkout; equal version numbers do not prove identical contents. Generated guidance records the template version; upgrades do not update it automatically.
|
|
11
11
|
|
|
12
12
|
Python code, metadata, configuration, environment, and deployment files belong under `backend/`. Root `scripts/` contains consumer-owned scripts. Run installed `pddd` commands from any directory in the application; run native uv/build/test and Docker commands from `backend/`.
|
|
13
13
|
|
|
14
|
+
Use the [official CLI entry points](docs/development.md#cli-operations) for operations it provides, including project/module generation, development startup, infrastructure preparation, migrations, seeding, and inspection. Do not replace them with handwritten generation or direct calls to migration/seed internals. Build and test still use native tools.
|
|
15
|
+
|
|
14
16
|
## Work from business rules to framework code
|
|
15
17
|
|
|
16
|
-
1. Describe the requested use case in business terms: caller, command or query, expected outcome, allowed state changes, and failure conditions. Reuse the module's recorded language and rules. The
|
|
18
|
+
1. Describe the requested use case in business terms: caller, command or query, expected outcome, allowed state changes, and failure conditions. Reuse the module's recorded language and rules. The DDD skeleton supplies structure without business rules; documentation recipes are illustrations, and actual requirements come from the application.
|
|
17
19
|
2. For a domain change, identify the rule owner, aggregate boundary, consistency needs, and collaboration with other modules using [business-change planning](docs/development.md#plan-a-business-change). Keep confirmed decisions in the owning module README. Ask about missing rules that affect correctness; label proposals and open questions instead of presenting assumptions as approved rules.
|
|
18
|
-
3.
|
|
20
|
+
3. Before the first edit, identify **Owner -> layer -> target directory -> verified framework API**, with the relevant requirement and source/example evidence, using the [design and delivery checks](docs/development.md#design-and-delivery-checks). Choose the existing `basic` or `ddd` layout using the [directory rules](docs/development.md#module-layout-and-coding-rules), then map needed capabilities through the [framework selection table](docs/development.md#choose-a-framework-capability). Check the installed API, Module declarations, and existing usage before implementing. Mark an API check as not applicable when appropriate; do not invent an abstraction to fill the record.
|
|
19
21
|
4. Implement the authorized use case through its public contract, domain behavior, and existing persistence/invocation boundaries. Reuse existing validation and [verification commands](docs/development.md#verification); state which domain rules, composition paths, and infrastructure behavior the checks actually cover. Scale this process to the change: a local correction can reuse the existing model directly.
|
|
20
22
|
|
|
21
23
|
## Preserve ownership and contracts
|
|
@@ -24,22 +26,24 @@ Python code, metadata, configuration, environment, and deployment files belong u
|
|
|
24
26
|
- Domain and application contracts stay independent of Host, HTTP, and persistence implementations. Cross-module calls use explicitly declared dependencies and public contracts; do not access another module's implementation, ORM models, or tables directly.
|
|
25
27
|
- Use framework application services, repositories, Options, permissions, units of work, events, jobs, and lifecycle hooks before adding custom infrastructure. Do not introduce a parallel DI container, service locator, transaction manager, or wrapper without a missing business capability.
|
|
26
28
|
- Keep public contracts, mutable state, orchestration, and external I/O under clear owners. Split for independent responsibilities, not a fixed line count. Avoid generic `common`, `utils`, or `helpers` collections and speculative abstractions.
|
|
27
|
-
-
|
|
29
|
+
- If requirements, accepted decisions, documented responsibilities/contracts, an approved plan, or implementation conflict, pause affected edits and commits. Present both statements with file locations, current behavior, impact, and the decision needed from the user. Obtain an explicit ruling before proceeding; silence or a general instruction to continue does not resolve an unstated boundary change. Never rewrite documentation to retroactively authorize an incorrect implementation.
|
|
28
30
|
- Confirm changes to dependencies, public contracts, persistent data, external protocols, or deployment infrastructure when they extend beyond the requested task. Internal simplification does not authorize breaking consumers or stored data.
|
|
29
31
|
|
|
30
|
-
Use the documented responsibility directories for every new capability. Propose a standards change before adding a responsibility category or changing dependency direction. The `ddd` template intentionally
|
|
32
|
+
Use the documented responsibility directories for every new capability. Propose a standards change before adding a responsibility category or changing dependency direction. The `ddd` template intentionally retains the full responsibility directories, package markers, Module hooks, ORM Base, and model/migration registration. It generates no business implementations or test cases; this directory exception applies to DDD templates and generated projects, not speculative framework runtime layers. The `basic` template generates only package markers, `module.py`, `contracts/conversion_service.py`, `services/default_conversion_service.py`, and its README. It uses ordinary transient DI, without Domain, persistence, HTTP, interception, or empty layers. Keep `module.py` limited to dependencies, registration, and lifecycle hooks, and keep package `__init__.py` free of business code and compatibility exports.
|
|
31
33
|
|
|
32
34
|
## Enforce DDD rules
|
|
33
35
|
|
|
34
36
|
For a modeled domain capability, apply the [mandatory DDD rules](docs/architecture.md#mandatory-ddd-rules) during implementation and review. Reject application code that assigns aggregate business state directly, writes aggregate children outside the root's business operations, or leaks ORM/Session types through domain repository contracts. Before a cross-aggregate write, record its consistency, failure, and idempotency decisions. Keep each changed invariant's owner, operation, and rejection example in the module README and verify them with the [business-change checks](docs/development.md#check-a-domain-change). These rules do not require a `basic` service to acquire unused DDD layers.
|
|
35
37
|
|
|
38
|
+
Code and architecture changes must also satisfy the [seven design principles](docs/architecture.md#mandatory-design-principles). Review the applicable principles, DDD boundaries, imports, contracts, state ownership, and resource lifetimes on the final diff. Follow the [delivery checks](docs/development.md#design-and-delivery-checks) and cite actual evidence. Correct confirmed violations within the authorized scope or report the blocking decision; passing builds/tests alone cannot justify completion. These requirements do not authorize new business rules, dependencies, tests, automated gates, infrastructure, or framework changes.
|
|
39
|
+
|
|
36
40
|
## Use the framework safely
|
|
37
41
|
|
|
38
42
|
- Extend only explicitly opened targets. Keep typed properties in application contracts, optional SQL mappings and local extension revisions in persistence, and reuse the same declaration for validation, OpenAPI, and storage. Never mutate shared DTO/ORM classes or duplicate the base table/Schema owner; extension migrations declare Alembic prerequisites explicitly.
|
|
39
43
|
|
|
40
44
|
- Invoke application services through their injected public contracts or the framework functions `invoke(application, ...)` / `call(application, ...)`. Manual construction and self-calls do not create a new managed invocation.
|
|
41
45
|
- Ordinary DI services opt into interception with `@unit_of_work`, `@authorize`, or `ValidationEnabled`; declare the corresponding capability dependency on their owning Module. Keep marked methods async instance methods and preserve native scope/cache. These declarations do not add HTTP exposure or require ApplicationService inheritance.
|
|
42
|
-
- Keep transactions short. Never carry a Session
|
|
46
|
+
- Keep transactions short. Never carry a business Session or UoW across a network wait or stream `yield`, or transfer execution scopes into ordinary child tasks or external threads. Managed HTTP streaming retains only its transport-owned REQUEST until cleanup; follow the [streaming boundaries](docs/architecture.md#http-streaming-and-continuous-access) and [complete example](docs/development.md#http-generators-and-continuous-access).
|
|
43
47
|
- Keep aggregate rules and optimistic concurrency checks intact. Construct aggregate events from frozen records and stable nested values as described in [architecture](docs/architecture.md#calls-scopes-and-transactions). Use repository operations to stage changes and collect events; do not publish the same aggregate events twice.
|
|
44
48
|
- Review generated migrations. Do not edit applied revisions, bypass migration guards, or treat Host startup as migration or seeding.
|
|
45
49
|
- Keep background side effects idempotent. Local events and WebSocket messages do not provide durable distributed delivery; distributed locks do not replace database concurrency or idempotency.
|
|
@@ -62,7 +66,7 @@ and message examples in the project development guide.
|
|
|
62
66
|
## Verify and maintain
|
|
63
67
|
|
|
64
68
|
- Preserve unrelated changes. Do not edit the installed framework, generated dependency files by hand, or another repository to make an application change pass.
|
|
65
|
-
- Use the smallest relevant existing checks
|
|
69
|
+
- Use the smallest relevant existing checks and authorized build. New test files, cases, or test dependencies require explicit approval; explain their scope and verification benefit first. Read fixtures before running infrastructure tests and keep them within the task's authorization. See [verification](docs/development.md#verification) for available commands.
|
|
66
70
|
- Distinguish source checks, unit tests, real infrastructure tests, and distribution validation. Report actual results and anything not verified; never claim success from a mock or an unexecuted command.
|
|
67
71
|
- Update the owning module README when business rules or public behavior change. Update architecture for dependency or ownership changes, development for usage changes, and README for setup or operations changes. Replace outdated statements rather than appending a work log.
|
|
68
72
|
- Documentation guides development; it is not an executable architecture gate. Use type checks and appropriate boundary tests when the project has them.
|