python-ddd-framework 0.4.0__tar.gz → 0.5.1__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 (487) hide show
  1. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/PKG-INFO +10 -2
  2. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/README.md +9 -1
  3. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/pyproject.toml +1 -1
  4. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/pyproject.toml.orig +1 -1
  5. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/application/runtime.py +46 -19
  6. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/application_services/invocation.py +88 -25
  7. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/background_execution/local.py +20 -1
  8. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/background_execution/processes.py +11 -1
  9. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/background_workers/runtime.py +10 -1
  10. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/README.md +2 -1
  11. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/hosted_services/order_integration_service.py.jinja +31 -7
  12. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/AGENTS.md +7 -0
  13. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/docs/architecture.md +2 -1
  14. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/docs/development.md +11 -1
  15. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/hosted_services/bridge.py +75 -16
  16. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/hosted_services/contracts.py +5 -1
  17. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/hosted_services/runtime.py +71 -17
  18. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/lifecycle/participants.py +4 -0
  19. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/messaging/channel.py +34 -7
  20. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/messaging/contracts.py +9 -0
  21. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/messaging/module.py +13 -0
  22. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/messaging/runtime.py +16 -1
  23. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/LICENSE +0 -0
  24. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/__init__.py +0 -0
  25. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/application/__init__.py +0 -0
  26. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/application/build_spec.py +0 -0
  27. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/application/builder.py +0 -0
  28. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/application/composition.py +0 -0
  29. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/application/runtime_hooks.py +0 -0
  30. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/application/state.py +0 -0
  31. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/application_services/__init__.py +0 -0
  32. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/application_services/bindings.py +0 -0
  33. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/application_services/catalog.py +0 -0
  34. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/application_services/contracts.py +0 -0
  35. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/application_services/dispatcher.py +0 -0
  36. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/application_services/errors.py +0 -0
  37. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/application_services/module.py +0 -0
  38. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/application_services/pagination.py +0 -0
  39. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/auditing/__init__.py +0 -0
  40. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/auditing/contracts.py +0 -0
  41. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/auditing/control.py +0 -0
  42. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/auditing/module.py +0 -0
  43. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/auditing/sqlalchemy/__init__.py +0 -0
  44. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/auditing/sqlalchemy/migrations/0001_auditing.py +0 -0
  45. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/auditing/sqlalchemy/migrations/__init__.py +0 -0
  46. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/auditing/sqlalchemy/models.py +0 -0
  47. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/auditing/sqlalchemy/module.py +0 -0
  48. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/auditing/sqlalchemy/store.py +0 -0
  49. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/authorization/__init__.py +0 -0
  50. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/authorization/catalog.py +0 -0
  51. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/authorization/contracts.py +0 -0
  52. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/authorization/definition_discovery.py +0 -0
  53. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/authorization/definitions.py +0 -0
  54. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/authorization/errors.py +0 -0
  55. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/authorization/module.py +0 -0
  56. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/authorization/options.py +0 -0
  57. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/background_execution/__init__.py +0 -0
  58. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/background_execution/application.py +0 -0
  59. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/background_execution/child.py +0 -0
  60. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/background_execution/contracts.py +0 -0
  61. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/background_execution/declarations.py +0 -0
  62. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/background_execution/lifecycle.py +0 -0
  63. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/background_execution/locks.py +0 -0
  64. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/background_execution/management.py +0 -0
  65. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/background_execution/module.py +0 -0
  66. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/background_execution/permissions.py +0 -0
  67. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/background_jobs/__init__.py +0 -0
  68. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/background_jobs/catalog.py +0 -0
  69. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/background_jobs/contracts.py +0 -0
  70. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/background_jobs/declaration.py +0 -0
  71. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/background_jobs/errors.py +0 -0
  72. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/background_jobs/execution.py +0 -0
  73. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/background_jobs/pgqueuer/UPSTREAM_LICENSE.txt +0 -0
  74. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/background_jobs/pgqueuer/__init__.py +0 -0
  75. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/background_jobs/pgqueuer/enqueue.py +0 -0
  76. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/background_jobs/pgqueuer/migrations/0001_pgqueuer_1_3_2.py +0 -0
  77. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/background_jobs/pgqueuer/migrations/__init__.py +0 -0
  78. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/background_jobs/pgqueuer/module.py +0 -0
  79. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/background_jobs/pgqueuer/options.py +0 -0
  80. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/background_jobs/pgqueuer/runtime.py +0 -0
  81. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/background_jobs/pgqueuer/sql/pgqueuer_1_3_2_install.sql +0 -0
  82. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/background_jobs/pgqueuer/supervision.py +0 -0
  83. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/background_workers/__init__.py +0 -0
  84. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/background_workers/catalog.py +0 -0
  85. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/background_workers/contracts.py +0 -0
  86. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/background_workers/errors.py +0 -0
  87. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/background_workers/execution.py +0 -0
  88. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/caching/__init__.py +0 -0
  89. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/caching/contracts.py +0 -0
  90. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/caching/errors.py +0 -0
  91. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/caching/module.py +0 -0
  92. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/caching/naming.py +0 -0
  93. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/caching/options.py +0 -0
  94. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/caching/unit_of_work.py +0 -0
  95. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/cli/__init__.py +0 -0
  96. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/cli/development.py +0 -0
  97. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/cli/errors.py +0 -0
  98. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/cli/inspection.py +0 -0
  99. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/cli/project.py +0 -0
  100. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/cli/runtime.py +0 -0
  101. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/configuration/__init__.py +0 -0
  102. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/configuration/composition.py +0 -0
  103. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/configuration/contracts.py +0 -0
  104. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/configuration/dotenv_source.py +0 -0
  105. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/configuration/environment_source.py +0 -0
  106. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/configuration/immutability.py +0 -0
  107. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/configuration/input_shape.py +0 -0
  108. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/configuration/merge.py +0 -0
  109. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/configuration/root.py +0 -0
  110. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/configuration/sources.py +0 -0
  111. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/configuration/values.py +0 -0
  112. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/configuration/yaml_source.py +0 -0
  113. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/__init__.py +0 -0
  114. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/generation.py +0 -0
  115. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/project_metadata.py +0 -0
  116. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/source.py +0 -0
  117. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/basic/cookiecutter.json +0 -0
  118. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/basic/{{cookiecutter.module_name}}/README.md +0 -0
  119. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/basic/{{cookiecutter.module_name}}/__init__.py.jinja +0 -0
  120. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/basic/{{cookiecutter.module_name}}/contracts/__init__.py.jinja +0 -0
  121. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/basic/{{cookiecutter.module_name}}/contracts/conversion_service.py.jinja +0 -0
  122. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/basic/{{cookiecutter.module_name}}/module.py.jinja +0 -0
  123. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/basic/{{cookiecutter.module_name}}/services/__init__.py.jinja +0 -0
  124. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/basic/{{cookiecutter.module_name}}/services/default_conversion_service.py.jinja +0 -0
  125. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/cookiecutter.json +0 -0
  126. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/__init__.py.jinja +0 -0
  127. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/__init__.py.jinja +0 -0
  128. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/background_jobs/__init__.py.jinja +0 -0
  129. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/background_jobs/order_approval/__init__.py.jinja +0 -0
  130. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/background_jobs/order_approval/handler.py.jinja +0 -0
  131. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/background_jobs/order_approval/payload.py.jinja +0 -0
  132. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/background_jobs/order_statistics/__init__.py.jinja +0 -0
  133. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/background_jobs/order_statistics/handler.py.jinja +0 -0
  134. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/background_jobs/order_statistics/payload.py.jinja +0 -0
  135. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/background_jobs/order_statistics/schedule.py.jinja +0 -0
  136. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/background_workers/__init__.py.jinja +0 -0
  137. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/background_workers/order_maintenance_worker.py.jinja +0 -0
  138. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/background_workers/order_statistics_worker.py.jinja +0 -0
  139. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/caching/__init__.py.jinja +0 -0
  140. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/caching/order_cache.py.jinja +0 -0
  141. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/caching/statistics_cache.py.jinja +0 -0
  142. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/event_handlers/__init__.py.jinja +0 -0
  143. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/event_handlers/order_changed_handler.py.jinja +0 -0
  144. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/hosted_services/__init__.py.jinja +0 -0
  145. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/hosted_services/order_observation_handler.py.jinja +2 -2
  146. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/integration_services/__init__.py.jinja +0 -0
  147. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/integration_services/order_reporting_service.py.jinja +0 -0
  148. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/interceptors/__init__.py.jinja +0 -0
  149. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/interceptors/order_timing_interceptor.py.jinja +0 -0
  150. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/module.py.jinja +0 -0
  151. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/options/__init__.py.jinja +0 -0
  152. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/options/order_options.py.jinja +0 -0
  153. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/services/__init__.py.jinja +0 -0
  154. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/services/order_approval_service.py.jinja +0 -0
  155. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/services/order_management_service.py.jinja +0 -0
  156. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/services/order_query_service.py.jinja +0 -0
  157. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/setting_handlers/__init__.py.jinja +0 -0
  158. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application/setting_handlers/approval_setting_observer.py.jinja +0 -0
  159. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/__init__.py.jinja +0 -0
  160. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/inputs/__init__.py.jinja +0 -0
  161. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/inputs/approve_order.py.jinja +0 -0
  162. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/inputs/create_order.py.jinja +0 -0
  163. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/integration_services/__init__.py.jinja +0 -0
  164. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/integration_services/order_reporting_service.py.jinja +0 -0
  165. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/module.py.jinja +0 -0
  166. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/services/__init__.py.jinja +0 -0
  167. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/services/order_approval_service.py.jinja +0 -0
  168. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/services/order_management_service.py.jinja +0 -0
  169. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/services/order_query_service.py.jinja +0 -0
  170. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/views/__init__.py.jinja +0 -0
  171. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/views/order_statistics_snapshot.py.jinja +0 -0
  172. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/application_contracts/views/order_view.py.jinja +0 -0
  173. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/__init__.py.jinja +0 -0
  174. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/entities/__init__.py.jinja +0 -0
  175. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/entities/order.py.jinja +0 -0
  176. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/events/__init__.py.jinja +0 -0
  177. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/events/order_changed.py.jinja +0 -0
  178. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/module.py.jinja +0 -0
  179. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/repositories/__init__.py.jinja +0 -0
  180. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/repositories/order_repository.py.jinja +0 -0
  181. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/seeding/__init__.py.jinja +0 -0
  182. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/seeding/order_seed_contributor.py.jinja +0 -0
  183. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/services/__init__.py.jinja +0 -0
  184. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/services/order_approval_service.py.jinja +0 -0
  185. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/settings/__init__.py.jinja +0 -0
  186. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/settings/approval_settings.py.jinja +0 -0
  187. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/value_objects/__init__.py.jinja +0 -0
  188. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain/value_objects/order_title.py.jinja +0 -0
  189. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/__init__.py.jinja +0 -0
  190. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/constants/__init__.py.jinja +0 -0
  191. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/constants/order_constants.py.jinja +0 -0
  192. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/enums/__init__.py.jinja +0 -0
  193. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/enums/order_status.py.jinja +0 -0
  194. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/errors/__init__.py.jinja +0 -0
  195. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/errors/order_errors.py.jinja +0 -0
  196. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/messages/__init__.py.jinja +0 -0
  197. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/messages/order_messages.py.jinja +0 -0
  198. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/messages/order_observation.py.jinja +0 -0
  199. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/module.py.jinja +0 -0
  200. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/permissions/__init__.py.jinja +0 -0
  201. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/permissions/order_permission_provider.py.jinja +0 -0
  202. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/permissions/order_permissions.py.jinja +0 -0
  203. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/value_objects/__init__.py.jinja +0 -0
  204. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/domain_shared/value_objects/money.py.jinja +0 -0
  205. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/__init__.py.jinja +0 -0
  206. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/filters/__init__.py.jinja +0 -0
  207. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/filters/export_filter.py.jinja +0 -0
  208. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/models/__init__.py.jinja +0 -0
  209. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/models/refresh_orders.py.jinja +0 -0
  210. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/module.py.jinja +0 -0
  211. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/routers/__init__.py.jinja +0 -0
  212. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/routers/order_files.py.jinja +0 -0
  213. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/websockets/__init__.py.jinja +0 -0
  214. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/http_api/websockets/order_socket.py.jinja +0 -0
  215. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/sqlalchemy/__init__.py.jinja +0 -0
  216. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/sqlalchemy/migrations/__init__.py.jinja +0 -0
  217. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/sqlalchemy/models/__init__.py.jinja +0 -0
  218. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/sqlalchemy/models/base.py.jinja +0 -0
  219. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/sqlalchemy/models/order_model.py.jinja +0 -0
  220. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/sqlalchemy/module.py.jinja +0 -0
  221. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/sqlalchemy/repositories/__init__.py.jinja +0 -0
  222. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/sqlalchemy/repositories/order_repository.py.jinja +0 -0
  223. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/tests/__init__.py.jinja +0 -0
  224. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/module/{{cookiecutter.module_name}}/tests/test_domain.py.jinja +0 -0
  225. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/project/cookiecutter.json +0 -0
  226. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/README.md +0 -0
  227. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/.dockerignore +0 -0
  228. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/.gitignore +0 -0
  229. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/.python-version +0 -0
  230. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/Dockerfile +0 -0
  231. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/app.development.yaml.jinja +0 -0
  232. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/compose.dev.yaml.jinja +0 -0
  233. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/compose.production.yaml.jinja +0 -0
  234. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/pyproject.toml.jinja +0 -0
  235. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/src/host/__init__.py.jinja +0 -0
  236. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/src/host/main.py.jinja +0 -0
  237. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/src/host/module.py.jinja +0 -0
  238. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/tests/conftest.py.jinja +0 -0
  239. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/backend/tests/host/test_http.py.jinja +0 -0
  240. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/templates/project/{{cookiecutter.project_name}}/scripts/.gitkeep +0 -0
  241. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/developer_kit/wiring.py +0 -0
  242. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/diagnostics/__init__.py +0 -0
  243. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/diagnostics/journal.py +0 -0
  244. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/diagnostics/model.py +0 -0
  245. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/diagnostics/source.py +0 -0
  246. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/distributed_lock/__init__.py +0 -0
  247. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/distributed_lock/contracts.py +0 -0
  248. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/distributed_lock/options.py +0 -0
  249. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/domain/__init__.py +0 -0
  250. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/domain/aggregates.py +0 -0
  251. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/domain/entities.py +0 -0
  252. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/domain/errors.py +0 -0
  253. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/domain/services.py +0 -0
  254. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/domain/value_objects.py +0 -0
  255. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/errors/__init__.py +0 -0
  256. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/errors/base.py +0 -0
  257. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/errors/business.py +0 -0
  258. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/errors/configuration.py +0 -0
  259. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/errors/diagnostics.py +0 -0
  260. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/errors/lifecycle.py +0 -0
  261. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/errors/modularity.py +0 -0
  262. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/errors/services.py +0 -0
  263. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/events/__init__.py +0 -0
  264. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/events/aggregate.py +0 -0
  265. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/events/catalog.py +0 -0
  266. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/events/contracts.py +0 -0
  267. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/events/contribution.py +0 -0
  268. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/events/discovery.py +0 -0
  269. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/events/entities.py +0 -0
  270. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/events/errors.py +0 -0
  271. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/events/module.py +0 -0
  272. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/events/runtime.py +0 -0
  273. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/events/subscription.py +0 -0
  274. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/events/unit_of_work.py +0 -0
  275. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/extensions/__init__.py +0 -0
  276. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/extensions/catalog.py +0 -0
  277. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/extensions/contracts.py +0 -0
  278. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/extensions/models.py +0 -0
  279. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/extensions/module.py +0 -0
  280. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/fastapi/__init__.py +0 -0
  281. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/fastapi/action.py +0 -0
  282. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/fastapi/adapter.py +0 -0
  283. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/fastapi/application_services.py +0 -0
  284. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/fastapi/background.py +0 -0
  285. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/fastapi/contracts.py +0 -0
  286. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/fastapi/errors.py +0 -0
  287. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/fastapi/filters.py +0 -0
  288. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/fastapi/health.py +0 -0
  289. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/fastapi/http.py +0 -0
  290. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/fastapi/http_router.py +0 -0
  291. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/fastapi/manual_action.py +0 -0
  292. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/fastapi/middleware.py +0 -0
  293. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/fastapi/module.py +0 -0
  294. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/fastapi/parameters.py +0 -0
  295. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/fastapi/realtime/__init__.py +0 -0
  296. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/fastapi/realtime/authentication.py +0 -0
  297. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/fastapi/realtime/connection.py +0 -0
  298. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/fastapi/realtime/module.py +0 -0
  299. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/fastapi/realtime/options.py +0 -0
  300. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/fastapi/realtime/runtime.py +0 -0
  301. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/fastapi/request_context.py +0 -0
  302. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/fastapi/route_integrity.py +0 -0
  303. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/fastapi/routing.py +0 -0
  304. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/fastapi/server.py +0 -0
  305. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/fastapi/settings.py +0 -0
  306. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/fastapi/tracing.py +0 -0
  307. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/fastapi/transfer.py +0 -0
  308. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/fastapi/upload_limits.py +0 -0
  309. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/fastapi/uploads.py +0 -0
  310. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/hosted_services/__init__.py +0 -0
  311. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/hosted_services/catalog.py +0 -0
  312. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/hosted_services/declarations.py +0 -0
  313. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/hosted_services/errors.py +0 -0
  314. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/hosted_services/module.py +0 -0
  315. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/hosted_services/options.py +0 -0
  316. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/hosted_services/state.py +0 -0
  317. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/hosting/__init__.py +0 -0
  318. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/hosting/instance.py +0 -0
  319. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/identity/__init__.py +0 -0
  320. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/identity/application.py +0 -0
  321. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/identity/contracts.py +0 -0
  322. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/identity/errors.py +0 -0
  323. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/identity/http_api.py +0 -0
  324. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/identity/management.py +0 -0
  325. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/identity/module.py +0 -0
  326. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/identity/passwords.py +0 -0
  327. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/identity/permissions.py +0 -0
  328. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/identity/services.py +0 -0
  329. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/identity/sqlalchemy/__init__.py +0 -0
  330. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/identity/sqlalchemy/migrations/0001_identity.py +0 -0
  331. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/identity/sqlalchemy/migrations/0002_physical_delete.py +0 -0
  332. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/identity/sqlalchemy/migrations/0003_extra_properties.py +0 -0
  333. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/identity/sqlalchemy/migrations/0004_concurrency_version.py +0 -0
  334. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/identity/sqlalchemy/migrations/__init__.py +0 -0
  335. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/identity/sqlalchemy/models.py +0 -0
  336. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/identity/sqlalchemy/module.py +0 -0
  337. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/identity/sqlalchemy/repository.py +0 -0
  338. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/identity/sqlalchemy/session_security.py +0 -0
  339. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/identity/sqlalchemy/stores.py +0 -0
  340. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/identity/tokens.py +0 -0
  341. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/invocation/__init__.py +0 -0
  342. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/invocation/arguments.py +0 -0
  343. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/invocation/callables.py +0 -0
  344. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/invocation/contracts.py +0 -0
  345. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/invocation/contribution.py +0 -0
  346. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/invocation/dispatcher.py +0 -0
  347. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/invocation/entries.py +0 -0
  348. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/invocation/entrypoints.py +0 -0
  349. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/invocation/execution.py +0 -0
  350. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/invocation/function_runtime.py +0 -0
  351. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/invocation/interception.py +0 -0
  352. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/invocation/interceptors.py +0 -0
  353. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/invocation/managed_proxy.py +0 -0
  354. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/invocation/managed_services.py +0 -0
  355. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/invocation/methods.py +0 -0
  356. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/invocation/module.py +0 -0
  357. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/invocation/policies.py +0 -0
  358. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/invocation/signature.py +0 -0
  359. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/invocation/validation.py +0 -0
  360. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/lifecycle/__init__.py +0 -0
  361. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/lifecycle/composition.py +0 -0
  362. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/lifecycle/context.py +0 -0
  363. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/lifecycle/runtime.py +0 -0
  364. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/lifecycle/state.py +0 -0
  365. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/messaging/__init__.py +0 -0
  366. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/messaging/options.py +0 -0
  367. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/messaging/receipt.py +0 -0
  368. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/modularity/__init__.py +0 -0
  369. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/modularity/contracts.py +0 -0
  370. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/modularity/discovery.py +0 -0
  371. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/modularity/graph.py +0 -0
  372. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/modularity/registry.py +0 -0
  373. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/modularity/selection.py +0 -0
  374. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/notifications/__init__.py +0 -0
  375. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/notifications/catalog.py +0 -0
  376. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/notifications/contracts.py +0 -0
  377. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/notifications/declarations.py +0 -0
  378. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/notifications/module.py +0 -0
  379. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/observability/__init__.py +0 -0
  380. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/observability/context.py +0 -0
  381. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/observability/export.py +0 -0
  382. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/observability/formatting.py +0 -0
  383. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/observability/logging.py +0 -0
  384. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/observability/options.py +0 -0
  385. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/observability/tracing.py +0 -0
  386. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/options/__init__.py +0 -0
  387. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/options/aliases.py +0 -0
  388. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/options/contribution.py +0 -0
  389. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/options/immutability.py +0 -0
  390. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/options/input_keys.py +0 -0
  391. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/options/issues.py +0 -0
  392. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/options/models.py +0 -0
  393. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/options/registry.py +0 -0
  394. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/options/schema.py +0 -0
  395. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/options/validation.py +0 -0
  396. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/py.typed +0 -0
  397. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/realtime/__init__.py +0 -0
  398. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/realtime/contracts.py +0 -0
  399. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/realtime/diagnostics.py +0 -0
  400. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/realtime/messages.py +0 -0
  401. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/redis/__init__.py +0 -0
  402. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/redis/cache.py +0 -0
  403. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/redis/cache_scripts.py +0 -0
  404. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/redis/distributed_lock.py +0 -0
  405. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/redis/lease_lock.py +0 -0
  406. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/redis/module.py +0 -0
  407. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/redis/notification_runtime.py +0 -0
  408. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/redis/notifications.py +0 -0
  409. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/redis/options.py +0 -0
  410. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/redis/runtime.py +0 -0
  411. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/seeding/__init__.py +0 -0
  412. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/seeding/contracts.py +0 -0
  413. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/seeding/module.py +0 -0
  414. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/seeding/runtime.py +0 -0
  415. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/services/__init__.py +0 -0
  416. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/services/arbitration.py +0 -0
  417. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/services/binding.py +0 -0
  418. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/services/composition.py +0 -0
  419. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/services/contribution.py +0 -0
  420. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/services/convention.py +0 -0
  421. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/services/convention_contracts.py +0 -0
  422. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/services/exposure.py +0 -0
  423. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/services/fixed_lifetime.py +0 -0
  424. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/services/framework_provider.py +0 -0
  425. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/services/native_graph.py +0 -0
  426. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/services/provider.py +0 -0
  427. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/services/registration.py +0 -0
  428. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/services/repository.py +0 -0
  429. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/services/runtime.py +0 -0
  430. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/settings/__init__.py +0 -0
  431. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/settings/application.py +0 -0
  432. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/settings/binding.py +0 -0
  433. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/settings/catalog.py +0 -0
  434. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/settings/changes.py +0 -0
  435. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/settings/contracts.py +0 -0
  436. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/settings/declarations.py +0 -0
  437. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/settings/definition_discovery.py +0 -0
  438. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/settings/definitions.py +0 -0
  439. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/settings/errors.py +0 -0
  440. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/settings/handlers.py +0 -0
  441. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/settings/management.py +0 -0
  442. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/settings/manager.py +0 -0
  443. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/settings/module.py +0 -0
  444. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/settings/notifications.py +0 -0
  445. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/settings/permissions.py +0 -0
  446. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/settings/provider.py +0 -0
  447. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/settings/refresh.py +0 -0
  448. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/settings/refresh_module.py +0 -0
  449. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/settings/sqlalchemy/__init__.py +0 -0
  450. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/settings/sqlalchemy/migrations/0001_settings.py +0 -0
  451. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/settings/sqlalchemy/migrations/0002_physical_delete.py +0 -0
  452. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/settings/sqlalchemy/migrations/0003_version_tokens.py +0 -0
  453. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/settings/sqlalchemy/migrations/__init__.py +0 -0
  454. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/settings/sqlalchemy/models.py +0 -0
  455. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/settings/sqlalchemy/module.py +0 -0
  456. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/settings/sqlalchemy/store.py +0 -0
  457. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/settings/store.py +0 -0
  458. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/settings/values.py +0 -0
  459. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/sqlalchemy/__init__.py +0 -0
  460. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/sqlalchemy/alembic_runtime/__init__.py +0 -0
  461. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/sqlalchemy/alembic_runtime/env.py +0 -0
  462. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/sqlalchemy/alembic_runtime/script.py.mako +0 -0
  463. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/sqlalchemy/auditing.py +0 -0
  464. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/sqlalchemy/errors.py +0 -0
  465. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/sqlalchemy/extensions.py +0 -0
  466. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/sqlalchemy/metadata.py +0 -0
  467. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/sqlalchemy/migration.py +0 -0
  468. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/sqlalchemy/migration_operations.py +0 -0
  469. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/sqlalchemy/migration_options.py +0 -0
  470. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/sqlalchemy/module.py +0 -0
  471. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/sqlalchemy/module_migration.py +0 -0
  472. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/sqlalchemy/options.py +0 -0
  473. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/sqlalchemy/repository.py +0 -0
  474. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/sqlalchemy/runtime.py +0 -0
  475. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/sqlalchemy/session_provider.py +0 -0
  476. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/sqlalchemy/unit_of_work.py +0 -0
  477. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/testing/__init__.py +0 -0
  478. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/testing/runtime.py +0 -0
  479. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/unit_of_work/__init__.py +0 -0
  480. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/unit_of_work/contracts.py +0 -0
  481. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/unit_of_work/errors.py +0 -0
  482. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/unit_of_work/lifecycle.py +0 -0
  483. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/unit_of_work/manager.py +0 -0
  484. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/unit_of_work/module.py +0 -0
  485. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/unit_of_work/options.py +0 -0
  486. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/src/python_ddd_framework/validation/__init__.py +0 -0
  487. {python_ddd_framework-0.4.0 → python_ddd_framework-0.5.1}/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.5.1
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.5:** This version introduces staged lifecycle shutdown, a temporary `HostedService.stopping` context, and explicit message-channel admission during stopping. Existing applications must apply the lifecycle migration instructions below; applications upgrading from before 0.4 must also apply the earlier capability and consumer-layout migrations. Check [release status](https://github.com/componet-architecture/python-ddd-framework/blob/main/docs/status.md#当前发布) for publication and validation evidence. Use the local-wheel route below when evaluating a checkout that has not been published.
90
90
 
91
91
  ### 1. Install the CLI and create a project
92
92
 
@@ -368,6 +368,14 @@ During `0.x`, compatible fixes use a patch release; changes requiring consumer a
368
368
 
369
369
  These notes remain the authoritative consumer migration instructions. Historical versions below refer to the former package name.
370
370
 
371
+ #### Lifecycle shutdown migration (0.5)
372
+
373
+ 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.
374
+
375
+ 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.
376
+
377
+ 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-收尾).
378
+
371
379
  #### Additional fixes in 0.4.0
