python-ddd-framework 0.5.1__tar.gz → 0.7.0__tar.gz

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