python-ddd-framework 0.4.0__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.4.0 → python_ddd_framework-0.6.0}/PKG-INFO +82 -4
  2. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/README.md +81 -3
  3. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/pyproject.toml +1 -1
  4. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/pyproject.toml.orig +1 -1
  5. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/application/runtime.py +46 -19
  6. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/application_services/bindings.py +0 -64
  7. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/application_services/dispatcher.py +1 -1
  8. python_ddd_framework-0.6.0/src/python_ddd_framework/application_services/invocation.py +57 -0
  9. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/application_services/module.py +16 -5
  10. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/authorization/module.py +1 -1
  11. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_execution/local.py +20 -1
  12. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_execution/processes.py +11 -1
  13. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_jobs/execution.py +1 -1
  14. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_jobs/pgqueuer/enqueue.py +1 -1
  15. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_workers/execution.py +1 -1
  16. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_workers/runtime.py +11 -2
  17. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/caching/unit_of_work.py +2 -4
  18. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/cli/project.py +11 -10
  19. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/generation.py +46 -36
  20. python_ddd_framework-0.6.0/src/python_ddd_framework/developer_kit/publication.py +442 -0
  21. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/README.md +42 -3
  22. {python_ddd_framework-0.4.0 → 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 +31 -7
  23. {python_ddd_framework-0.4.0 → 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
  24. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/AGENTS.md +21 -3
  25. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/docs/architecture.md +18 -1
  26. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/docs/development.md +74 -3
  27. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/diagnostics/source.py +14 -1
  28. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/domain/aggregates.py +5 -12
  29. python_ddd_framework-0.6.0/src/python_ddd_framework/domain/event_values.py +124 -0
  30. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/events/runtime.py +2 -7
  31. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/events/unit_of_work.py +1 -4
  32. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/action.py +2 -1
  33. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/adapter.py +11 -117
  34. python_ddd_framework-0.6.0/src/python_ddd_framework/fastapi/application_services.py +287 -0
  35. python_ddd_framework-0.6.0/src/python_ddd_framework/fastapi/error_handlers.py +128 -0
  36. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/realtime/runtime.py +1 -1
  37. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/request_context.py +2 -5
  38. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/routing.py +4 -10
  39. python_ddd_framework-0.6.0/src/python_ddd_framework/fastapi/service_endpoints.py +182 -0
  40. python_ddd_framework-0.6.0/src/python_ddd_framework/fastapi/service_routes.py +237 -0
  41. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/transfer.py +1 -1
  42. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/hosted_services/bridge.py +76 -21
  43. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/hosted_services/contracts.py +5 -1
  44. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/hosted_services/runtime.py +71 -17
  45. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/identity/__init__.py +21 -13
  46. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/identity/application.py +12 -66
  47. python_ddd_framework-0.6.0/src/python_ddd_framework/identity/contracts.py +75 -0
  48. python_ddd_framework-0.6.0/src/python_ddd_framework/identity/domain_rules.py +17 -0
  49. python_ddd_framework-0.6.0/src/python_ddd_framework/identity/dtos.py +152 -0
  50. python_ddd_framework-0.6.0/src/python_ddd_framework/identity/extensions.py +9 -0
  51. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/identity/management.py +28 -25
  52. python_ddd_framework-0.6.0/src/python_ddd_framework/identity/models.py +86 -0
  53. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/identity/module.py +3 -4
  54. python_ddd_framework-0.6.0/src/python_ddd_framework/identity/options.py +54 -0
  55. python_ddd_framework-0.6.0/src/python_ddd_framework/identity/seeding.py +59 -0
  56. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/identity/services.py +1 -1
  57. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/identity/sqlalchemy/module.py +9 -6
  58. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/identity/sqlalchemy/repository.py +4 -5
  59. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/identity/sqlalchemy/session_security.py +1 -3
  60. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/identity/sqlalchemy/stores.py +35 -47
  61. python_ddd_framework-0.6.0/src/python_ddd_framework/identity/stores.py +120 -0
  62. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/identity/tokens.py +1 -1
  63. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/invocation/callables.py +1 -1
  64. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/invocation/dispatcher.py +1 -1
  65. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/invocation/entrypoints.py +2 -1
  66. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/invocation/function_runtime.py +2 -2
  67. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/invocation/interception.py +1 -1
  68. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/invocation/managed_proxy.py +2 -1
  69. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/invocation/managed_services.py +8 -14
  70. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/invocation/methods.py +2 -7
  71. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/invocation/module.py +1 -1
  72. python_ddd_framework-0.4.0/src/python_ddd_framework/application_services/invocation.py → python_ddd_framework-0.6.0/src/python_ddd_framework/invocation/runtime.py +94 -161
  73. python_ddd_framework-0.6.0/src/python_ddd_framework/invocation/scopes.py +91 -0
  74. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/lifecycle/participants.py +4 -0
  75. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/messaging/channel.py +35 -8
  76. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/messaging/contracts.py +9 -0
  77. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/messaging/module.py +13 -0
  78. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/messaging/runtime.py +17 -2
  79. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/modularity/discovery.py +2 -7
  80. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/modularity/graph.py +2 -8
  81. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/observability/logging.py +1 -1
  82. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/observability/tracing.py +1 -1
  83. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/redis/cache.py +2 -0
  84. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/redis/notification_runtime.py +1 -1
  85. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/services/arbitration.py +1 -20
  86. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/services/composition.py +71 -2
  87. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/services/provider.py +23 -1
  88. python_ddd_framework-0.6.0/src/python_ddd_framework/services/relocation.py +96 -0
  89. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/refresh.py +1 -1
  90. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/sqlalchemy/store.py +1 -1
  91. python_ddd_framework-0.6.0/src/python_ddd_framework/sqlalchemy/metadata.py +278 -0
  92. python_ddd_framework-0.6.0/src/python_ddd_framework/sqlalchemy/metadata_builder.py +234 -0
  93. python_ddd_framework-0.6.0/src/python_ddd_framework/sqlalchemy/metadata_fingerprint.py +108 -0
  94. python_ddd_framework-0.6.0/src/python_ddd_framework/sqlalchemy/metadata_ownership.py +73 -0
  95. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/sqlalchemy/migration.py +2 -1
  96. python_ddd_framework-0.6.0/src/python_ddd_framework/sqlalchemy/migration_sources.py +38 -0
  97. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/sqlalchemy/module.py +2 -1
  98. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/sqlalchemy/unit_of_work.py +1 -1
  99. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/unit_of_work/contracts.py +68 -7
  100. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/unit_of_work/manager.py +4 -7
  101. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/unit_of_work/module.py +1 -1
  102. python_ddd_framework-0.4.0/src/python_ddd_framework/fastapi/application_services.py +0 -672
  103. python_ddd_framework-0.4.0/src/python_ddd_framework/identity/contracts.py +0 -448
  104. python_ddd_framework-0.4.0/src/python_ddd_framework/sqlalchemy/metadata.py +0 -680
  105. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/LICENSE +0 -0
  106. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/__init__.py +0 -0
  107. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/application/__init__.py +0 -0
  108. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/application/build_spec.py +0 -0
  109. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/application/builder.py +0 -0
  110. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/application/composition.py +0 -0
  111. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/application/runtime_hooks.py +0 -0
  112. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/application/state.py +0 -0
  113. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/application_services/__init__.py +0 -0
  114. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/application_services/catalog.py +0 -0
  115. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/application_services/contracts.py +0 -0
  116. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/application_services/errors.py +0 -0
  117. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/application_services/pagination.py +0 -0
  118. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/auditing/__init__.py +0 -0
  119. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/auditing/contracts.py +0 -0
  120. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/auditing/control.py +0 -0
  121. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/auditing/module.py +0 -0
  122. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/auditing/sqlalchemy/__init__.py +0 -0
  123. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/auditing/sqlalchemy/migrations/0001_auditing.py +0 -0
  124. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/auditing/sqlalchemy/migrations/__init__.py +0 -0
  125. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/auditing/sqlalchemy/models.py +0 -0
  126. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/auditing/sqlalchemy/module.py +0 -0
  127. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/auditing/sqlalchemy/store.py +0 -0
  128. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/authorization/__init__.py +0 -0
  129. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/authorization/catalog.py +0 -0
  130. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/authorization/contracts.py +0 -0
  131. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/authorization/definition_discovery.py +0 -0
  132. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/authorization/definitions.py +0 -0
  133. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/authorization/errors.py +0 -0
  134. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/authorization/options.py +0 -0
  135. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_execution/__init__.py +0 -0
  136. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_execution/application.py +0 -0
  137. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_execution/child.py +0 -0
  138. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_execution/contracts.py +0 -0
  139. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_execution/declarations.py +0 -0
  140. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_execution/lifecycle.py +0 -0
  141. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_execution/locks.py +0 -0
  142. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_execution/management.py +0 -0
  143. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_execution/module.py +0 -0
  144. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_execution/permissions.py +0 -0
  145. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_jobs/__init__.py +0 -0
  146. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_jobs/catalog.py +0 -0
  147. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_jobs/contracts.py +0 -0
  148. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_jobs/declaration.py +0 -0
  149. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_jobs/errors.py +0 -0
  150. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_jobs/pgqueuer/UPSTREAM_LICENSE.txt +0 -0
  151. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_jobs/pgqueuer/__init__.py +0 -0
  152. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_jobs/pgqueuer/migrations/0001_pgqueuer_1_3_2.py +0 -0
  153. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_jobs/pgqueuer/migrations/__init__.py +0 -0
  154. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_jobs/pgqueuer/module.py +0 -0
  155. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_jobs/pgqueuer/options.py +0 -0
  156. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_jobs/pgqueuer/runtime.py +0 -0
  157. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_jobs/pgqueuer/sql/pgqueuer_1_3_2_install.sql +0 -0
  158. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_jobs/pgqueuer/supervision.py +0 -0
  159. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_workers/__init__.py +0 -0
  160. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_workers/catalog.py +0 -0
  161. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_workers/contracts.py +0 -0
  162. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/background_workers/errors.py +0 -0
  163. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/caching/__init__.py +0 -0
  164. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/caching/contracts.py +0 -0
  165. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/caching/errors.py +0 -0
  166. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/caching/module.py +0 -0
  167. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/caching/naming.py +0 -0
  168. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/caching/options.py +0 -0
  169. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/cli/__init__.py +0 -0
  170. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/cli/development.py +0 -0
  171. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/cli/errors.py +0 -0
  172. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/cli/inspection.py +0 -0
  173. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/cli/runtime.py +0 -0
  174. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/configuration/__init__.py +0 -0
  175. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/configuration/composition.py +0 -0
  176. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/configuration/contracts.py +0 -0
  177. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/configuration/dotenv_source.py +0 -0
  178. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/configuration/environment_source.py +0 -0
  179. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/configuration/immutability.py +0 -0
  180. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/configuration/input_shape.py +0 -0
  181. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/configuration/merge.py +0 -0
  182. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/configuration/root.py +0 -0
  183. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/configuration/sources.py +0 -0
  184. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/configuration/values.py +0 -0
  185. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/configuration/yaml_source.py +0 -0
  186. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/__init__.py +0 -0
  187. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/project_metadata.py +0 -0
  188. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/source.py +0 -0
  189. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/basic/cookiecutter.json +0 -0
  190. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/basic/{{cookiecutter.module_name}}/README.md +0 -0
  191. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/basic/{{cookiecutter.module_name}}/__init__.py.jinja +0 -0
  192. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/basic/{{cookiecutter.module_name}}/contracts/__init__.py.jinja +0 -0
  193. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/basic/{{cookiecutter.module_name}}/contracts/conversion_service.py.jinja +0 -0
  194. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/basic/{{cookiecutter.module_name}}/module.py.jinja +0 -0
  195. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/basic/{{cookiecutter.module_name}}/services/__init__.py.jinja +0 -0
  196. {python_ddd_framework-0.4.0 → 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
  197. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/cookiecutter.json +0 -0
  198. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/__init__.py.jinja +0 -0
  199. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/__init__.py.jinja +0 -0
  200. {python_ddd_framework-0.4.0 → 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
  201. {python_ddd_framework-0.4.0 → 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
  202. {python_ddd_framework-0.4.0 → 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
  203. {python_ddd_framework-0.4.0 → 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
  204. {python_ddd_framework-0.4.0 → 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
  205. {python_ddd_framework-0.4.0 → 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
  206. {python_ddd_framework-0.4.0 → 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
  207. {python_ddd_framework-0.4.0 → 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
  208. {python_ddd_framework-0.4.0 → 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
  209. {python_ddd_framework-0.4.0 → 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
  210. {python_ddd_framework-0.4.0 → 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
  211. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/caching/__init__.py.jinja +0 -0
  212. {python_ddd_framework-0.4.0 → 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
  213. {python_ddd_framework-0.4.0 → 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
  214. {python_ddd_framework-0.4.0 → 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
  215. {python_ddd_framework-0.4.0 → 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
  216. {python_ddd_framework-0.4.0 → 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
  217. {python_ddd_framework-0.4.0 → 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 +2 -2
  218. {python_ddd_framework-0.4.0 → 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
  219. {python_ddd_framework-0.4.0 → 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
  220. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/interceptors/__init__.py.jinja +0 -0
  221. {python_ddd_framework-0.4.0 → 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
  222. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/module.py.jinja +0 -0
  223. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/options/__init__.py.jinja +0 -0
  224. {python_ddd_framework-0.4.0 → 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
  225. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/services/__init__.py.jinja +0 -0
  226. {python_ddd_framework-0.4.0 → 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
  227. {python_ddd_framework-0.4.0 → 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
  228. {python_ddd_framework-0.4.0 → 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
  229. {python_ddd_framework-0.4.0 → 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
  230. {python_ddd_framework-0.4.0 → 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
  231. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/__init__.py.jinja +0 -0
  232. {python_ddd_framework-0.4.0 → 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
  233. {python_ddd_framework-0.4.0 → 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
  234. {python_ddd_framework-0.4.0 → 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
  235. {python_ddd_framework-0.4.0 → 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
  236. {python_ddd_framework-0.4.0 → 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
  237. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/module.py.jinja +0 -0
  238. {python_ddd_framework-0.4.0 → 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
  239. {python_ddd_framework-0.4.0 → 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
  240. {python_ddd_framework-0.4.0 → 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
  241. {python_ddd_framework-0.4.0 → 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
  242. {python_ddd_framework-0.4.0 → 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
  243. {python_ddd_framework-0.4.0 → 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
  244. {python_ddd_framework-0.4.0 → 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
  245. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/__init__.py.jinja +0 -0
  246. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/entities/__init__.py.jinja +0 -0
  247. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/entities/order.py.jinja +0 -0
  248. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/events/__init__.py.jinja +0 -0
  249. {python_ddd_framework-0.4.0 → 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
  250. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/module.py.jinja +0 -0
  251. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/repositories/__init__.py.jinja +0 -0
  252. {python_ddd_framework-0.4.0 → 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
  253. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/seeding/__init__.py.jinja +0 -0
  254. {python_ddd_framework-0.4.0 → 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
  255. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/services/__init__.py.jinja +0 -0
  256. {python_ddd_framework-0.4.0 → 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
  257. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/settings/__init__.py.jinja +0 -0
  258. {python_ddd_framework-0.4.0 → 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
  259. {python_ddd_framework-0.4.0 → 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
  260. {python_ddd_framework-0.4.0 → 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
  261. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/__init__.py.jinja +0 -0
  262. {python_ddd_framework-0.4.0 → 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
  263. {python_ddd_framework-0.4.0 → 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
  264. {python_ddd_framework-0.4.0 → 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
  265. {python_ddd_framework-0.4.0 → 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
  266. {python_ddd_framework-0.4.0 → 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
  267. {python_ddd_framework-0.4.0 → 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
  268. {python_ddd_framework-0.4.0 → 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
  269. {python_ddd_framework-0.4.0 → 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
  270. {python_ddd_framework-0.4.0 → 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
  271. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/module.py.jinja +0 -0
  272. {python_ddd_framework-0.4.0 → 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
  273. {python_ddd_framework-0.4.0 → 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
  274. {python_ddd_framework-0.4.0 → 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
  275. {python_ddd_framework-0.4.0 → 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
  276. {python_ddd_framework-0.4.0 → 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
  277. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/__init__.py.jinja +0 -0
  278. {python_ddd_framework-0.4.0 → 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
  279. {python_ddd_framework-0.4.0 → 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
  280. {python_ddd_framework-0.4.0 → 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
  281. {python_ddd_framework-0.4.0 → 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
  282. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/module.py.jinja +0 -0
  283. {python_ddd_framework-0.4.0 → 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
  284. {python_ddd_framework-0.4.0 → 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
  285. {python_ddd_framework-0.4.0 → 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
  286. {python_ddd_framework-0.4.0 → 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
  287. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/sqlalchemy/__init__.py.jinja +0 -0
  288. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/sqlalchemy/migrations/__init__.py.jinja +0 -0
  289. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/sqlalchemy/models/__init__.py.jinja +0 -0
  290. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/sqlalchemy/models/base.py.jinja +0 -0
  291. {python_ddd_framework-0.4.0 → 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
  292. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/sqlalchemy/module.py.jinja +0 -0
  293. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/sqlalchemy/repositories/__init__.py.jinja +0 -0
  294. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/tests/__init__.py.jinja +0 -0
  295. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/tests/test_domain.py.jinja +0 -0
  296. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/project/cookiecutter.json +0 -0
  297. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/README.md +0 -0
  298. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/.dockerignore +0 -0
  299. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/.gitignore +0 -0
  300. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/.python-version +0 -0
  301. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/Dockerfile +0 -0
  302. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/app.development.yaml.jinja +0 -0
  303. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/compose.dev.yaml.jinja +0 -0
  304. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/compose.production.yaml.jinja +0 -0
  305. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/pyproject.toml.jinja +0 -0
  306. {python_ddd_framework-0.4.0 → 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
  307. {python_ddd_framework-0.4.0 → 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
  308. {python_ddd_framework-0.4.0 → 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
  309. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/tests/conftest.py.jinja +0 -0
  310. {python_ddd_framework-0.4.0 → 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
  311. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/scripts/.gitkeep +0 -0
  312. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/developer_kit/wiring.py +0 -0
  313. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/diagnostics/__init__.py +0 -0
  314. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/diagnostics/journal.py +0 -0
  315. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/diagnostics/model.py +0 -0
  316. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/distributed_lock/__init__.py +0 -0
  317. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/distributed_lock/contracts.py +0 -0
  318. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/distributed_lock/options.py +0 -0
  319. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/domain/__init__.py +0 -0
  320. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/domain/entities.py +0 -0
  321. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/domain/errors.py +0 -0
  322. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/domain/services.py +0 -0
  323. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/domain/value_objects.py +0 -0
  324. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/errors/__init__.py +0 -0
  325. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/errors/base.py +0 -0
  326. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/errors/business.py +0 -0
  327. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/errors/configuration.py +0 -0
  328. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/errors/diagnostics.py +0 -0
  329. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/errors/lifecycle.py +0 -0
  330. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/errors/modularity.py +0 -0
  331. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/errors/services.py +0 -0
  332. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/events/__init__.py +0 -0
  333. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/events/aggregate.py +0 -0
  334. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/events/catalog.py +0 -0
  335. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/events/contracts.py +0 -0
  336. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/events/contribution.py +0 -0
  337. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/events/discovery.py +0 -0
  338. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/events/entities.py +0 -0
  339. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/events/errors.py +0 -0
  340. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/events/module.py +0 -0
  341. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/events/subscription.py +0 -0
  342. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/extensions/__init__.py +0 -0
  343. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/extensions/catalog.py +0 -0
  344. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/extensions/contracts.py +0 -0
  345. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/extensions/models.py +0 -0
  346. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/extensions/module.py +0 -0
  347. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/__init__.py +0 -0
  348. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/background.py +0 -0
  349. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/contracts.py +0 -0
  350. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/errors.py +0 -0
  351. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/filters.py +0 -0
  352. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/health.py +0 -0
  353. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/http.py +0 -0
  354. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/http_router.py +0 -0
  355. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/manual_action.py +0 -0
  356. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/middleware.py +0 -0
  357. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/module.py +0 -0
  358. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/parameters.py +0 -0
  359. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/realtime/__init__.py +0 -0
  360. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/realtime/authentication.py +0 -0
  361. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/realtime/connection.py +0 -0
  362. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/realtime/module.py +0 -0
  363. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/realtime/options.py +0 -0
  364. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/route_integrity.py +0 -0
  365. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/server.py +0 -0
  366. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/settings.py +0 -0
  367. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/tracing.py +0 -0
  368. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/upload_limits.py +0 -0
  369. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/fastapi/uploads.py +0 -0
  370. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/hosted_services/__init__.py +0 -0
  371. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/hosted_services/catalog.py +0 -0
  372. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/hosted_services/declarations.py +0 -0
  373. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/hosted_services/errors.py +0 -0
  374. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/hosted_services/module.py +0 -0
  375. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/hosted_services/options.py +0 -0
  376. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/hosted_services/state.py +0 -0
  377. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/hosting/__init__.py +0 -0
  378. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/hosting/instance.py +0 -0
  379. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/identity/errors.py +0 -0
  380. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/identity/http_api.py +0 -0
  381. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/identity/passwords.py +0 -0
  382. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/identity/permissions.py +0 -0
  383. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/identity/sqlalchemy/__init__.py +0 -0
  384. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/identity/sqlalchemy/migrations/0001_identity.py +0 -0
  385. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/identity/sqlalchemy/migrations/0002_physical_delete.py +0 -0
  386. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/identity/sqlalchemy/migrations/0003_extra_properties.py +0 -0
  387. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/identity/sqlalchemy/migrations/0004_concurrency_version.py +0 -0
  388. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/identity/sqlalchemy/migrations/__init__.py +0 -0
  389. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/identity/sqlalchemy/models.py +0 -0
  390. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/invocation/__init__.py +0 -0
  391. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/invocation/arguments.py +0 -0
  392. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/invocation/contracts.py +0 -0
  393. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/invocation/contribution.py +0 -0
  394. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/invocation/entries.py +0 -0
  395. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/invocation/execution.py +0 -0
  396. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/invocation/interceptors.py +0 -0
  397. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/invocation/policies.py +0 -0
  398. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/invocation/signature.py +0 -0
  399. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/invocation/validation.py +0 -0
  400. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/lifecycle/__init__.py +0 -0
  401. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/lifecycle/composition.py +0 -0
  402. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/lifecycle/context.py +0 -0
  403. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/lifecycle/runtime.py +0 -0
  404. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/lifecycle/state.py +0 -0
  405. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/messaging/__init__.py +0 -0
  406. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/messaging/options.py +0 -0
  407. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/messaging/receipt.py +0 -0
  408. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/modularity/__init__.py +0 -0
  409. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/modularity/contracts.py +0 -0
  410. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/modularity/registry.py +0 -0
  411. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/modularity/selection.py +0 -0
  412. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/notifications/__init__.py +0 -0
  413. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/notifications/catalog.py +0 -0
  414. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/notifications/contracts.py +0 -0
  415. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/notifications/declarations.py +0 -0
  416. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/notifications/module.py +0 -0
  417. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/observability/__init__.py +0 -0
  418. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/observability/context.py +0 -0
  419. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/observability/export.py +0 -0
  420. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/observability/formatting.py +0 -0
  421. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/observability/options.py +0 -0
  422. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/options/__init__.py +0 -0
  423. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/options/aliases.py +0 -0
  424. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/options/contribution.py +0 -0
  425. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/options/immutability.py +0 -0
  426. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/options/input_keys.py +0 -0
  427. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/options/issues.py +0 -0
  428. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/options/models.py +0 -0
  429. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/options/registry.py +0 -0
  430. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/options/schema.py +0 -0
  431. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/options/validation.py +0 -0
  432. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/py.typed +0 -0
  433. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/realtime/__init__.py +0 -0
  434. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/realtime/contracts.py +0 -0
  435. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/realtime/diagnostics.py +0 -0
  436. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/realtime/messages.py +0 -0
  437. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/redis/__init__.py +0 -0
  438. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/redis/cache_scripts.py +0 -0
  439. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/redis/distributed_lock.py +0 -0
  440. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/redis/lease_lock.py +0 -0
  441. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/redis/module.py +0 -0
  442. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/redis/notifications.py +0 -0
  443. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/redis/options.py +0 -0
  444. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/redis/runtime.py +0 -0
  445. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/seeding/__init__.py +0 -0
  446. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/seeding/contracts.py +0 -0
  447. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/seeding/module.py +0 -0
  448. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/seeding/runtime.py +0 -0
  449. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/services/__init__.py +0 -0
  450. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/services/binding.py +0 -0
  451. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/services/contribution.py +0 -0
  452. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/services/convention.py +0 -0
  453. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/services/convention_contracts.py +0 -0
  454. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/services/exposure.py +0 -0
  455. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/services/fixed_lifetime.py +0 -0
  456. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/services/framework_provider.py +0 -0
  457. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/services/native_graph.py +0 -0
  458. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/services/registration.py +0 -0
  459. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/services/repository.py +0 -0
  460. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/services/runtime.py +0 -0
  461. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/__init__.py +0 -0
  462. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/application.py +0 -0
  463. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/binding.py +0 -0
  464. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/catalog.py +0 -0
  465. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/changes.py +0 -0
  466. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/contracts.py +0 -0
  467. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/declarations.py +0 -0
  468. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/definition_discovery.py +0 -0
  469. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/definitions.py +0 -0
  470. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/errors.py +0 -0
  471. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/handlers.py +0 -0
  472. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/management.py +0 -0
  473. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/manager.py +0 -0
  474. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/module.py +0 -0
  475. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/notifications.py +0 -0
  476. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/permissions.py +0 -0
  477. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/provider.py +0 -0
  478. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/refresh_module.py +0 -0
  479. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/sqlalchemy/__init__.py +0 -0
  480. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/sqlalchemy/migrations/0001_settings.py +0 -0
  481. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/sqlalchemy/migrations/0002_physical_delete.py +0 -0
  482. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/sqlalchemy/migrations/0003_version_tokens.py +0 -0
  483. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/sqlalchemy/migrations/__init__.py +0 -0
  484. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/sqlalchemy/models.py +0 -0
  485. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/sqlalchemy/module.py +0 -0
  486. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/store.py +0 -0
  487. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/settings/values.py +0 -0
  488. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/sqlalchemy/__init__.py +0 -0
  489. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/sqlalchemy/alembic_runtime/__init__.py +0 -0
  490. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/sqlalchemy/alembic_runtime/env.py +0 -0
  491. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/sqlalchemy/alembic_runtime/script.py.mako +0 -0
  492. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/sqlalchemy/auditing.py +0 -0
  493. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/sqlalchemy/errors.py +0 -0
  494. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/sqlalchemy/extensions.py +0 -0
  495. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/sqlalchemy/migration_operations.py +0 -0
  496. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/sqlalchemy/migration_options.py +0 -0
  497. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/sqlalchemy/module_migration.py +0 -0
  498. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/sqlalchemy/options.py +0 -0
  499. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/sqlalchemy/repository.py +0 -0
  500. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/sqlalchemy/runtime.py +0 -0
  501. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/sqlalchemy/session_provider.py +0 -0
  502. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/testing/__init__.py +0 -0
  503. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/testing/runtime.py +0 -0
  504. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/unit_of_work/__init__.py +0 -0
  505. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/unit_of_work/errors.py +0 -0
  506. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/unit_of_work/lifecycle.py +0 -0
  507. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/unit_of_work/options.py +0 -0
  508. {python_ddd_framework-0.4.0 → python_ddd_framework-0.6.0}/src/python_ddd_framework/validation/__init__.py +0 -0
  509. {python_ddd_framework-0.4.0 → 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.4.0
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.4:** This release introduces capability-based composition, current service and Identity APIs, and the `backend/` consumer layout with basic/DDD module templates. Existing applications must apply the migration instructions below. 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,20 @@ 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
+
441
+ #### Lifecycle shutdown migration (0.5)
442
+
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.
444
+
445
+ Move business calls needed before resource release into the optional `HostedService.stopping(context, reason)` hook. Use its separate context for SDK/thread callbacks; the startup context stays closed. Only successfully started services receive the hook. `stop` still cleans every touched service, including partial startup failures. Each hook uses the existing `shutdown_timeout`; cancellation waits for actual cleanup and is not a total shutdown deadline.
446
+
447
+ Channels that must accept these callbacks declare `stopping_owners=(ServiceType,)` and pass the current hook context with `send(value, stopping=context)` or `submit(value, stopping=context)`. The channel Module must depend on the declared service owner. The default permits no shutdown input. Capacity, receipts and per-call scope/UoW behavior remain unchanged; HTTP/WebSocket retain native transport shutdown. See the [lifecycle decision](docs/adr/ADR-033-staged-lifecycle-shutdown.md) and [usage guide](docs/development.md#hostedservice-收尾).
448
+
371
449
  #### Additional fixes in 0.4.0
372
450
 
373
451
  `BackgroundJobRetryPolicy.max_attempts` now counts all executions, including the first. A value of `2` permits two executions; `1` disables failure retries. The 0.3.2 PgQueuer mapping allowed one extra execution. If your application intentionally relied on that behavior, increase its configured total by one. `BackgroundJobContext.attempt` remains zero-based. No queue schema migration is required.
@@ -447,7 +525,7 @@ Do not remove durable job payload versions merely because their Python APIs were
447
525
  <details>
448
526
  <summary>For maintainers: publishing a changed version</summary>
449
527
 
450
- 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.
451
529
 
452
530
  </details>
453
531
 
@@ -463,7 +541,7 @@ The engineering guides below are maintained in Chinese in the private GitHub rep
463
541
  | Check release evidence and remaining validation limits | [Status and validation](https://github.com/componet-architecture/python-ddd-framework/blob/main/docs/status.md) |
464
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#重构的最短阅读路径) |
465
543
 
466
- 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.
467
545
 
468
546
  ## License
469
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.4:** This release introduces capability-based composition, current service and Identity APIs, and the `backend/` consumer layout with basic/DDD module templates. Existing applications must apply the migration instructions below. 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,20 @@ 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
+
397
+ #### Lifecycle shutdown migration (0.5)
398
+
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.
400
+
401
+ Move business calls needed before resource release into the optional `HostedService.stopping(context, reason)` hook. Use its separate context for SDK/thread callbacks; the startup context stays closed. Only successfully started services receive the hook. `stop` still cleans every touched service, including partial startup failures. Each hook uses the existing `shutdown_timeout`; cancellation waits for actual cleanup and is not a total shutdown deadline.
402
+
403
+ Channels that must accept these callbacks declare `stopping_owners=(ServiceType,)` and pass the current hook context with `send(value, stopping=context)` or `submit(value, stopping=context)`. The channel Module must depend on the declared service owner. The default permits no shutdown input. Capacity, receipts and per-call scope/UoW behavior remain unchanged; HTTP/WebSocket retain native transport shutdown. See the [lifecycle decision](docs/adr/ADR-033-staged-lifecycle-shutdown.md) and [usage guide](docs/development.md#hostedservice-收尾).
404
+
327
405
  #### Additional fixes in 0.4.0
328
406
 
329
407
  `BackgroundJobRetryPolicy.max_attempts` now counts all executions, including the first. A value of `2` permits two executions; `1` disables failure retries. The 0.3.2 PgQueuer mapping allowed one extra execution. If your application intentionally relied on that behavior, increase its configured total by one. `BackgroundJobContext.attempt` remains zero-based. No queue schema migration is required.
@@ -403,7 +481,7 @@ Do not remove durable job payload versions merely because their Python APIs were
403
481
  <details>
404
482
  <summary>For maintainers: publishing a changed version</summary>
405
483
 
406
- 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.
407
485
 
408
486
  </details>
409
487
 
@@ -419,7 +497,7 @@ The engineering guides below are maintained in Chinese in the private GitHub rep
419
497
  | Check release evidence and remaining validation limits | [Status and validation](https://github.com/componet-architecture/python-ddd-framework/blob/main/docs/status.md) |
420
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#重构的最短阅读路径) |
421
499
 
422
- 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.
423
501
 
424
502
  ## License
425
503
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "python-ddd-framework"
3
- version = "0.4.0"
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.4.0"
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"
@@ -3,6 +3,8 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  import asyncio
6
+ from collections.abc import Awaitable, Callable, Iterable
7
+ from functools import partial
6
8
  from typing import Never
7
9
  from uuid import UUID
8
10
 
@@ -155,27 +157,25 @@ class Application:
155
157
 
156
158
  async def _stop_runtimes(self, reason: ShutdownReason) -> tuple[BaseException, ...]:
157
159
  failures: list[BaseException] = []
158
- # 先统一关闭外部准入,再逆序排空依赖;一个能力失败不能阻止其余能力释放资源。
159
- # stop 只交给触达过 start 的参与者;预启动入口已接受的资源由独立 drain 收口。
160
+ # 每个阶段都是全局屏障;收尾与排空完成前,不释放任何参与者的依赖资源。
161
+ # 用户钩子只交给触达过 start 的参与者;预启动请求仍由独立 drain 收口。
160
162
  participants = tuple(reversed(self._root.touched_runtimes))
161
- for participant in participants:
162
- if participant.close_admission is not None:
163
- try:
164
- participant.close_admission()
165
- except BaseException as error:
166
- failures.append(error)
167
- for participant in participants:
168
- try:
169
- failures.extend(await participant.stop(reason))
170
- except BaseException as error:
171
- failures.append(error)
163
+ failures.extend(_call_shutdown_callbacks(item.quiesce for item in participants))
164
+ failures.extend(
165
+ await _await_shutdown_callbacks(
166
+ partial(item.stopping, reason) for item in participants if item.stopping is not None
167
+ )
168
+ )
169
+ failures.extend(_call_shutdown_callbacks(item.close_admission for item in participants))
170
+ failures.extend(
171
+ await _await_shutdown_callbacks(
172
+ item.drain for item in reversed(self._root.runtimes) if item.drain is not None
173
+ )
174
+ )
175
+ failures.extend(
176
+ await _await_shutdown_callbacks(partial(item.stop, reason) for item in participants)
177
+ )
172
178
  self._root.touched_runtimes.clear()
173
- for participant in reversed(self._root.runtimes):
174
- if participant.drain is not None:
175
- try:
176
- await participant.drain()
177
- except BaseException as error:
178
- failures.append(error)
179
179
  return tuple(failures)
180
180
 
181
181
  async def stop(self) -> None:
@@ -352,3 +352,30 @@ class Application:
352
352
  if not watcher.done():
353
353
  watcher.cancel()
354
354
  await asyncio.gather(*watchers, return_exceptions=True)
355
+
356
+
357
+ def _call_shutdown_callbacks(
358
+ callbacks: Iterable[Callable[[], None] | None],
359
+ ) -> tuple[BaseException, ...]:
360
+ failures: list[BaseException] = []
361
+ for callback in callbacks:
362
+ if callback is not None:
363
+ try:
364
+ callback()
365
+ except BaseException as error:
366
+ failures.append(error)
367
+ return tuple(failures)
368
+
369
+
370
+ async def _await_shutdown_callbacks(
371
+ callbacks: Iterable[Callable[[], Awaitable[tuple[BaseException, ...] | None]]],
372
+ ) -> tuple[BaseException, ...]:
373
+ failures: list[BaseException] = []
374
+ for callback in callbacks:
375
+ try:
376
+ result = await callback()
377
+ if result is not None:
378
+ failures.extend(result)
379
+ except BaseException as error:
380
+ failures.append(error)
381
+ return tuple(failures)
@@ -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 (