372
380
 
373
381
  `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.
@@ -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.5:** This version introduces staged lifecycle shutdown, a temporary `HostedService.stopping` context, and explicit message-channel admission during stopping. Existing applications must apply the lifecycle migration instructions below; applications upgrading from before 0.4 must also apply the earlier capability and consumer-layout migrations. Check [release status](https://github.com/componet-architecture/python-ddd-framework/blob/main/docs/status.md#当前发布) for publication and validation evidence. Use the local-wheel route below when evaluating a checkout that has not been published.
46
46
 
47
47
  ### 1. Install the CLI and create a project
48
48
 
@@ -324,6 +324,14 @@ During `0.x`, compatible fixes use a patch release; changes requiring consumer a
324
324
 
325
325
  These notes remain the authoritative consumer migration instructions. Historical versions below refer to the former package name.
326
326
 
327
+ #### Lifecycle shutdown migration (0.5)
328
+
329
+ 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.
330
+
331
+ 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.
332
+
333
+ 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-收尾).
334
+
327
335
  #### Additional fixes in 0.4.0
328
336
 
329
337
  `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.
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "python-ddd-framework"
3
- version = "0.4.0"
3
+ version = "0.5.1"
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.5.1"
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)
@@ -4,6 +4,7 @@ from __future__ import annotations
4
4
 
