python-ddd-framework 0.5.1__tar.gz → 0.6.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 (509) hide show
  1. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/PKG-INFO +74 -4
  2. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/README.md +73 -3
  3. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/pyproject.toml +1 -1
  4. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/pyproject.toml.orig +1 -1
  5. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/application_services/bindings.py +0 -64
  6. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/application_services/dispatcher.py +1 -1
  7. python_ddd_framework-0.6.0/src/python_ddd_framework/application_services/invocation.py +57 -0
  8. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/application_services/module.py +16 -5
  9. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/authorization/module.py +1 -1
  10. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_jobs/execution.py +1 -1
  11. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_jobs/pgqueuer/enqueue.py +1 -1
  12. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_workers/execution.py +1 -1
  13. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_workers/runtime.py +1 -1
  14. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/caching/unit_of_work.py +2 -4
  15. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/cli/project.py +11 -10
  16. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/generation.py +46 -36
  17. python_ddd_framework-0.6.0/src/python_ddd_framework/developer_kit/publication.py +442 -0
  18. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/README.md +40 -2
  19. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/sqlalchemy/repositories/order_repository.py.jinja +3 -1
  20. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/AGENTS.md +14 -3
  21. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/docs/architecture.md +16 -0
  22. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/docs/development.md +63 -2
  23. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/diagnostics/source.py +14 -1
  24. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/domain/aggregates.py +5 -12
  25. python_ddd_framework-0.6.0/src/python_ddd_framework/domain/event_values.py +124 -0
  26. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/events/runtime.py +2 -7
  27. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/events/unit_of_work.py +1 -4
  28. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/action.py +2 -1
  29. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/adapter.py +11 -117
  30. python_ddd_framework-0.6.0/src/python_ddd_framework/fastapi/application_services.py +287 -0
  31. python_ddd_framework-0.6.0/src/python_ddd_framework/fastapi/error_handlers.py +128 -0
  32. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/realtime/runtime.py +1 -1
  33. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/request_context.py +2 -5
  34. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/routing.py +4 -10
  35. python_ddd_framework-0.6.0/src/python_ddd_framework/fastapi/service_endpoints.py +182 -0
  36. python_ddd_framework-0.6.0/src/python_ddd_framework/fastapi/service_routes.py +237 -0
  37. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/transfer.py +1 -1
  38. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/hosted_services/bridge.py +2 -6
  39. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/hosted_services/runtime.py +1 -1
  40. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/identity/__init__.py +21 -13
  41. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/identity/application.py +12 -66
  42. python_ddd_framework-0.6.0/src/python_ddd_framework/identity/contracts.py +75 -0
  43. python_ddd_framework-0.6.0/src/python_ddd_framework/identity/domain_rules.py +17 -0
  44. python_ddd_framework-0.6.0/src/python_ddd_framework/identity/dtos.py +152 -0
  45. python_ddd_framework-0.6.0/src/python_ddd_framework/identity/extensions.py +9 -0
  46. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/identity/management.py +28 -25
  47. python_ddd_framework-0.6.0/src/python_ddd_framework/identity/models.py +86 -0
  48. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/identity/module.py +3 -4
  49. python_ddd_framework-0.6.0/src/python_ddd_framework/identity/options.py +54 -0
  50. python_ddd_framework-0.6.0/src/python_ddd_framework/identity/seeding.py +59 -0
  51. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/identity/services.py +1 -1
  52. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/identity/sqlalchemy/module.py +9 -6
  53. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/identity/sqlalchemy/repository.py +4 -5
  54. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/identity/sqlalchemy/session_security.py +1 -3
  55. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/identity/sqlalchemy/stores.py +35 -47
  56. python_ddd_framework-0.6.0/src/python_ddd_framework/identity/stores.py +120 -0
  57. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/identity/tokens.py +1 -1
  58. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/invocation/callables.py +1 -1
  59. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/invocation/dispatcher.py +1 -1
  60. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/invocation/entrypoints.py +2 -1
  61. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/invocation/function_runtime.py +2 -2
  62. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/invocation/interception.py +1 -1
  63. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/invocation/managed_proxy.py +2 -1
  64. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/invocation/managed_services.py +8 -14
  65. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/invocation/methods.py +2 -7
  66. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/invocation/module.py +1 -1
  67. python_ddd_framework-0.5.1/src/python_ddd_framework/application_services/invocation.py → python_ddd_framework-0.6.0/src/python_ddd_framework/invocation/runtime.py +6 -136
  68. python_ddd_framework-0.6.0/src/python_ddd_framework/invocation/scopes.py +91 -0
  69. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/messaging/channel.py +1 -1
  70. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/messaging/runtime.py +1 -1
  71. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/modularity/discovery.py +2 -7
  72. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/modularity/graph.py +2 -8
  73. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/observability/logging.py +1 -1
  74. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/observability/tracing.py +1 -1
  75. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/redis/cache.py +2 -0
  76. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/redis/notification_runtime.py +1 -1
  77. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/services/arbitration.py +1 -20
  78. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/services/composition.py +71 -2
  79. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/services/provider.py +23 -1
  80. python_ddd_framework-0.6.0/src/python_ddd_framework/services/relocation.py +96 -0
  81. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/refresh.py +1 -1
  82. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/sqlalchemy/store.py +1 -1
  83. python_ddd_framework-0.6.0/src/python_ddd_framework/sqlalchemy/metadata.py +278 -0
  84. python_ddd_framework-0.6.0/src/python_ddd_framework/sqlalchemy/metadata_builder.py +234 -0
  85. python_ddd_framework-0.6.0/src/python_ddd_framework/sqlalchemy/metadata_fingerprint.py +108 -0
  86. python_ddd_framework-0.6.0/src/python_ddd_framework/sqlalchemy/metadata_ownership.py +73 -0
  87. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/sqlalchemy/migration.py +2 -1
  88. python_ddd_framework-0.6.0/src/python_ddd_framework/sqlalchemy/migration_sources.py +38 -0
  89. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/sqlalchemy/module.py +2 -1
  90. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/sqlalchemy/unit_of_work.py +1 -1
  91. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/unit_of_work/contracts.py +68 -7
  92. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/unit_of_work/manager.py +4 -7
  93. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/unit_of_work/module.py +1 -1
  94. python_ddd_framework-0.5.1/src/python_ddd_framework/fastapi/application_services.py +0 -672
  95. python_ddd_framework-0.5.1/src/python_ddd_framework/identity/contracts.py +0 -448
  96. python_ddd_framework-0.5.1/src/python_ddd_framework/sqlalchemy/metadata.py +0 -680
  97. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/LICENSE +0 -0
  98. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/__init__.py +0 -0
  99. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/application/__init__.py +0 -0
  100. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/application/build_spec.py +0 -0
  101. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/application/builder.py +0 -0
  102. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/application/composition.py +0 -0
  103. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/application/runtime.py +0 -0
  104. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/application/runtime_hooks.py +0 -0
  105. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/application/state.py +0 -0
  106. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/application_services/__init__.py +0 -0
  107. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/application_services/catalog.py +0 -0
  108. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/application_services/contracts.py +0 -0
  109. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/application_services/errors.py +0 -0
  110. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/application_services/pagination.py +0 -0
  111. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/auditing/__init__.py +0 -0
  112. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/auditing/contracts.py +0 -0
  113. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/auditing/control.py +0 -0
  114. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/auditing/module.py +0 -0
  115. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/auditing/sqlalchemy/__init__.py +0 -0
  116. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/auditing/sqlalchemy/migrations/0001_auditing.py +0 -0
  117. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/auditing/sqlalchemy/migrations/__init__.py +0 -0
  118. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/auditing/sqlalchemy/models.py +0 -0
  119. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/auditing/sqlalchemy/module.py +0 -0
  120. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/auditing/sqlalchemy/store.py +0 -0
  121. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/authorization/__init__.py +0 -0
  122. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/authorization/catalog.py +0 -0
  123. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/authorization/contracts.py +0 -0
  124. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/authorization/definition_discovery.py +0 -0
  125. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/authorization/definitions.py +0 -0
  126. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/authorization/errors.py +0 -0
  127. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/authorization/options.py +0 -0
  128. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_execution/__init__.py +0 -0
  129. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_execution/application.py +0 -0
  130. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_execution/child.py +0 -0
  131. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_execution/contracts.py +0 -0
  132. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_execution/declarations.py +0 -0
  133. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_execution/lifecycle.py +0 -0
  134. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_execution/local.py +0 -0
  135. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_execution/locks.py +0 -0
  136. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_execution/management.py +0 -0
  137. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_execution/module.py +0 -0
  138. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_execution/permissions.py +0 -0
  139. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_execution/processes.py +0 -0
  140. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_jobs/__init__.py +0 -0
  141. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_jobs/catalog.py +0 -0
  142. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_jobs/contracts.py +0 -0
  143. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_jobs/declaration.py +0 -0
  144. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_jobs/errors.py +0 -0
  145. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_jobs/pgqueuer/UPSTREAM_LICENSE.txt +0 -0
  146. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_jobs/pgqueuer/__init__.py +0 -0
  147. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_jobs/pgqueuer/migrations/0001_pgqueuer_1_3_2.py +0 -0
  148. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_jobs/pgqueuer/migrations/__init__.py +0 -0
  149. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_jobs/pgqueuer/module.py +0 -0
  150. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_jobs/pgqueuer/options.py +0 -0
  151. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_jobs/pgqueuer/runtime.py +0 -0
  152. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_jobs/pgqueuer/sql/pgqueuer_1_3_2_install.sql +0 -0
  153. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_jobs/pgqueuer/supervision.py +0 -0
  154. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_workers/__init__.py +0 -0
  155. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_workers/catalog.py +0 -0
  156. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_workers/contracts.py +0 -0
  157. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_workers/errors.py +0 -0
  158. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/caching/__init__.py +0 -0
  159. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/caching/contracts.py +0 -0
  160. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/caching/errors.py +0 -0
  161. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/caching/module.py +0 -0
  162. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/caching/naming.py +0 -0
  163. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/caching/options.py +0 -0
  164. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/cli/__init__.py +0 -0
  165. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/cli/development.py +0 -0
  166. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/cli/errors.py +0 -0
  167. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/cli/inspection.py +0 -0
  168. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/cli/runtime.py +0 -0
  169. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/configuration/__init__.py +0 -0
  170. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/configuration/composition.py +0 -0
  171. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/configuration/contracts.py +0 -0
  172. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/configuration/dotenv_source.py +0 -0
  173. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/configuration/environment_source.py +0 -0
  174. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/configuration/immutability.py +0 -0
  175. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/configuration/input_shape.py +0 -0
  176. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/configuration/merge.py +0 -0
  177. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/configuration/root.py +0 -0
  178. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/configuration/sources.py +0 -0
  179. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/configuration/values.py +0 -0
  180. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/configuration/yaml_source.py +0 -0
  181. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/__init__.py +0 -0
  182. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/project_metadata.py +0 -0
  183. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/source.py +0 -0
  184. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/basic/cookiecutter.json +0 -0
  185. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/basic/{{cookiecutter.module_name}}/README.md +0 -0
  186. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/basic/{{cookiecutter.module_name}}/__init__.py.jinja +0 -0
  187. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/basic/{{cookiecutter.module_name}}/contracts/__init__.py.jinja +0 -0
  188. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/basic/{{cookiecutter.module_name}}/contracts/conversion_service.py.jinja +0 -0
  189. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/basic/{{cookiecutter.module_name}}/module.py.jinja +0 -0
  190. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/basic/{{cookiecutter.module_name}}/services/__init__.py.jinja +0 -0
  191. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/basic/{{cookiecutter.module_name}}/services/default_conversion_service.py.jinja +0 -0
  192. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/cookiecutter.json +0 -0
  193. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/__init__.py.jinja +0 -0
  194. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/__init__.py.jinja +0 -0
  195. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/background_jobs/__init__.py.jinja +0 -0
  196. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/background_jobs/order_approval/__init__.py.jinja +0 -0
  197. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/background_jobs/order_approval/handler.py.jinja +0 -0
  198. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/background_jobs/order_approval/payload.py.jinja +0 -0
  199. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/background_jobs/order_statistics/__init__.py.jinja +0 -0
  200. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/background_jobs/order_statistics/handler.py.jinja +0 -0
  201. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/background_jobs/order_statistics/payload.py.jinja +0 -0
  202. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/background_jobs/order_statistics/schedule.py.jinja +0 -0
  203. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/background_workers/__init__.py.jinja +0 -0
  204. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/background_workers/order_maintenance_worker.py.jinja +0 -0
  205. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/background_workers/order_statistics_worker.py.jinja +0 -0
  206. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/caching/__init__.py.jinja +0 -0
  207. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/caching/order_cache.py.jinja +0 -0
  208. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/caching/statistics_cache.py.jinja +0 -0
  209. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/event_handlers/__init__.py.jinja +0 -0
  210. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/event_handlers/order_changed_handler.py.jinja +0 -0
  211. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/hosted_services/__init__.py.jinja +0 -0
  212. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/hosted_services/order_integration_service.py.jinja +0 -0
  213. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/hosted_services/order_observation_handler.py.jinja +0 -0
  214. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/integration_services/__init__.py.jinja +0 -0
  215. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/integration_services/order_reporting_service.py.jinja +0 -0
  216. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/interceptors/__init__.py.jinja +0 -0
  217. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/interceptors/order_timing_interceptor.py.jinja +0 -0
  218. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/module.py.jinja +0 -0
  219. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/options/__init__.py.jinja +0 -0
  220. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/options/order_options.py.jinja +0 -0
  221. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/services/__init__.py.jinja +0 -0
  222. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/services/order_approval_service.py.jinja +0 -0
  223. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/services/order_management_service.py.jinja +0 -0
  224. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/services/order_query_service.py.jinja +0 -0
  225. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/setting_handlers/__init__.py.jinja +0 -0
  226. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/setting_handlers/approval_setting_observer.py.jinja +0 -0
  227. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/__init__.py.jinja +0 -0
  228. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/inputs/__init__.py.jinja +0 -0
  229. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/inputs/approve_order.py.jinja +0 -0
  230. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/inputs/create_order.py.jinja +0 -0
  231. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/integration_services/__init__.py.jinja +0 -0
  232. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/integration_services/order_reporting_service.py.jinja +0 -0
  233. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/module.py.jinja +0 -0
  234. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/services/__init__.py.jinja +0 -0
  235. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/services/order_approval_service.py.jinja +0 -0
  236. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/services/order_management_service.py.jinja +0 -0
  237. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/services/order_query_service.py.jinja +0 -0
  238. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/views/__init__.py.jinja +0 -0
  239. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/views/order_statistics_snapshot.py.jinja +0 -0
  240. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/views/order_view.py.jinja +0 -0
  241. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/__init__.py.jinja +0 -0
  242. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/entities/__init__.py.jinja +0 -0
  243. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/entities/order.py.jinja +0 -0
  244. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/events/__init__.py.jinja +0 -0
  245. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/events/order_changed.py.jinja +0 -0
  246. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/module.py.jinja +0 -0
  247. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/repositories/__init__.py.jinja +0 -0
  248. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/repositories/order_repository.py.jinja +0 -0
  249. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/seeding/__init__.py.jinja +0 -0
  250. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/seeding/order_seed_contributor.py.jinja +0 -0
  251. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/services/__init__.py.jinja +0 -0
  252. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/services/order_approval_service.py.jinja +0 -0
  253. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/settings/__init__.py.jinja +0 -0
  254. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/settings/approval_settings.py.jinja +0 -0
  255. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/value_objects/__init__.py.jinja +0 -0
  256. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/value_objects/order_title.py.jinja +0 -0
  257. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/__init__.py.jinja +0 -0
  258. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/constants/__init__.py.jinja +0 -0
  259. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/constants/order_constants.py.jinja +0 -0
  260. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/enums/__init__.py.jinja +0 -0
  261. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/enums/order_status.py.jinja +0 -0
  262. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/errors/__init__.py.jinja +0 -0
  263. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/errors/order_errors.py.jinja +0 -0
  264. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/messages/__init__.py.jinja +0 -0
  265. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/messages/order_messages.py.jinja +0 -0
  266. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/messages/order_observation.py.jinja +0 -0
  267. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/module.py.jinja +0 -0
  268. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/permissions/__init__.py.jinja +0 -0
  269. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/permissions/order_permission_provider.py.jinja +0 -0
  270. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/permissions/order_permissions.py.jinja +0 -0
  271. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/value_objects/__init__.py.jinja +0 -0
  272. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/value_objects/money.py.jinja +0 -0
  273. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/__init__.py.jinja +0 -0
  274. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/filters/__init__.py.jinja +0 -0
  275. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/filters/export_filter.py.jinja +0 -0
  276. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/models/__init__.py.jinja +0 -0
  277. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/models/refresh_orders.py.jinja +0 -0
  278. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/module.py.jinja +0 -0
  279. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/routers/__init__.py.jinja +0 -0
  280. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/routers/order_files.py.jinja +0 -0
  281. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/websockets/__init__.py.jinja +0 -0
  282. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/websockets/order_socket.py.jinja +0 -0
  283. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/sqlalchemy/__init__.py.jinja +0 -0
  284. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/sqlalchemy/migrations/__init__.py.jinja +0 -0
  285. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/sqlalchemy/models/__init__.py.jinja +0 -0
  286. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/sqlalchemy/models/base.py.jinja +0 -0
  287. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/sqlalchemy/models/order_model.py.jinja +0 -0
  288. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/sqlalchemy/module.py.jinja +0 -0
  289. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/sqlalchemy/repositories/__init__.py.jinja +0 -0
  290. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/tests/__init__.py.jinja +0 -0
  291. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/tests/test_domain.py.jinja +0 -0
  292. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/project/cookiecutter.json +0 -0
  293. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/README.md +0 -0
  294. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/.dockerignore +0 -0
  295. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/.gitignore +0 -0
  296. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/.python-version +0 -0
  297. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/Dockerfile +0 -0
  298. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/app.development.yaml.jinja +0 -0
  299. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/compose.dev.yaml.jinja +0 -0
  300. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/compose.production.yaml.jinja +0 -0
  301. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/pyproject.toml.jinja +0 -0
  302. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/src/host/__init__.py.jinja +0 -0
  303. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/src/host/main.py.jinja +0 -0
  304. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/src/host/module.py.jinja +0 -0
  305. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/tests/conftest.py.jinja +0 -0
  306. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/tests/host/test_http.py.jinja +0 -0
  307. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/scripts/.gitkeep +0 -0
  308. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/wiring.py +0 -0
  309. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/diagnostics/__init__.py +0 -0
  310. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/diagnostics/journal.py +0 -0
  311. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/diagnostics/model.py +0 -0
  312. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/distributed_lock/__init__.py +0 -0
  313. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/distributed_lock/contracts.py +0 -0
  314. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/distributed_lock/options.py +0 -0
  315. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/domain/__init__.py +0 -0
  316. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/domain/entities.py +0 -0
  317. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/domain/errors.py +0 -0
  318. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/domain/services.py +0 -0
  319. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/domain/value_objects.py +0 -0
  320. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/errors/__init__.py +0 -0
  321. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/errors/base.py +0 -0
  322. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/errors/business.py +0 -0
  323. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/errors/configuration.py +0 -0
  324. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/errors/diagnostics.py +0 -0
  325. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/errors/lifecycle.py +0 -0
  326. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/errors/modularity.py +0 -0
  327. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/errors/services.py +0 -0
  328. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/events/__init__.py +0 -0
  329. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/events/aggregate.py +0 -0
  330. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/events/catalog.py +0 -0
  331. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/events/contracts.py +0 -0
  332. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/events/contribution.py +0 -0
  333. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/events/discovery.py +0 -0
  334. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/events/entities.py +0 -0
  335. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/events/errors.py +0 -0
  336. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/events/module.py +0 -0
  337. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/events/subscription.py +0 -0
  338. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/extensions/__init__.py +0 -0
  339. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/extensions/catalog.py +0 -0
  340. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/extensions/contracts.py +0 -0
  341. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/extensions/models.py +0 -0
  342. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/extensions/module.py +0 -0
  343. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/__init__.py +0 -0
  344. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/background.py +0 -0
  345. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/contracts.py +0 -0
  346. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/errors.py +0 -0
  347. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/filters.py +0 -0
  348. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/health.py +0 -0
  349. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/http.py +0 -0
  350. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/http_router.py +0 -0
  351. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/manual_action.py +0 -0
  352. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/middleware.py +0 -0
  353. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/module.py +0 -0
  354. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/parameters.py +0 -0
  355. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/realtime/__init__.py +0 -0
  356. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/realtime/authentication.py +0 -0
  357. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/realtime/connection.py +0 -0
  358. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/realtime/module.py +0 -0
  359. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/realtime/options.py +0 -0
  360. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/route_integrity.py +0 -0
  361. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/server.py +0 -0
  362. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/settings.py +0 -0
  363. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/tracing.py +0 -0
  364. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/upload_limits.py +0 -0
  365. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/uploads.py +0 -0
  366. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/hosted_services/__init__.py +0 -0
  367. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/hosted_services/catalog.py +0 -0
  368. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/hosted_services/contracts.py +0 -0
  369. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/hosted_services/declarations.py +0 -0
  370. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/hosted_services/errors.py +0 -0
  371. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/hosted_services/module.py +0 -0
  372. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/hosted_services/options.py +0 -0
  373. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/hosted_services/state.py +0 -0
  374. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/hosting/__init__.py +0 -0
  375. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/hosting/instance.py +0 -0
  376. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/identity/errors.py +0 -0
  377. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/identity/http_api.py +0 -0
  378. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/identity/passwords.py +0 -0
  379. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/identity/permissions.py +0 -0
  380. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/identity/sqlalchemy/__init__.py +0 -0
  381. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/identity/sqlalchemy/migrations/0001_identity.py +0 -0
  382. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/identity/sqlalchemy/migrations/0002_physical_delete.py +0 -0
  383. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/identity/sqlalchemy/migrations/0003_extra_properties.py +0 -0
  384. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/identity/sqlalchemy/migrations/0004_concurrency_version.py +0 -0
  385. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/identity/sqlalchemy/migrations/__init__.py +0 -0
  386. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/identity/sqlalchemy/models.py +0 -0
  387. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/invocation/__init__.py +0 -0
  388. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/invocation/arguments.py +0 -0
  389. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/invocation/contracts.py +0 -0
  390. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/invocation/contribution.py +0 -0
  391. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/invocation/entries.py +0 -0
  392. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/invocation/execution.py +0 -0
  393. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/invocation/interceptors.py +0 -0
  394. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/invocation/policies.py +0 -0
  395. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/invocation/signature.py +0 -0
  396. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/invocation/validation.py +0 -0
  397. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/lifecycle/__init__.py +0 -0
  398. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/lifecycle/composition.py +0 -0
  399. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/lifecycle/context.py +0 -0
  400. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/lifecycle/participants.py +0 -0
  401. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/lifecycle/runtime.py +0 -0
  402. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/lifecycle/state.py +0 -0
  403. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/messaging/__init__.py +0 -0
  404. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/messaging/contracts.py +0 -0
  405. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/messaging/module.py +0 -0
  406. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/messaging/options.py +0 -0
  407. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/messaging/receipt.py +0 -0
  408. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/modularity/__init__.py +0 -0
  409. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/modularity/contracts.py +0 -0
  410. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/modularity/registry.py +0 -0
  411. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/modularity/selection.py +0 -0
  412. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/notifications/__init__.py +0 -0
  413. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/notifications/catalog.py +0 -0
  414. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/notifications/contracts.py +0 -0
  415. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/notifications/declarations.py +0 -0
  416. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/notifications/module.py +0 -0
  417. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/observability/__init__.py +0 -0
  418. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/observability/context.py +0 -0
  419. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/observability/export.py +0 -0
  420. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/observability/formatting.py +0 -0
  421. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/observability/options.py +0 -0
  422. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/options/__init__.py +0 -0
  423. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/options/aliases.py +0 -0
  424. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/options/contribution.py +0 -0
  425. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/options/immutability.py +0 -0
  426. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/options/input_keys.py +0 -0
  427. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/options/issues.py +0 -0
  428. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/options/models.py +0 -0
  429. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/options/registry.py +0 -0
  430. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/options/schema.py +0 -0
  431. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/options/validation.py +0 -0
  432. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/py.typed +0 -0
  433. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/realtime/__init__.py +0 -0
  434. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/realtime/contracts.py +0 -0
  435. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/realtime/diagnostics.py +0 -0
  436. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/realtime/messages.py +0 -0
  437. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/redis/__init__.py +0 -0
  438. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/redis/cache_scripts.py +0 -0
  439. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/redis/distributed_lock.py +0 -0
  440. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/redis/lease_lock.py +0 -0
  441. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/redis/module.py +0 -0
  442. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/redis/notifications.py +0 -0
  443. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/redis/options.py +0 -0
  444. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/redis/runtime.py +0 -0
  445. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/seeding/__init__.py +0 -0
  446. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/seeding/contracts.py +0 -0
  447. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/seeding/module.py +0 -0
  448. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/seeding/runtime.py +0 -0
  449. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/services/__init__.py +0 -0
  450. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/services/binding.py +0 -0
  451. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/services/contribution.py +0 -0
  452. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/services/convention.py +0 -0
  453. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/services/convention_contracts.py +0 -0
  454. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/services/exposure.py +0 -0
  455. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/services/fixed_lifetime.py +0 -0
  456. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/services/framework_provider.py +0 -0
  457. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/services/native_graph.py +0 -0
  458. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/services/registration.py +0 -0
  459. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/services/repository.py +0 -0
  460. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/services/runtime.py +0 -0
  461. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/__init__.py +0 -0
  462. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/application.py +0 -0
  463. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/binding.py +0 -0
  464. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/catalog.py +0 -0
  465. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/changes.py +0 -0
  466. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/contracts.py +0 -0
  467. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/declarations.py +0 -0
  468. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/definition_discovery.py +0 -0
  469. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/definitions.py +0 -0
  470. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/errors.py +0 -0
  471. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/handlers.py +0 -0
  472. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/management.py +0 -0
  473. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/manager.py +0 -0
  474. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/module.py +0 -0
  475. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/notifications.py +0 -0
  476. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/permissions.py +0 -0
  477. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/provider.py +0 -0
  478. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/refresh_module.py +0 -0
  479. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/sqlalchemy/__init__.py +0 -0
  480. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/sqlalchemy/migrations/0001_settings.py +0 -0
  481. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/sqlalchemy/migrations/0002_physical_delete.py +0 -0
  482. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/sqlalchemy/migrations/0003_version_tokens.py +0 -0
  483. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/sqlalchemy/migrations/__init__.py +0 -0
  484. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/sqlalchemy/models.py +0 -0
  485. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/sqlalchemy/module.py +0 -0
  486. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/store.py +0 -0
  487. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/values.py +0 -0
  488. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/sqlalchemy/__init__.py +0 -0
  489. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/sqlalchemy/alembic_runtime/__init__.py +0 -0
  490. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/sqlalchemy/alembic_runtime/env.py +0 -0
  491. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/sqlalchemy/alembic_runtime/script.py.mako +0 -0
  492. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/sqlalchemy/auditing.py +0 -0
  493. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/sqlalchemy/errors.py +0 -0
  494. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/sqlalchemy/extensions.py +0 -0
  495. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/sqlalchemy/migration_operations.py +0 -0
  496. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/sqlalchemy/migration_options.py +0 -0
  497. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/sqlalchemy/module_migration.py +0 -0
  498. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/sqlalchemy/options.py +0 -0
  499. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/sqlalchemy/repository.py +0 -0
  500. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/sqlalchemy/runtime.py +0 -0
  501. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/sqlalchemy/session_provider.py +0 -0
  502. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/testing/__init__.py +0 -0
  503. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/testing/runtime.py +0 -0
  504. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/unit_of_work/__init__.py +0 -0
  505. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/unit_of_work/errors.py +0 -0
  506. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/unit_of_work/lifecycle.py +0 -0
  507. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/unit_of_work/options.py +0 -0
  508. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.0}/src/python_ddd_framework/validation/__init__.py +0 -0
  509. {python_ddd_framework-0.5.1 → python_ddd_framework-0.6.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.6.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
 
@@ -194,6 +194,34 @@ pddd db status --module orders --environment production
194
194
 
195
195
  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
196
 
197
+ ### Recovering a failed module addition
198
+
199
+ `add module` prints a recovery directory under the identified backend's
200
+ `.python-ddd-framework/generation/<operation-id>/`. It retains original bytes, proposed
201
+ startup/metadata files, a module file manifest, step records and `uv-sync.log`. The rendered
202
+ template and any unfinished sibling copies are retained too. Open that operation's
203
+ `RECOVERY.md` for its paths and a copyable, read-only inspection procedure.
204
+
205
+ Stop other generators and editors before recovery. Compare the actual files with the
206
+ recorded digests: continue only from the recorded original content, or restore an original
207
+ file only while the target still matches this operation's proposed content. Review any
208
+ other content manually. Keep generated directories and markers until you explicitly decide
209
+ what to do with them; rerunning `add module` does not repair a partial publication.
210
+
211
+ When all project files match the proposed contents but installation failed, use the
212
+ independent sync script in that operation's `RECOVERY.md`. Run it with `python -I` as
213
+ instructed. It clears the CLI's recorded Python/uv environment overrides before running
214
+ `uv sync` in the identified backend, including overrides set after generation. A bare
215
+ `uv sync --directory` still inherits environment overrides and can select another
216
+ virtual environment. The retry preserves your shell environment and the original records.
217
+
218
+ File publication and installation have separate results. An interrupted or missing step
219
+ record requires checking the files; it does not prove that the write failed. The CLI does
220
+ not automatically restore, move or delete the failure site, roll back the environment or
221
+ lockfile, or guarantee a transaction across files or power-loss recovery.
222
+
223
+ ### Project command environment
224
+
197
225
  `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
226
 
199
227
  `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.
@@ -290,6 +318,17 @@ The current contracts are in [architecture](https://github.com/componet-architec
290
318
  - 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
319
  - 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
320
 
321
+ ## Aggregate event values (0.6)
322
+
323
+ `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#聚合事件值).
324
+
325
+ - 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.
326
+ - 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`.
327
+ - 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.
328
+ - 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.
329
+
330
+ 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.
331
+
293
332
  ## Message processing (0.4)
294
333
 
295
334
  Opt in with `MessagingModule`, `MessageChannelDefinition[T]`, `MessageHandler[T]` and the
@@ -335,6 +374,31 @@ Slice 7 adds user/role management and an application-local authorization switch.
335
374
 
336
375
  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
376
 
377
+ ## Identity contract refactor (0.6)
378
+
379
+ Version 0.6 replaces `IdentityRepository` with two independent contracts exported from `python_ddd_framework.identity`:
380
+
381
+ - `IdentityCredentialStore`: `get_user` and `set_password`, including the existing concurrency version and expected password hash.
382
+ - `IdentityManagementStore`: user/role creation, queries, edits, deletion and relationship updates. Password writes belong to the credential contract.
383
+
384
+ 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:
385
+
386
+ ```python
387
+ from dishka import AnyOf, Provider, Scope
388
+ from python_ddd_framework.identity import IdentityCredentialStore, IdentityManagementStore
389
+
390
+ provider = Provider()
391
+ provider.provide(
392
+ MyIdentityStore,
393
+ provides=AnyOf[MyIdentityStore, IdentityCredentialStore, IdentityManagementStore],
394
+ scope=Scope.REQUEST,
395
+ )
396
+ ```
397
+
398
+ `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.
399
+
400
+ 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.
401
+
338
402
  ## Extension migration (0.4)
339
403
 
340
404
  - 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 +432,12 @@ During `0.x`, compatible fixes use a patch release; changes requiring consumer a
368
432
 
369
433
  These notes remain the authoritative consumer migration instructions. Historical versions below refer to the former package name.
370
434
 
435
+ #### Unit of Work participant diagnostics (0.6)
436
+
437
+ 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.
438
+
439
+ 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.
440
+
371
441
  #### Lifecycle shutdown migration (0.5)
372
442
 
373
443
  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.
@@ -455,7 +525,7 @@ Do not remove durable job payload versions merely because their Python APIs were
455
525
  <details>
456
526
  <summary>For maintainers: publishing a changed version</summary>
457
527
 
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.
528
+ 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
529
 
460
530
  </details>
461
531
 
@@ -471,7 +541,7 @@ The engineering guides below are maintained in Chinese in the private GitHub rep
471
541
  | Check release evidence and remaining validation limits | [Status and validation](https://github.com/componet-architecture/python-ddd-framework/blob/main/docs/status.md) |
472
542
  | 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
543
 
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.
544
+ Generated applications include a self-contained English README, `AGENTS.md`, architecture document, and development guide for their template version. `AGENTS.md` guides contributors from business rules and ownership to framework capability selection and verification. The development guide maps common tasks to framework capabilities and includes commands to locate the installed version's source and bundled examples; each DDD module README records the sample business model and traces approval through its owners. The application maintains these documents after generation; framework upgrades do not overwrite them. Existing applications can use their installed package's `developer_kit/templates` as a read-only reference when updating affected guidance, preserving their own business model and decisions.
475
545
 
476
546
  ## License
477
547
 
@@ -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
 
@@ -150,6 +150,34 @@ pddd db status --module orders --environment production
150
150
 
151
151
  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
152
 
153
+ ### Recovering a failed module addition
154
+
155
+ `add module` prints a recovery directory under the identified backend's
156
+ `.python-ddd-framework/generation/<operation-id>/`. It retains original bytes, proposed
157
+ startup/metadata files, a module file manifest, step records and `uv-sync.log`. The rendered
158
+ template and any unfinished sibling copies are retained too. Open that operation's
159
+ `RECOVERY.md` for its paths and a copyable, read-only inspection procedure.
160
+
161
+ Stop other generators and editors before recovery. Compare the actual files with the
162
+ recorded digests: continue only from the recorded original content, or restore an original
163
+ file only while the target still matches this operation's proposed content. Review any
164
+ other content manually. Keep generated directories and markers until you explicitly decide
165
+ what to do with them; rerunning `add module` does not repair a partial publication.
166
+
167
+ When all project files match the proposed contents but installation failed, use the
168
+ independent sync script in that operation's `RECOVERY.md`. Run it with `python -I` as
169
+ instructed. It clears the CLI's recorded Python/uv environment overrides before running
170
+ `uv sync` in the identified backend, including overrides set after generation. A bare
171
+ `uv sync --directory` still inherits environment overrides and can select another
172
+ virtual environment. The retry preserves your shell environment and the original records.
173
+
174
+ File publication and installation have separate results. An interrupted or missing step
175
+ record requires checking the files; it does not prove that the write failed. The CLI does
176
+ not automatically restore, move or delete the failure site, roll back the environment or
177
+ lockfile, or guarantee a transaction across files or power-loss recovery.
178
+
179
+ ### Project command environment
180
+
153
181
  `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
182
 
155
183
  `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.
@@ -246,6 +274,17 @@ The current contracts are in [architecture](https://github.com/componet-architec
246
274
  - 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
275
  - 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
276
 
277
+ ## Aggregate event values (0.6)
278
+
279
+ `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#聚合事件值).
280
+
281
+ - 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.
282
+ - 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`.
283
+ - 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.
284
+ - 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.
285
+
286
+ 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.
287
+
249
288
  ## Message processing (0.4)
250
289
 
251
290
  Opt in with `MessagingModule`, `MessageChannelDefinition[T]`, `MessageHandler[T]` and the
@@ -291,6 +330,31 @@ Slice 7 adds user/role management and an application-local authorization switch.
291
330
 
292
331
  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
332
 
333
+ ## Identity contract refactor (0.6)
334
+
335
+ Version 0.6 replaces `IdentityRepository` with two independent contracts exported from `python_ddd_framework.identity`:
336
+
337
+ - `IdentityCredentialStore`: `get_user` and `set_password`, including the existing concurrency version and expected password hash.
338
+ - `IdentityManagementStore`: user/role creation, queries, edits, deletion and relationship updates. Password writes belong to the credential contract.
339
+
340
+ 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:
341
+
342
+ ```python
343
+ from dishka import AnyOf, Provider, Scope
344
+ from python_ddd_framework.identity import IdentityCredentialStore, IdentityManagementStore
345
+
346
+ provider = Provider()
347
+ provider.provide(
348
+ MyIdentityStore,
349
+ provides=AnyOf[MyIdentityStore, IdentityCredentialStore, IdentityManagementStore],
350
+ scope=Scope.REQUEST,
351
+ )
352
+ ```
353
+
354
+ `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.
355
+
356
+ 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.
357
+
294
358
  ## Extension migration (0.4)
295
359
 
296
360
  - 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 +388,12 @@ During `0.x`, compatible fixes use a patch release; changes requiring consumer a
324
388
 
325
389
  These notes remain the authoritative consumer migration instructions. Historical versions below refer to the former package name.
326
390
 
391
+ #### Unit of Work participant diagnostics (0.6)
392
+
393
+ 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.
394
+
395
+ 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.
396
+
327
397
  #### Lifecycle shutdown migration (0.5)
328
398
 
329
399
  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.
@@ -411,7 +481,7 @@ Do not remove durable job payload versions merely because their Python APIs were
411
481
  <details>
412
482
  <summary>For maintainers: publishing a changed version</summary>
413
483
 
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.
484
+ 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
485
 
416
486
  </details>
417
487
 
@@ -427,7 +497,7 @@ The engineering guides below are maintained in Chinese in the private GitHub rep
427
497
  | Check release evidence and remaining validation limits | [Status and validation](https://github.com/componet-architecture/python-ddd-framework/blob/main/docs/status.md) |
428
498
  | 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
499
 
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.
500
+ Generated applications include a self-contained English README, `AGENTS.md`, architecture document, and development guide for their template version. `AGENTS.md` guides contributors from business rules and ownership to framework capability selection and verification. The development guide maps common tasks to framework capabilities and includes commands to locate the installed version's source and bundled examples; each DDD module README records the sample business model and traces approval through its owners. The application maintains these documents after generation; framework upgrades do not overwrite them. Existing applications can use their installed package's `developer_kit/templates` as a read-only reference when updating affected guidance, preserving their own business model and decisions.
431
501
 
432
502
  ## License
433
503
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "python-ddd-framework"
3
- version = "0.5.1"
3
+ version = "0.6.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.6.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")
@@ -25,15 +25,16 @@ from ..services.convention_contracts import (
25
25
  ConventionDiscoveryKind,
26
26
  _ServiceDefinition,
27
27
  )
28
+ from ..services.relocation import _BindingRelocation
28
29
  from ..settings.module import SettingsModule
29
30
  from ..unit_of_work.module import UnitOfWorkModule
30
31
  from .bindings import (
31
32
  _bind_application_services,
32
- _runtime_providers,
33
33
  _validate_application_service_bindings,
34
34
  _validate_application_service_dependencies,
35
35
  )
36
36
  from .catalog import (
37
+ _APPLICATION_SERVICE_COMPONENT,
37
38
  ApplicationServiceCatalog,
38
39
  _build_application_service_catalog,
39
40
  _DiscoveredApplicationService,
@@ -130,10 +131,20 @@ class ApplicationServicesModule(AppModule):
130
131
  context.modules.instance(InvocationModule).rules,
131
132
  context.modules.instance(ExtensionsModule).catalog,
132
133
  )
133
- # 只重定位仲裁后的原生绑定,保留其他能力已经生成的目录 Provider。
134
- for provider in context.arbitration.providers:
135
- context._providers.remove(provider)
136
- context._providers[0:0] = _runtime_providers(context.arbitration, bound)
134
+ # 能力只决定私有实现 key;来源、工厂搬迁和贡献指纹仍由 services 管理。
135
+ context._relocate_bindings(
136
+ tuple(
137
+ _BindingRelocation(
138
+ item.winner,
139
+ DependencyKey(
140
+ item.binding.discovery.definition.contract
141
+ or item.binding.discovery.service_type,
142
+ _APPLICATION_SERVICE_COMPONENT,
143
+ ),
144
+ )
145
+ for item in bound
146
+ )
147
+ )
137
148
  provider = Provider()
138
149
  provider.provide(lambda: self.catalog, provides=ApplicationServiceCatalog, scope=Scope.APP)
139
150
  provider.provide(_ApplicationServiceDispatcher, scope=Scope.REQUEST)
@@ -2,8 +2,8 @@
2
2
 
3
3
  from dishka import Provider, Scope
4
4
 
5
- from ..application_services.invocation import _InvocationRuntime
6
5
  from ..invocation.module import InvocationModule
6
+ from ..invocation.runtime import _InvocationRuntime
7
7
  from ..lifecycle import ConfigureContext
8
8
  from ..modularity import AppModule
9
9
  from ..services.composition import (
@@ -12,9 +12,9 @@ from uuid import uuid4
12
12
  from dishka import AsyncContainer, Scope
13
13
  from pydantic import BaseModel, ValidationError
14
14
 
15
- from ..application_services.invocation import _InvocationRuntime
16
15
  from ..authorization import CurrentUser
17
16
  from ..invocation import BackgroundSystemCaller
17
+ from ..invocation.runtime import _InvocationRuntime
18
18
  from ..observability.context import invocation_span
19
19
  from .catalog import BackgroundJobCatalog
20
20
  from .contracts import BackgroundJobContext, BackgroundJobDefinition
@@ -8,7 +8,7 @@ from typing import Any, TypeVar
8
8
  import asyncpg # type: ignore[import-untyped]
9
9
  from pydantic import BaseModel
10
10
 
11
- from ...application_services.invocation import _InvocationRuntime
11
+ from ...invocation.runtime import _InvocationRuntime
12
12
  from ...observability.context import capture_trace_context
13
13
  from ...options import Options
14
14
  from ...sqlalchemy import SqlAlchemySessionProvider
@@ -10,10 +10,10 @@ from uuid import uuid4
10
10
  from dishka import AsyncContainer, Scope
11
11
 
12
12
  from ..application_services.errors import ApplicationInvocationRejectedError
13
- from ..application_services.invocation import _InvocationRuntime
14
13
  from ..authorization import CurrentUser
15
14
  from ..background_execution.lifecycle import _TaskExecution
16
15
  from ..invocation import BackgroundSystemCaller
16
+ from ..invocation.runtime import _InvocationRuntime
17
17
  from ..unit_of_work.options import _DEFAULT_CONNECTION_NAME
18
18
  from .contracts import BackgroundWorkerContext, BackgroundWorkerDefinition
19
19
 
@@ -9,7 +9,6 @@ from collections.abc import Mapping
9
9
  from dishka import AsyncContainer
10
10
 
11
11
  from ..application.build_spec import _ApplicationBuildSpec
12
- from ..application_services.invocation import _InvocationRuntime
13
12
  from ..background_execution import (
14
13
  BackgroundExecutionMode,
15
14
  BackgroundJobOptions,
@@ -27,6 +26,7 @@ from ..background_execution.processes import _ProcessSlot
27
26
  from ..background_jobs import BackgroundJobCatalog
28
27
  from ..errors.lifecycle import ApplicationRuntimeError
29
28
  from ..invocation import BackgroundSystemCaller
29
+ from ..invocation.runtime import _InvocationRuntime
30
30
  from ..lifecycle import RuntimeParticipant, ShutdownReason
31
31
  from .catalog import BackgroundWorkerCatalog
32
32
  from .contracts import BackgroundExecutionOptions, BackgroundExecutionProfile
@@ -21,6 +21,7 @@ class _CachePending:
21
21
  async def after_commit(self) -> None:
22
22
  failures: list[Exception] = []
23
23
  try:
24
+ # 普通错误继续后项,取消立即传播;逐项 await 保留尚未发送命令的边界。
24
25
  for _, apply in self.writes.values():
25
26
  try:
26
27
  await apply()
@@ -40,7 +41,4 @@ class _CacheLifecycleFactory:
40
41
 
41
42
 
42
43
  def _pending(work: UnitOfWork) -> _CachePending:
43
- for lifecycle in work._lifecycles:
44
- if isinstance(lifecycle, _CachePending):
45
- return lifecycle
46
- raise RuntimeError("Caching lifecycle is not configured for this UnitOfWork")
44
+ return work._lifecycle(_CachePending)
@@ -18,6 +18,16 @@ from .errors import CommandError
18
18
 
19
19
  HOST_ENTRY_POINT_GROUP = "python_ddd_framework.hosts"
20
20
  MODULE_ENTRY_POINT_GROUP = "python_ddd_framework.modules"
21
+ _PROJECT_ENVIRONMENT_OVERRIDES = (
22
+ "VIRTUAL_ENV",
23
+ "PYTHONPATH",
24
+ "PYTHONHOME",
25
+ "UV_PROJECT_ENVIRONMENT",
26
+ "UV_PROJECT",
27
+ "UV_WORKING_DIR",
28
+ "UV_WORKING_DIRECTORY",
29
+ "UV_PYTHON",
30
+ )
21
31
 
22
32
 
23
33
  def read_project(path: Path) -> dict[str, Any]:
@@ -117,15 +127,6 @@ class Project:
117
127
  def project_environment() -> dict[str, str]:
118
128
  # 父进程可能来自 ROS、uv tool 或另一个项目;后端环境由本项目声明和 uv 选择。
119
129
  environment = dict(os.environ)
120
- for key in (
121
- "VIRTUAL_ENV",
122
- "PYTHONPATH",
123
- "PYTHONHOME",
124
- "UV_PROJECT_ENVIRONMENT",
125
- "UV_PROJECT",
126
- "UV_WORKING_DIR",
127
- "UV_WORKING_DIRECTORY",
128
- "UV_PYTHON",
129
- ):
130
+ for key in _PROJECT_ENVIRONMENT_OVERRIDES:
130
131
  environment.pop(key, None)
131
132
  return environment