5
5
  import asyncio
6
6
  import logging
7
+ import threading
7
8
  from collections.abc import AsyncIterator, Awaitable, Callable, Iterator
8
9
  from contextlib import asynccontextmanager, contextmanager
9
10
  from contextvars import ContextVar, Token
@@ -70,20 +71,31 @@ class _InvocationReservation:
70
71
  executing: bool = False
71
72
 
72
73
 
74
+ @dataclass(eq=False, frozen=True, slots=True)
75
+ class _StoppingPermission:
76
+ """单 Application、服务 owner 与单次收尾钩子的准入身份,不携带业务 scope。"""
77
+
78
+ runtime: _InvocationRuntime
79
+ owner: type[object]
80
+
81
+
73
82
  class _InvocationRuntime:
74
83
  """每个 Application 独占 admission 与 ContextVar,禁止进程级 current app。"""
75
84
 
76
85
  __slots__ = (
77
86
  "_active",
87
+ "_admission_lock",
78
88
  "_ambient",
79
89
  "_application_id",
80
90
  "_authenticating",
81
91
  "_call_scope",
82
92
  "_caller",
83
- "_condition",
93
+ "_changed",
84
94
  "_http_method",
85
95
  "_is_accepting",
86
96
  "_lease",
97
+ "_loop",
98
+ "_permissions",
87
99
  "_reservations",
88
100
  "_state_getter",
89
101
  "tracer",
@@ -116,7 +128,10 @@ class _InvocationRuntime:
116
128
  f"python_ddd_framework_invocation_lease_{application_id}",
117
129
  default=None,
118
130
  )
119
- self._condition = asyncio.Condition()
131
+ self._admission_lock = threading.RLock()
132
+ self._changed = asyncio.Event()
133
+ self._loop: asyncio.AbstractEventLoop | None = None
134
+ self._permissions: set[_StoppingPermission] = set()
120
135
  self._is_accepting = False
121
136
  self._active = 0
122
137
  self._reservations: set[_InvocationReservation] = set()
@@ -166,6 +181,7 @@ class _InvocationRuntime:
166
181
  return self._application_id
167
182
 
168
183
  def start_accepting(self) -> None:
184
+ self._loop = asyncio.get_running_loop()
169
185
  self._is_accepting = True
170
186
 
171
187
  def runtime_participant(self) -> RuntimeParticipant:
@@ -173,27 +189,67 @@ class _InvocationRuntime:
173
189
  self.start_accepting()
174
190
 
175
191
  async def stop(reason: ShutdownReason) -> tuple[BaseException, ...]:
176
- self._is_accepting = False
192
+ self.close_admission()
177
193
  return ()
178
194
 
179
- # 未 start 的 COMPOSED HTTP 也可持有许可;所有消费者停止后、容器关闭前统一排空。
180
- return RuntimeParticipant(start=start, stop=stop, drain=self.stop_accepting_and_wait)
195
+ return RuntimeParticipant(
196
+ start=start,
197
+ stop=stop,
198
+ quiesce=self.quiesce,
199
+ close_admission=self.close_admission,
200
+ drain=self.stop_accepting_and_wait,
201
+ )
181
202
 
182
- async def stop_accepting_and_wait(self) -> None:
183
- async with self._condition:
203
+ def quiesce(self) -> None:
204
+ with self._admission_lock:
184
205
  self._is_accepting = False
185
- await self._condition.wait_for(lambda: self._active == 0)
186
206
 
187
- def reserve(self) -> _InvocationReservation:
188
- # 与 loop 上的接受/关闭无 await 地线性化;等待执行不打开 REQUEST/ACTION。
189
- self.require_accepting_work()
190
- reservation = _InvocationReservation(self)
191
- self._reservations.add(reservation)
192
- self._active += 1
193
- return reservation
207
+ def close_admission(self) -> None:
208
+ with self._admission_lock:
209
+ self._is_accepting = False
210
+ self._permissions.clear()
211
+
212
+ def grant_stopping(self, owner: type[object]) -> _StoppingPermission:
213
+ with self._admission_lock:
214
+ if self._state_getter() not in (
215
+ ApplicationState.STOPPING,
216
+ ApplicationState.ROLLING_BACK,
217
+ ):
218
+ raise ApplicationInvocationRejectedError(reason="Not in the stopping phase")
219
+ permission = _StoppingPermission(self, owner)
220
+ self._permissions.add(permission)
221
+ return permission
222
+
223
+ def revoke_stopping(self, permission: _StoppingPermission) -> None:
224
+ with self._admission_lock:
225
+ self._permissions.discard(permission)
226
+
227
+ def require_stopping(self, permission: _StoppingPermission) -> None:
228
+ with self._admission_lock:
229
+ if permission.runtime is not self or permission not in self._permissions:
230
+ raise ApplicationInvocationRejectedError(reason="Invalid stopping permission")
231
+
232
+ async def stop_accepting_and_wait(self) -> None:
233
+ self.close_admission()
234
+ while True:
235
+ self._changed.clear()
236
+ with self._admission_lock:
237
+ if self._active == 0 and not self._reservations:
238
+ return
239
+ await self._changed.wait()
240
+
241
+ def reserve(self, permission: _StoppingPermission | None = None) -> _InvocationReservation:
242
+ # SDK thread 与权限撤销在同一锁下线性化;已接受许可独立于钩子权限的寿命。
243
+ with self._admission_lock:
244
+ if permission is None:
245
+ self.require_accepting_work()
246
+ else:
247
+ self.require_stopping(permission)
248
+ reservation = _InvocationReservation(self)
249
+ self._reservations.add(reservation)
250
+ return reservation
194
251
 
195
252
  def require_accepting_work(self) -> None:
196
- _current_task()
197
253
  if not self._is_accepting or self._state_getter() not in (
198
254
  ApplicationState.STARTING,
199
255
  ApplicationState.RUNNING,
@@ -201,13 +257,20 @@ class _InvocationRuntime:
201
257
  raise ApplicationInvocationRejectedError(reason="Application is not accepting work")
202
258
 
203
259
  async def discard(self, reservation: _InvocationReservation) -> None:
204
- if reservation.runtime is not self or reservation not in self._reservations:
205
- raise ApplicationInvocationRejectedError(reason="Invalid or released reservation")
206
- async with self._condition:
260
+ self.release_reservation(reservation)
261
+
262
+ def release_reservation(self, reservation: _InvocationReservation) -> None:
263
+ with self._admission_lock:
264
+ if reservation.runtime is not self or reservation not in self._reservations:
265
+ raise ApplicationInvocationRejectedError(reason="Invalid or released reservation")
207
266
  self._reservations.remove(reservation)
208
- self._active -= 1
209
- if self._active == 0:
210
- self._condition.notify_all()
267
+ if self._loop is not None and not self._loop.is_closed():
268
+ try:
269
+ self._loop.call_soon_threadsafe(self._changed.set)
270
+ except RuntimeError:
271
+ # 外部 submit 可能在 loop 关闭竞争中退回许可;此时已无 loop 排空等待者。
272
+ if not self._loop.is_closed():
273
+ raise
211
274
 
212
275
  @asynccontextmanager
213
276
  async def reserved_lease(self, reservation: _InvocationReservation) -> AsyncIterator[None]:
@@ -246,7 +309,7 @@ class _InvocationRuntime:
246
309
  yield
247
310
  return
248
311
 
249
- async with self._condition:
312
+ with self._admission_lock:
250
313
  state = self._state_getter()
251
314
  # HostedService.start 可调用业务入口,但全部后台启动成功前 readiness 仍为 false。
252
315
  allows_invocation = self._is_accepting and state in (
@@ -266,11 +329,11 @@ class _InvocationRuntime:
266
329
  yield
267
330
  finally:
268
331
  self._lease.reset(token)
269
- async with self._condition:
332
+ with self._admission_lock:
270
333
  assert self._active > 0
271
334
  self._active -= 1
272
335
  if self._active == 0:
273
- self._condition.notify_all()
336
+ self._changed.set()
274
337
 
275
338
  def current(self) -> _InvocationState | None:
276
339
  return self._ambient.get()
@@ -30,12 +30,19 @@ class _LocalTask:
30
30
  self.operation: asyncio.Task[None] | None = None
31
31
  self._failed = failed
32
32
  self._monitor: asyncio.Task[None] | None = None
33
+ self._quiescing = False
34
+ self._claiming_stopped = False
33
35
 
34
36
  async def start(self) -> None:
37
+ self._claiming_stopped = False
35
38
  self.state = BackgroundTaskState.STARTING
36
39
  if self.execution is None:
37
40
  raise RuntimeError("Task execution provider is unavailable")
38
41
  await self.execution.start()
42
+ if self._quiescing:
43
+ # start 可能与关闭重叠;完成后再次请求停止,不能重新打开领取。
44
+ self._claiming_stopped = False
45
+ self._stop_claiming()
39
46
  self.state = BackgroundTaskState.RUNNING
40
47
  if self.execution.wait_for_failure is not None:
41
48
  self._monitor = asyncio.create_task(
@@ -82,6 +89,9 @@ class _LocalTask:
82
89
  async def _operate(self, start: bool) -> None:
83
90
  try:
84
91
  if start:
92
+ if self._quiescing:
93
+ self.state = BackgroundTaskState.STOPPED
94
+ return
85
95
  await self.start()
86
96
  else:
87
97
  await self._drain()
@@ -91,6 +101,15 @@ class _LocalTask:
91
101
  self.state = BackgroundTaskState.FAILED
92
102
  # 失败转为 Application-owned 状态供查询;task 不留下未观察异常。
93
103
 
104
+ def quiesce(self) -> None:
105
+ self._quiescing = True
106
+ self._stop_claiming()
107
+
108
+ def _stop_claiming(self) -> None:
109
+ if self.execution is not None and not self._claiming_stopped:
110
+ self._claiming_stopped = True
111
+ self.execution.stop_claiming()
112
+
94
113
  async def shutdown(self) -> None:
95
114
  if self.operation is not None:
96
115
  await self.operation
@@ -112,7 +131,7 @@ class _LocalTask:
112
131
  execution = self.execution
113
132
  if execution is None:
114
133
  return
115
- execution.stop_claiming()
134
+ self._stop_claiming()
116
135
  draining = asyncio.ensure_future(execution.wait())
117
136
  _, pending = await asyncio.wait((draining,), timeout=self.deadline)
118
137
  if pending:
@@ -60,6 +60,7 @@ class _ProcessSlot:
60
60
  self._exited = asyncio.Event()
61
61
  self._exited.set()
62
62
  self._stopping = False
63
+ self._shutdown_request: asyncio.Task[None] | None = None
63
64
  self._restart_count = 0
64
65
  self._wanted: set[str] = set()
65
66
  self._serial = 0
@@ -307,14 +308,23 @@ class _ProcessSlot:
307
308
  if not self._stopping and self._wanted and self._process is None:
308
309
  self._spawn()
309
310
 
310
- async def shutdown(self) -> None:
311
+ def quiesce(self) -> None:
311
312
  self._stopping = True
312
313
  self._set_enabled_state(BackgroundTaskState.STOPPING)
314
+ if self._shutdown_request is None:
315
+ self._shutdown_request = asyncio.create_task(self._request_shutdown())
316
+
317
+ async def _request_shutdown(self) -> None:
313
318
  if self._process is not None and self._process.is_alive():
314
319
  try:
315
320
  await self._send((_Message.SHUTDOWN,))
316
321
  except (EOFError, OSError):
317
322
  pass
323
+
324
+ async def shutdown(self) -> None:
325
+ self.quiesce()
326
+ assert self._shutdown_request is not None
327
+ await self._shutdown_request
318
328
  if self._monitor is not None:
319
329
  await self._monitor
320
330
  if self._operations:
@@ -46,7 +46,6 @@ class _BackgroundCoordinator:
46
46
  raise _BackgroundExecutionStartFailure(original_error=error) from error
47
47
 
48
48
  async def stop(reason: ShutdownReason) -> tuple[BaseException, ...]:
49
- await self.stop()
50
49
  return ()
51
50
 
52
51
  async def wait() -> ApplicationRuntimeError:
@@ -62,6 +61,8 @@ class _BackgroundCoordinator:
62
61
  prepare=prepare,
63
62
  start=start,
64
63
  stop=stop,
64
+ quiesce=self.quiesce,
65
+ drain=self.stop,
65
66
  failure=lambda: wait() if self.has_runtime_failure_source else None,
66
67
  )
67
68
 
@@ -242,6 +243,14 @@ class _BackgroundCoordinator:
242
243
  return slot.request(key, start)
243
244
  return self._tasks[key].request(start)
244
245
 
246
+ def quiesce(self) -> None:
247
+ self._started = False
248
+ for key, task in self._tasks.items():
249
+ if key in self._local:
250
+ task.quiesce()
251
+ for slot in self._slots.values():
252
+ slot.quiesce()
253
+
245
254
  async def stop(self) -> None:
246
255
  # 即使启动前的预占或 Module 初始化失败,也必须释放已取得的位置。
247
256
  operations = [task.shutdown() for key, task in self._tasks.items() if key in self._local]
@@ -23,7 +23,8 @@ This module owns the generated order example. Adapt its business rules from conf
23
23
 
24
24
  - Query, management, and approval use separate `{{ cookiecutter.class_prefix }}QueryApplicationService`, `{{ cookiecutter.class_prefix }}ManagementApplicationService`, and `{{ cookiecutter.class_prefix }}ApprovalApplicationService` contracts. The exposure decorator contributes the ContractsModule dependency; overrides retain the sample's deliberate paths and operation IDs. Other conventional methods are automatic, with plain GET Pydantic DTOs bound as query parameters unless explicitly declared otherwise. Reporting uses `OrderReportingService` internally without end-user permissions or HTTP exposure.
25
25
  - The aggregate owns pending-to-approved transitions. The domain service reads the approval setting; the caller owns version checks, transaction, and save. Repository writes collect events; AFTER_COMMIT removes the cache before online notification. Notification failure cannot undo a committed write.
26
- - The approval Job participates in transactional enqueue and ignores missing/already-approved orders. The statistics schedule refers to its Job type and typed payload; the Job definition owns persisted name/version/schema. Generated Workers are code-disabled; HostedService and periodic schedule require explicit Module registration as described in the project development guide. The hosted owner waits for its thread to exit. Settings refresh and timing interception reuse framework extensions.
26
+ - The approval Job participates in transactional enqueue and ignores missing/already-approved orders. The statistics schedule refers to its Job type and typed payload; the Job definition owns persisted name/version/schema. Generated Workers are code-disabled; HostedService and periodic schedule require explicit Module registration as described in the project development guide. Settings refresh and timing interception reuse framework extensions.
27
+ - The hosted example uses `stopping` for an independent business call and an SDK thread callback with the temporary context, then `stop` joins the actual thread after accepted work drains. Startup contexts stay closed during shutdown. To keep message input during this phase, declare this service in the channel's `stopping_owners`, depend on its Module owner, and pass `stopping=context`; no channel opts in by default.
27
28
  - File upload/download/stream and `/ws/{{ cookiecutter.module_name }}` call public contracts. Typed messages in [order_messages](domain_shared/messages/order_messages.py) own their versioned names and payload schemas; handlers and the socket explicitly map business values. Sending reports local queue acceptance, with no offline replay, cross-process backplane or client acknowledgment.
28
29
 
29
30
  Startup [Options](application/options/order_options.py) bind to the `{{ cookiecutter.module_name }}` YAML section; `allow_background_approval` defaults to true. Runtime approval settings and seed contributors belong to Domain. Its Module declares `SettingsModule` and `DataSeedingModule`; contributors are independent DI services, not ApplicationServices. The Domain [OrderApprovalService](domain/services/order_approval_service.py) opts into `ValidationEnabled` through the transitive InvocationModule dependency, retains its transient lifetime, and leaves saving and transaction completion to its caller. Capability dependencies and typed declarations are owned by each Module, while Host selects providers. Change declarations at their owners rather than copying names into another registry.
@@ -4,10 +4,6 @@ import asyncio
4
4
  import logging
5
5
  from threading import Event, Thread
6
6
 
7
- from modules.{{ cookiecutter.module_name }}.application_contracts.integration_services.order_reporting_service import (
8
- OrderReportingService,
9
- )
10
-
11
7
  from python_ddd_framework import (
12
8
  HostedService,
13
9
  HostedServiceContext,
@@ -15,6 +11,10 @@ from python_ddd_framework import (
15
11
  ShutdownReason,
16
12
  )
17
13
 
14
+ from modules.{{ cookiecutter.module_name }}.application_contracts.integration_services.order_reporting_service import (
15
+ OrderReportingService,
16
+ )
17
+
18
18
 
19
19
  async def observe_integration(reporting: OrderReportingService) -> None:
20
20
  count = await reporting.get_count()
@@ -24,6 +24,10 @@ async def observe_integration(reporting: OrderReportingService) -> None:
24
24
  class OrderIntegrationService(HostedService):
25
25
  def __init__(self) -> None:
26
26
  self._stop = Event()
27
+ self._prepare = Event()
28
+ self._callback_done = Event()
29
+ self._stopping_context: HostedServiceContext | None = None
30
+ self._callback_error: BaseException | None = None
27
31
  self._thread: Thread | None = None
28
32
 
29
33
  async def start(self, context: HostedServiceContext) -> None:
@@ -34,13 +38,33 @@ class OrderIntegrationService(HostedService):
34
38
  def _receive(self, context: HostedServiceContext) -> None:
35
39
  # submit_call 只能来自外部线程;Future.result 等待同一正式 invocation 完成。
36
40
  try:
37
- context.submit_call(observe_integration).result()
38
- except HostedServiceInvocationRejectedError:
39
- return # Application 关闭已撤销调用许可。
41
+ try:
42
+ context.submit_call(observe_integration).result()
43
+ except HostedServiceInvocationRejectedError:
44
+ pass # 普通准入可能已经关闭;收尾只使用 stopping 新提供的 context。
45
+ self._prepare.wait()
46
+ stopping = self._stopping_context
47
+ if stopping is not None:
48
+ stopping.submit_call(observe_integration).result()
49
+ except BaseException as error: # noqa: BLE001 -- 线程故障转交 stopping 重新抛出。
50
+ self._callback_error = error
51
+ finally:
52
+ self._callback_done.set()
40
53
  self._stop.wait()
41
54
 
55
+ async def stopping(self, context: HostedServiceContext, reason: ShutdownReason) -> None:
56
+ # 独立业务调用完成后再等 SDK 回调,不跨线程传 scope,也不跨等待持有事务。
57
+ await context.call(observe_integration)
58
+ self._stopping_context = context
59
+ self._prepare.set()
60
+ await asyncio.to_thread(self._callback_done.wait)
61
+ if self._callback_error is not None:
62
+ raise RuntimeError("External integration callback failed") from self._callback_error
63
+
42
64
  async def stop(self, reason: ShutdownReason) -> None:
65
+ # start 部分失败时 stopping 不会执行;仍须唤醒并等待实际线程退出。
43
66
  self._stop.set()
67
+ self._prepare.set()
44
68
  if self._thread is not None:
45
69
  await asyncio.to_thread(self._thread.join)
46
70
  self._thread = None
@@ -41,6 +41,13 @@ Business modules own message values and coalescing identities. Only replaceable
41
41
  coalesce. Acceptance, processing, commit and external acknowledgement are separate facts.
42
42
  Use the framework channel and hosted bridge; preserve capacity and actual cleanup guarantees.
43
43
 
44
+ For SDK shutdown, initiate business cleanup in `HostedService.stopping(context, reason)` and
45
+ release resources in `stop(reason)`. Pass the separate stopping context only to this phase's
46
+ callbacks; startup contexts never gain shutdown permissions. Channels opt in with declared
47
+ `stopping_owners` and `send/submit(..., stopping=context)`. Keep the channel Module dependent on
48
+ the service owner, and drain accepted work before releasing resources. See the hosted-service
49
+ and message examples in the project development guide.
50
+
44
51
  ## Verify and maintain
45
52
 
46
53
  - Preserve unrelated changes. Do not edit the installed framework, generated dependency files by hand, or another repository to make an application change pass.
@@ -102,8 +102,9 @@ Module initialization precedes selected hosted services and background execution
102
102
  - Durable jobs use typed, versioned payloads and the PostgreSQL provider. Transactional enqueue must use the same configured connection as the surrounding unit of work. External side effects remain the job's idempotency responsibility.
103
103
  - Periodic workers are explicitly registered. Generated example workers are disabled in their class declarations; configuration cannot enable a code-disabled worker.
104
104
  - Execution modes are `host`, `shared`, and `exclusive`. Spawned processes compose their own Application; they do not inherit a live Session or container.
105
- - A `HostedService` owns long-lived SDKs or threads, their failures, recovery, and actual shutdown. It is opt-in; background-process instances need explicit selection. External threads use its supported submission methods.
105
+ - A `HostedService` owns long-lived SDKs or threads, their failures, recovery, and actual shutdown. It is opt-in; background-process instances need explicit selection. Shutdown has global barriers: close ordinary admission, await `stopping`, close remaining admission, drain accepted work, then release resources in `stop` before Module/container cleanup. Only successfully started services prepare; all touched services clean up. External callbacks use the separate, temporary stopping context, never an upgraded startup context.
106
106
  - Redis business locks are leases. Preserve cancellation and cleanup when ownership is lost; a lease is not a transaction, fencing guarantee, or exactly-once guarantee.
107
+ - In-process channels preserve SDK input during stopping only for declared `stopping_owners` and a current hook context passed to `send/submit`. The channel Module depends on the service owner. Admission permissions are Application-local and temporary; accepted work retains its reservation until execution or a reported non-execution outcome, with unchanged capacity and per-message scopes.
107
108
  - WebSocket delivery targets currently connected clients. The generated sample has no cross-process backplane, offline replay, or delivery acknowledgment. HTTP streaming must release business transactions before network transmission and clean up producers on disconnect.
108
109
  - Liveness and readiness report lifecycle state, not continuous infrastructure availability. Trace export is disabled in the generated development configuration until explicitly configured.
109
110
 
@@ -207,7 +207,9 @@ Background execution Options use catalog names to select `host`, `shared`, or `e
207
207
 
208
208
  Use the existing `DistributedLock` provider for explicit business leases. `locks.acquire(key, wait_timeout=timedelta(0))` tries without waiting; omit the argument or pass `None` for configured waiting, or pass a positive timedelta for this acquisition only. If acquisition returns false, skip or report the operation as appropriate. Preserve cancellation and cleanup on lease loss. Use database concurrency and idempotency for their separate guarantees.
209
209
 
210
- A `HostedService` manages a long-lived SDK or thread through async `start`/`stop`, including actual thread termination. Register it with `hosted_services = HostedServices((ServiceType,))`; the generated integration example is not registered by default. External threads submit through the hosted-service context, and the component owns runtime failures and recovery.
210
+ A `HostedService` starts its SDK/thread in `start(context)`, initiates business cleanup and waits for callbacks in optional `stopping(context, reason)`, then releases resources and joins threads in `stop(reason)`. Register it with `hosted_services = HostedServices((ServiceType,))`; the generated integration example is not registered by default. It demonstrates an independent `context.call` and a thread callback using `context.submit_call(...).result()`. Each call creates its own scope; never pass a Session or scope to the thread or hold a transaction while waiting for the SDK.
211
+
212
+ The stopping context is separate from the startup context, which stays closed to new work. Its permission ends when the hook returns, fails, or receives a timeout cancellation request; accepted work still drains before resource stop. Only successfully started services receive `stopping`, while every touched service must tolerate `stop` after partial startup. Each hook uses `hosted_service.shutdown_timeout`, requests cancellation on expiry, and waits for actual cleanup; it is not a total shutdown deadline. HTTP/WebSocket use native transport shutdown.
211
213
 
212
214
  ## HTTP, files, and real-time communication
213
215
 
@@ -270,6 +272,14 @@ UoW, scope or concurrently mutable payloads between tasks/threads. Host configur
270
272
  resource exit and reports timeout. Restart requires a new Application. Commands, results and
271
273
  events requiring individual processing must not declare a coalescing key.
272
274
 
275
+ To accept SDK messages during a hosted service's stopping hook, declare
276
+ `MessageChannelDefinition(T, Handler, stopping_owners=(ServiceType,))` and make the channel
277
+ Module depend on the service's owner Module. Send with `await channel.send(value, stopping=context)`
278
+ or `channel.submit(value, stopping=context)` using that hook's current context. The default empty
279
+ tuple keeps input closed. Ordinary, expired, undeclared-owner and foreign-Application contexts
280
+ are rejected. Already accepted messages still drain before resource stop; the permission changes
281
+ neither capacity nor handler validation, authorization, scope/UoW or receipt semantics.
282
+
273
283
  ## Verification
274
284
 
275
285
  Run native uv/test/build commands from `backend/`. Installed `pddd` commands locate the backend from the application root or any descendant, including nested foreign Python projects. Read fixtures first: Host tests use disposable PostgreSQL and Redis containers, so Docker must be available.