DefStream 0.1.23__tar.gz → 0.1.24__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 (409) hide show
  1. defstream-0.1.24/.github/scripts/run_core_tests.py +26 -0
  2. {defstream-0.1.23 → defstream-0.1.24}/.github/workflows/ci.yml +117 -29
  3. {defstream-0.1.23 → defstream-0.1.24}/PKG-INFO +3 -3
  4. {defstream-0.1.23 → defstream-0.1.24}/build/core/DefStream.egg-info/SOURCES.txt +61 -12
  5. defstream-0.1.24/issues/task/39/CHANGELOG.md +3 -0
  6. defstream-0.1.24/issues/task/39/IMPLEMENTS.md +33 -0
  7. defstream-0.1.24/issues/task/39/PLAN.md +52 -0
  8. defstream-0.1.24/issues/task/39/README.md +85 -0
  9. defstream-0.1.24/issues/task/39/REQUIREMENTS.md +54 -0
  10. defstream-0.1.24/issues/task/39/TASKS.md +70 -0
  11. defstream-0.1.24/issues/task/39/implements/1793623390266.md +9 -0
  12. defstream-0.1.24/issues/task/39/implements/1793625464717.md +7 -0
  13. defstream-0.1.24/issues/task/39/implements/1793626388737.md +7 -0
  14. defstream-0.1.24/issues/task/39/implements/1793626820522.md +7 -0
  15. defstream-0.1.24/issues/task/39/implements/1793627348502.md +7 -0
  16. defstream-0.1.24/issues/task/39/implements/1793628366252.md +7 -0
  17. defstream-0.1.24/issues/task/39/implements/1793629199999.md +7 -0
  18. defstream-0.1.24/issues/task/39/implements/1793631035346.md +5 -0
  19. defstream-0.1.24/issues/task/39/tasks/1793620359610.md +9 -0
  20. defstream-0.1.24/issues/task/39/tasks/1793621161604.md +7 -0
  21. defstream-0.1.24/issues/task/39/tasks/1793621502459.md +19 -0
  22. defstream-0.1.24/issues/task/39/tasks/1793621903677.md +7 -0
  23. defstream-0.1.24/issues/task/39/tasks/1793623390265.md +9 -0
  24. defstream-0.1.24/issues/task/39/tasks/1793625269565.md +15 -0
  25. defstream-0.1.24/issues/task/39/tasks/1793626388737.md +7 -0
  26. defstream-0.1.24/issues/task/39/tasks/1793626820522.md +5 -0
  27. defstream-0.1.24/issues/task/39/tasks/1793627348502.md +7 -0
  28. defstream-0.1.24/issues/task/39/tasks/1793627590185.md +5 -0
  29. defstream-0.1.24/issues/task/39/tasks/1793628366252.md +16 -0
  30. defstream-0.1.24/issues/task/39/tasks/1793629199998.md +15 -0
  31. defstream-0.1.24/issues/task/39/tasks/1793631035345.md +10 -0
  32. defstream-0.1.24/res/docker/rabbitmq/README.md +58 -0
  33. defstream-0.1.24/res/docker/rabbitmq/enabled_plugins +1 -0
  34. defstream-0.1.24/res/docker/rabbitmq/rabbitmq-3.yml +22 -0
  35. defstream-0.1.24/res/docker/rabbitmq/rabbitmq-4.yml +22 -0
  36. defstream-0.1.24/res/docker/redis/README.md +46 -0
  37. defstream-0.1.24/res/docker/redis/redis-6.yml +14 -0
  38. defstream-0.1.24/res/docker/redis/redis-7.yml +14 -0
  39. defstream-0.1.24/tests/__init__.py +0 -0
  40. {defstream-0.1.23 → defstream-0.1.24}/tests/_support.py +9 -0
  41. defstream-0.1.24/tests/_support_inspector.py +228 -0
  42. defstream-0.1.24/tests/_support_inspector_play.py +289 -0
  43. defstream-0.1.24/tests/_support_task_messages.py +40 -0
  44. defstream-0.1.24/tests/rabbitmq/__init__.py +0 -0
  45. defstream-0.1.24/tests/rabbitmq/test_inspector.py +26 -0
  46. defstream-0.1.24/tests/rabbitmq/test_inspector_play.py +29 -0
  47. {defstream-0.1.23/tests → defstream-0.1.24/tests/rabbitmq}/test_rabbitmq_integration.py +10 -2
  48. {defstream-0.1.23/tests → defstream-0.1.24/tests/rabbitmq}/test_rabbitmq_logging.py +2 -2
  49. {defstream-0.1.23/tests → defstream-0.1.24/tests/rabbitmq}/test_rabbitmq_priorities.py +4 -3
  50. {defstream-0.1.23/tests → defstream-0.1.24/tests/rabbitmq}/test_rabbitmq_rpc.py +1 -1
  51. {defstream-0.1.23/tests → defstream-0.1.24/tests/rabbitmq}/test_rabbitmq_rpc_integration.py +7 -3
  52. {defstream-0.1.23/tests → defstream-0.1.24/tests/rabbitmq}/test_rabbitmq_timeouts.py +1 -1
  53. {defstream-0.1.23/tests → defstream-0.1.24/tests/rabbitmq}/test_rabbitmq_worker.py +1 -1
  54. defstream-0.1.24/tests/rabbitmq/test_specifications.py +106 -0
  55. defstream-0.1.24/tests/rabbitmq/test_task_messages.py +162 -0
  56. {defstream-0.1.23/tests → defstream-0.1.24/tests/rabbitmq}/test_task_priorities.py +0 -68
  57. defstream-0.1.24/tests/redis/__init__.py +0 -0
  58. defstream-0.1.24/tests/redis/test_inspector.py +23 -0
  59. defstream-0.1.24/tests/redis/test_inspector_play.py +24 -0
  60. {defstream-0.1.23/tests → defstream-0.1.24/tests/redis}/test_redis_integration.py +7 -4
  61. {defstream-0.1.23/tests → defstream-0.1.24/tests/redis}/test_redis_logging.py +2 -2
  62. defstream-0.1.24/tests/redis/test_task_messages.py +201 -0
  63. defstream-0.1.24/tests/redis/test_task_priorities.py +98 -0
  64. {defstream-0.1.23 → defstream-0.1.24}/tests/test_broker_packaging.py +36 -13
  65. {defstream-0.1.23 → defstream-0.1.24}/tests/test_inspector.py +6 -233
  66. {defstream-0.1.23 → defstream-0.1.24}/tests/test_inspector_logging.py +1 -1
  67. {defstream-0.1.23 → defstream-0.1.24}/tests/test_inspector_play.py +9 -324
  68. {defstream-0.1.23 → defstream-0.1.24}/tests/test_lifecycle_hooks.py +1 -1
  69. {defstream-0.1.23 → defstream-0.1.24}/tests/test_protocol_contracts.py +1 -1
  70. {defstream-0.1.23 → defstream-0.1.24}/tests/test_runner_hooks.py +1 -1
  71. {defstream-0.1.23 → defstream-0.1.24}/tests/test_specifications.py +1 -95
  72. defstream-0.1.24/tests/test_task_messages.py +251 -0
  73. {defstream-0.1.23 → defstream-0.1.24}/tests/test_worker.py +1 -1
  74. {defstream-0.1.23 → defstream-0.1.24}/tests/test_worker_recovery.py +1 -1
  75. defstream-0.1.23/tests/test_task_messages.py +0 -712
  76. {defstream-0.1.23 → defstream-0.1.24}/.dev/scripts/editable_view.py +0 -0
  77. {defstream-0.1.23 → defstream-0.1.24}/.dev/scripts/tests/__init__.py +0 -0
  78. {defstream-0.1.23 → defstream-0.1.24}/.dev/scripts/tests/test_editable_view.py +0 -0
  79. {defstream-0.1.23 → defstream-0.1.24}/.distribution-target +0 -0
  80. {defstream-0.1.23 → defstream-0.1.24}/.github/ISSUE_TEMPLATE/01.feature.yml +0 -0
  81. {defstream-0.1.23 → defstream-0.1.24}/.github/ISSUE_TEMPLATE/02.bug.yml +0 -0
  82. {defstream-0.1.23 → defstream-0.1.24}/.github/ISSUE_TEMPLATE/03.fix.yml +0 -0
  83. {defstream-0.1.23 → defstream-0.1.24}/.github/ISSUE_TEMPLATE/04.task.yml +0 -0
  84. {defstream-0.1.23 → defstream-0.1.24}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  85. {defstream-0.1.23 → defstream-0.1.24}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  86. {defstream-0.1.23 → defstream-0.1.24}/.github/scripts/build_backend.py +0 -0
  87. {defstream-0.1.23 → defstream-0.1.24}/.github/scripts/build_distributions.py +0 -0
  88. {defstream-0.1.23 → defstream-0.1.24}/.github/scripts/check_distributions.py +0 -0
  89. {defstream-0.1.23 → defstream-0.1.24}/.github/scripts/create-issues-from-reviews.mjs +0 -0
  90. {defstream-0.1.23 → defstream-0.1.24}/.github/scripts/create-pr-from-issue.mjs +0 -0
  91. {defstream-0.1.23 → defstream-0.1.24}/.github/scripts/prepare_upload.py +0 -0
  92. {defstream-0.1.23 → defstream-0.1.24}/.github/scripts/tests/__init__.py +0 -0
  93. {defstream-0.1.23 → defstream-0.1.24}/.github/scripts/tests/create-issues-from-reviews.test.mjs +0 -0
  94. {defstream-0.1.23 → defstream-0.1.24}/.github/scripts/tests/create-pr-from-issue.test.mjs +0 -0
  95. {defstream-0.1.23 → defstream-0.1.24}/.github/scripts/tests/test_build_backend.py +0 -0
  96. {defstream-0.1.23 → defstream-0.1.24}/.github/scripts/tests/test_distributions.py +0 -0
  97. {defstream-0.1.23 → defstream-0.1.24}/.github/scripts/tests/test_release.py +0 -0
  98. {defstream-0.1.23 → defstream-0.1.24}/.github/workflows/create-issues-from-reviews.yml +0 -0
  99. {defstream-0.1.23 → defstream-0.1.24}/.github/workflows/create-pr-from-issue.yml +0 -0
  100. {defstream-0.1.23 → defstream-0.1.24}/.gitignore +0 -0
  101. {defstream-0.1.23 → defstream-0.1.24}/LICENSE +0 -0
  102. {defstream-0.1.23 → defstream-0.1.24}/README.en.md +0 -0
  103. {defstream-0.1.23 → defstream-0.1.24}/README.md +0 -0
  104. {defstream-0.1.23 → defstream-0.1.24}/README.setup.md +0 -0
  105. {defstream-0.1.23 → defstream-0.1.24}/docs/Contracts.en.md +0 -0
  106. {defstream-0.1.23 → defstream-0.1.24}/docs/Contracts.md +0 -0
  107. {defstream-0.1.23 → defstream-0.1.24}/docs/GettingStarted.en.md +0 -0
  108. {defstream-0.1.23 → defstream-0.1.24}/docs/GettingStarted.md +0 -0
  109. {defstream-0.1.23 → defstream-0.1.24}/docs/LifecycleHooks.en.md +0 -0
  110. {defstream-0.1.23 → defstream-0.1.24}/docs/LifecycleHooks.md +0 -0
  111. {defstream-0.1.23 → defstream-0.1.24}/docs/Operations.en.md +0 -0
  112. {defstream-0.1.23 → defstream-0.1.24}/docs/Operations.md +0 -0
  113. {defstream-0.1.23 → defstream-0.1.24}/docs/Packaging.en.md +0 -0
  114. {defstream-0.1.23 → defstream-0.1.24}/docs/Packaging.md +0 -0
  115. {defstream-0.1.23 → defstream-0.1.24}/docs/README.en.md +0 -0
  116. {defstream-0.1.23 → defstream-0.1.24}/docs/README.md +0 -0
  117. {defstream-0.1.23 → defstream-0.1.24}/docs/RabbitMQ.en.md +0 -0
  118. {defstream-0.1.23 → defstream-0.1.24}/docs/RabbitMQ.md +0 -0
  119. {defstream-0.1.23 → defstream-0.1.24}/docs/Redis.en.md +0 -0
  120. {defstream-0.1.23 → defstream-0.1.24}/docs/Redis.md +0 -0
  121. {defstream-0.1.23 → defstream-0.1.24}/docs/Tasks.en.md +0 -0
  122. {defstream-0.1.23 → defstream-0.1.24}/docs/Tasks.md +0 -0
  123. {defstream-0.1.23 → defstream-0.1.24}/instructions/CODE.instructions.md +0 -0
  124. {defstream-0.1.23 → defstream-0.1.24}/instructions/DOCS.instructions.md +0 -0
  125. {defstream-0.1.23 → defstream-0.1.24}/instructions/README.instructions.md +0 -0
  126. {defstream-0.1.23 → defstream-0.1.24}/issues/bug/16/IMPLEMENTS.md +0 -0
  127. {defstream-0.1.23 → defstream-0.1.24}/issues/bug/16/ISSUE.md +0 -0
  128. {defstream-0.1.23 → defstream-0.1.24}/issues/bug/16/README.md +0 -0
  129. {defstream-0.1.23 → defstream-0.1.24}/issues/bug/16/REQUIREMENTS.md +0 -0
  130. {defstream-0.1.23 → defstream-0.1.24}/issues/feature/1/IMPLEMENTS.md +0 -0
  131. {defstream-0.1.23 → defstream-0.1.24}/issues/feature/1/README.md +0 -0
  132. {defstream-0.1.23 → defstream-0.1.24}/issues/feature/1/REQUIREMENTS.md +0 -0
  133. {defstream-0.1.23 → defstream-0.1.24}/issues/feature/1/TASK.md +0 -0
  134. {defstream-0.1.23 → defstream-0.1.24}/issues/feature/1/ci.refs.json +0 -0
  135. {defstream-0.1.23 → defstream-0.1.24}/issues/feature/46/CHANGELOG.md +0 -0
  136. {defstream-0.1.23 → defstream-0.1.24}/issues/feature/46/IMPLEMENTS.md +0 -0
  137. {defstream-0.1.23 → defstream-0.1.24}/issues/feature/46/PLAN.md +0 -0
  138. {defstream-0.1.23 → defstream-0.1.24}/issues/feature/46/README.md +0 -0
  139. {defstream-0.1.23 → defstream-0.1.24}/issues/feature/46/REQUIREMENTS.md +0 -0
  140. {defstream-0.1.23 → defstream-0.1.24}/issues/feature/46/TASKS.md +0 -0
  141. {defstream-0.1.23 → defstream-0.1.24}/issues/feature/46/implements/1793274693488.md +0 -0
  142. {defstream-0.1.23 → defstream-0.1.24}/issues/feature/46/implements/1793275218996.md +0 -0
  143. {defstream-0.1.23 → defstream-0.1.24}/issues/feature/46/implements/1793275899489.md +0 -0
  144. {defstream-0.1.23 → defstream-0.1.24}/issues/feature/46/implements/1793276075771.md +0 -0
  145. {defstream-0.1.23 → defstream-0.1.24}/issues/feature/46/implements/1793276518340.md +0 -0
  146. {defstream-0.1.23 → defstream-0.1.24}/issues/feature/46/implements/1793277364116.md +0 -0
  147. {defstream-0.1.23 → defstream-0.1.24}/issues/feature/46/implements/1793278267422.md +0 -0
  148. {defstream-0.1.23 → defstream-0.1.24}/issues/feature/46/implements/1793278764701.md +0 -0
  149. {defstream-0.1.23 → defstream-0.1.24}/issues/feature/46/implements/1793279849390.md +0 -0
  150. {defstream-0.1.23 → defstream-0.1.24}/issues/feature/46/tasks/1793272872217.md +0 -0
  151. {defstream-0.1.23 → defstream-0.1.24}/issues/feature/46/tasks/1793274121654.md +0 -0
  152. {defstream-0.1.23 → defstream-0.1.24}/issues/feature/46/tasks/1793274231988.md +0 -0
  153. {defstream-0.1.23 → defstream-0.1.24}/issues/feature/46/tasks/1793275218995.md +0 -0
  154. {defstream-0.1.23 → defstream-0.1.24}/issues/feature/46/tasks/1793275501812.md +0 -0
  155. {defstream-0.1.23 → defstream-0.1.24}/issues/feature/46/tasks/1793275955973.md +0 -0
  156. {defstream-0.1.23 → defstream-0.1.24}/issues/feature/46/tasks/1793276099601.md +0 -0
  157. {defstream-0.1.23 → defstream-0.1.24}/issues/feature/46/tasks/1793276518341.md +0 -0
  158. {defstream-0.1.23 → defstream-0.1.24}/issues/feature/46/tasks/1793277424063.md +0 -0
  159. {defstream-0.1.23 → defstream-0.1.24}/issues/feature/46/tasks/1793278267423.md +0 -0
  160. {defstream-0.1.23 → defstream-0.1.24}/issues/feature/46/tasks/1793278764702.md +0 -0
  161. {defstream-0.1.23 → defstream-0.1.24}/issues/feature/46/tasks/1793279849391.md +0 -0
  162. {defstream-0.1.23 → defstream-0.1.24}/issues/feature/47/CHANGELOG.md +0 -0
  163. {defstream-0.1.23 → defstream-0.1.24}/issues/feature/47/IMPLEMENTS.md +0 -0
  164. {defstream-0.1.23 → defstream-0.1.24}/issues/feature/47/PLAN.md +0 -0
  165. {defstream-0.1.23 → defstream-0.1.24}/issues/feature/47/README.md +0 -0
  166. {defstream-0.1.23 → defstream-0.1.24}/issues/feature/47/REQUIREMENTS.md +0 -0
  167. {defstream-0.1.23 → defstream-0.1.24}/issues/feature/47/TASKS.md +0 -0
  168. {defstream-0.1.23 → defstream-0.1.24}/issues/feature/47/implements/1793271568985.md +0 -0
  169. {defstream-0.1.23 → defstream-0.1.24}/issues/feature/47/implements/1793272077065.md +0 -0
  170. {defstream-0.1.23 → defstream-0.1.24}/issues/feature/47/tasks/1793271236067.md +0 -0
  171. {defstream-0.1.23 → defstream-0.1.24}/issues/feature/47/tasks/1793271384432.md +0 -0
  172. {defstream-0.1.23 → defstream-0.1.24}/issues/feature/47/tasks/1793271506089.md +0 -0
  173. {defstream-0.1.23 → defstream-0.1.24}/issues/feature/47/tasks/1793271819682.md +0 -0
  174. {defstream-0.1.23 → defstream-0.1.24}/issues/feature/47/tasks/1793272077066.md +0 -0
  175. {defstream-0.1.23 → defstream-0.1.24}/issues/feature/8/IMPLEMENTS.md +0 -0
  176. {defstream-0.1.23 → defstream-0.1.24}/issues/feature/8/README.md +0 -0
  177. {defstream-0.1.23 → defstream-0.1.24}/issues/feature/8/REQUIREMENTS.md +0 -0
  178. {defstream-0.1.23 → defstream-0.1.24}/issues/feature/8/ci.refs.json +0 -0
  179. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/10/IMPLEMENTS.md +0 -0
  180. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/10/README.md +0 -0
  181. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/10/REQUIREMENTS.md +0 -0
  182. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/13/README.md +0 -0
  183. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/21/IMPLEMENTS.md +0 -0
  184. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/21/ISSUE.md +0 -0
  185. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/21/README.md +0 -0
  186. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/21/REQUIREMENTS.md +0 -0
  187. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/24/IMPLEMENTS.md +0 -0
  188. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/24/ISSUE.md +0 -0
  189. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/24/README.md +0 -0
  190. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/24/REQUIREMENTS.md +0 -0
  191. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/25/IMPLEMENTS.md +0 -0
  192. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/25/ISSUE.md +0 -0
  193. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/25/README.md +0 -0
  194. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/25/REQUIREMENTS.md +0 -0
  195. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/25/TASK.md +0 -0
  196. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/26/IMPLEMENTS.md +0 -0
  197. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/26/ISSUE.md +0 -0
  198. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/26/README.md +0 -0
  199. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/26/REQUIREMENTS.md +0 -0
  200. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/29/ISSUE.md +0 -0
  201. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/29/README.md +0 -0
  202. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/29/REQUIREMENTS.md +0 -0
  203. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/29/TASK.md +0 -0
  204. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/3/IMPLEMENTS.md +0 -0
  205. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/3/README.md +0 -0
  206. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/3/REQUIREMENTS.md +0 -0
  207. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/3/ci.refs.json +0 -0
  208. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/41/CHANGELOG.md +0 -0
  209. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/41/IMPLEMENTS.md +0 -0
  210. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/41/PLAN.md +0 -0
  211. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/41/README.md +0 -0
  212. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/41/REQUIREMENTS.md +0 -0
  213. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/41/TASKS.md +0 -0
  214. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/41/implements/1793257519898.md +0 -0
  215. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/41/implements/1793257826069.md +0 -0
  216. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/41/tasks/1793256929057.md +0 -0
  217. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/41/tasks/1793256990072.md +0 -0
  218. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/41/tasks/1793257216492.md +0 -0
  219. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/41/tasks/1793257519899.md +0 -0
  220. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/41/tasks/1793257826068.md +0 -0
  221. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/43/CHANGELOG.md +0 -0
  222. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/43/IMPLEMENTS.md +0 -0
  223. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/43/PLAN.md +0 -0
  224. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/43/README.md +0 -0
  225. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/43/REQUIREMENTS.md +0 -0
  226. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/43/TASKS.md +0 -0
  227. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/43/implements/1793260818660.md +0 -0
  228. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/43/implements/1793261447018.md +0 -0
  229. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/43/tasks/1793260818661.md +0 -0
  230. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/43/tasks/1793261447019.md +0 -0
  231. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/43/tasks/1793262314955.md +0 -0
  232. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/50/CHANGELOG.md +0 -0
  233. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/50/IMPLEMENTS.md +0 -0
  234. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/50/PLAN.md +0 -0
  235. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/50/README.md +0 -0
  236. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/50/REQUIREMENTS.md +0 -0
  237. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/50/TASKS.md +0 -0
  238. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/50/implements/1793282630353.md +0 -0
  239. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/50/tasks/1793282630354.md +0 -0
  240. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/53/CHANGELOG.md +0 -0
  241. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/53/IMPLEMENTS.md +0 -0
  242. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/53/PLAN.md +0 -0
  243. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/53/README.md +0 -0
  244. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/53/REQUIREMENTS.md +0 -0
  245. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/53/TASKS.md +0 -0
  246. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/53/implements/1793294516720.md +0 -0
  247. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/53/implements/1793295445979.md +0 -0
  248. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/53/implements/1793295838896.md +0 -0
  249. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/53/implements/1793296500296.md +0 -0
  250. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/53/implements/1793299630936.md +0 -0
  251. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/53/implements/1793301537859.md +0 -0
  252. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/53/implements/1793301829543.md +0 -0
  253. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/53/implements/1793302547669.md +0 -0
  254. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/53/implements/1793327181557.md +0 -0
  255. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/53/implements/1793329241422.md +0 -0
  256. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/53/implements/1793516005517.md +0 -0
  257. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/53/implements/1793516879583.md +0 -0
  258. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/53/implements/1793517548589.md +0 -0
  259. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/53/implements/1793518878753.md +0 -0
  260. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/53/tasks/1793294230195.md +0 -0
  261. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/53/tasks/1793295445976.md +0 -0
  262. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/53/tasks/1793295838893.md +0 -0
  263. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/53/tasks/1793296500299.md +0 -0
  264. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/53/tasks/1793297795667.md +0 -0
  265. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/53/tasks/1793299630939.md +0 -0
  266. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/53/tasks/1793301829546.md +0 -0
  267. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/53/tasks/1793302844699.md +0 -0
  268. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/53/tasks/1793327181558.md +0 -0
  269. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/53/tasks/1793327685707.md +0 -0
  270. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/53/tasks/1793328011412.md +0 -0
  271. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/53/tasks/1793329241423.md +0 -0
  272. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/53/tasks/1793516005518.md +0 -0
  273. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/53/tasks/1793516879584.md +0 -0
  274. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/53/tasks/1793517548590.md +0 -0
  275. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/53/tasks/1793518878754.md +0 -0
  276. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/6/IMPLEMENTS.md +0 -0
  277. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/6/README.md +0 -0
  278. {defstream-0.1.23 → defstream-0.1.24}/issues/fix/6/REQUIREMENTS.md +0 -0
  279. {defstream-0.1.23 → defstream-0.1.24}/issues/task/18/IMPLEMENTS.md +0 -0
  280. {defstream-0.1.23 → defstream-0.1.24}/issues/task/18/README.md +0 -0
  281. {defstream-0.1.23 → defstream-0.1.24}/issues/task/18/REQUIREMENTS.md +0 -0
  282. {defstream-0.1.23 → defstream-0.1.24}/issues/task/32/IMPLEMENTS.md +0 -0
  283. {defstream-0.1.23 → defstream-0.1.24}/issues/task/32/ISSUE.md +0 -0
  284. {defstream-0.1.23 → defstream-0.1.24}/issues/task/32/PLAN.md +0 -0
  285. {defstream-0.1.23 → defstream-0.1.24}/issues/task/32/README.md +0 -0
  286. {defstream-0.1.23 → defstream-0.1.24}/issues/task/32/REQUIREMENTS.md +0 -0
  287. {defstream-0.1.23 → defstream-0.1.24}/issues/task/32/TASK.md +0 -0
  288. {defstream-0.1.23 → defstream-0.1.24}/issues/task/34/CHANGELOG.md +0 -0
  289. {defstream-0.1.23 → defstream-0.1.24}/issues/task/34/IMPLEMENTS.md +0 -0
  290. {defstream-0.1.23 → defstream-0.1.24}/issues/task/34/PLAN.md +0 -0
  291. {defstream-0.1.23 → defstream-0.1.24}/issues/task/34/README.md +0 -0
  292. {defstream-0.1.23 → defstream-0.1.24}/issues/task/34/REQUIREMENTS.md +0 -0
  293. {defstream-0.1.23 → defstream-0.1.24}/issues/task/36/CHANGELOG.md +0 -0
  294. {defstream-0.1.23 → defstream-0.1.24}/issues/task/36/IMPLEMENTS.md +0 -0
  295. {defstream-0.1.23 → defstream-0.1.24}/issues/task/36/PLAN.md +0 -0
  296. {defstream-0.1.23 → defstream-0.1.24}/issues/task/36/README.md +0 -0
  297. {defstream-0.1.23 → defstream-0.1.24}/issues/task/36/REQUIREMENTS.md +0 -0
  298. {defstream-0.1.23 → defstream-0.1.24}/issues/task/38/CHANGELOG.md +0 -0
  299. {defstream-0.1.23 → defstream-0.1.24}/issues/task/38/IMPLEMENTS.md +0 -0
  300. {defstream-0.1.23 → defstream-0.1.24}/issues/task/38/PLAN.md +0 -0
  301. {defstream-0.1.23 → defstream-0.1.24}/issues/task/38/README.md +0 -0
  302. {defstream-0.1.23 → defstream-0.1.24}/issues/task/38/REQUIREMENTS.md +0 -0
  303. {defstream-0.1.23 → defstream-0.1.24}/issues/task/38/TASKS.md +0 -0
  304. {defstream-0.1.23 → defstream-0.1.24}/issues/task/38/docs/CopilotReviewIssues.md +0 -0
  305. {defstream-0.1.23 → defstream-0.1.24}/issues/task/38/docs/CopilotReviewIssuesSetup.md +0 -0
  306. {defstream-0.1.23 → defstream-0.1.24}/issues/task/38/implements/1793291844133.md +0 -0
  307. {defstream-0.1.23 → defstream-0.1.24}/issues/task/38/tasks/1793291844134.md +0 -0
  308. {defstream-0.1.23 → defstream-0.1.24}/issues/task/38/tasks/1793292234123.md +0 -0
  309. {defstream-0.1.23 → defstream-0.1.24}/issues/task/57/CHANGELOG.md +0 -0
  310. {defstream-0.1.23 → defstream-0.1.24}/issues/task/57/IMPLEMENTS.md +0 -0
  311. {defstream-0.1.23 → defstream-0.1.24}/issues/task/57/PLAN.md +0 -0
  312. {defstream-0.1.23 → defstream-0.1.24}/issues/task/57/README.md +0 -0
  313. {defstream-0.1.23 → defstream-0.1.24}/issues/task/57/REQUIREMENTS.md +0 -0
  314. {defstream-0.1.23 → defstream-0.1.24}/issues/task/57/TASKS.md +0 -0
  315. {defstream-0.1.23 → defstream-0.1.24}/issues/task/57/implements/1793395003714.md +0 -0
  316. {defstream-0.1.23 → defstream-0.1.24}/issues/task/57/tasks/1793395003713.md +0 -0
  317. {defstream-0.1.23 → defstream-0.1.24}/issues/task/57/tasks/1793395058100.md +0 -0
  318. {defstream-0.1.23 → defstream-0.1.24}/pyproject.toml +0 -0
  319. {defstream-0.1.23 → defstream-0.1.24}/samples/Broker/RabbitMQ/Sample.RPC.py +0 -0
  320. {defstream-0.1.23 → defstream-0.1.24}/samples/Broker/RabbitMQ/Sample.Stream.py +0 -0
  321. {defstream-0.1.23 → defstream-0.1.24}/samples/Broker/RabbitMQ/Sample.py +0 -0
  322. {defstream-0.1.23 → defstream-0.1.24}/samples/Broker/Redis/Sample.Stream.py +0 -0
  323. {defstream-0.1.23 → defstream-0.1.24}/samples/Broker/Redis/Sample.py +0 -0
  324. {defstream-0.1.23 → defstream-0.1.24}/samples/Broker/Sample.py +0 -0
  325. {defstream-0.1.23 → defstream-0.1.24}/samples/Worker/RabbitMQ/Client.py +0 -0
  326. {defstream-0.1.23 → defstream-0.1.24}/samples/Worker/RabbitMQ/Tasks.py +0 -0
  327. {defstream-0.1.23 → defstream-0.1.24}/samples/Worker/RabbitMQ/Worker.py +0 -0
  328. {defstream-0.1.23 → defstream-0.1.24}/samples/Worker/Redis/Sample.py +0 -0
  329. {defstream-0.1.23 → defstream-0.1.24}/samples/Worker/Sample.py +0 -0
  330. {defstream-0.1.23 → defstream-0.1.24}/setup.cfg +0 -0
  331. {defstream-0.1.23 → defstream-0.1.24}/setup.py +0 -0
  332. {defstream-0.1.23 → defstream-0.1.24}/src/Broker/Configuration.py +0 -0
  333. {defstream-0.1.23 → defstream-0.1.24}/src/Broker/Connection.py +0 -0
  334. {defstream-0.1.23 → defstream-0.1.24}/src/Broker/Consumer.py +0 -0
  335. {defstream-0.1.23 → defstream-0.1.24}/src/Broker/Errors.py +0 -0
  336. {defstream-0.1.23 → defstream-0.1.24}/src/Broker/Event.py +0 -0
  337. {defstream-0.1.23 → defstream-0.1.24}/src/Broker/Implements/RabbitMQ/Configuration.py +0 -0
  338. {defstream-0.1.23 → defstream-0.1.24}/src/Broker/Implements/RabbitMQ/Connection.py +0 -0
  339. {defstream-0.1.23 → defstream-0.1.24}/src/Broker/Implements/RabbitMQ/Consumer.py +0 -0
  340. {defstream-0.1.23 → defstream-0.1.24}/src/Broker/Implements/RabbitMQ/Event.py +0 -0
  341. {defstream-0.1.23 → defstream-0.1.24}/src/Broker/Implements/RabbitMQ/Exchange.py +0 -0
  342. {defstream-0.1.23 → defstream-0.1.24}/src/Broker/Implements/RabbitMQ/Queue.py +0 -0
  343. {defstream-0.1.23 → defstream-0.1.24}/src/Broker/Implements/RabbitMQ/Serializer.py +0 -0
  344. {defstream-0.1.23 → defstream-0.1.24}/src/Broker/Implements/RabbitMQ/Stream.py +0 -0
  345. {defstream-0.1.23 → defstream-0.1.24}/src/Broker/Implements/RabbitMQ/Subscription.py +0 -0
  346. {defstream-0.1.23 → defstream-0.1.24}/src/Broker/Implements/RabbitMQ/__init__.py +0 -0
  347. {defstream-0.1.23 → defstream-0.1.24}/src/Broker/Implements/Redis/Configuration.py +0 -0
  348. {defstream-0.1.23 → defstream-0.1.24}/src/Broker/Implements/Redis/Connection.py +0 -0
  349. {defstream-0.1.23 → defstream-0.1.24}/src/Broker/Implements/Redis/Consumer.py +0 -0
  350. {defstream-0.1.23 → defstream-0.1.24}/src/Broker/Implements/Redis/Event.py +0 -0
  351. {defstream-0.1.23 → defstream-0.1.24}/src/Broker/Implements/Redis/Queue.py +0 -0
  352. {defstream-0.1.23 → defstream-0.1.24}/src/Broker/Implements/Redis/Serializer.py +0 -0
  353. {defstream-0.1.23 → defstream-0.1.24}/src/Broker/Implements/Redis/Subscription.py +0 -0
  354. {defstream-0.1.23 → defstream-0.1.24}/src/Broker/Implements/Redis/__init__.py +0 -0
  355. {defstream-0.1.23 → defstream-0.1.24}/src/Broker/Implements/__init__.py +0 -0
  356. {defstream-0.1.23 → defstream-0.1.24}/src/Broker/Priority.py +0 -0
  357. {defstream-0.1.23 → defstream-0.1.24}/src/Broker/Protocol.py +0 -0
  358. {defstream-0.1.23 → defstream-0.1.24}/src/Broker/__init__.py +0 -0
  359. {defstream-0.1.23 → defstream-0.1.24}/src/Descriptor/DataObject.py +0 -0
  360. {defstream-0.1.23 → defstream-0.1.24}/src/Descriptor/Types.py +0 -0
  361. {defstream-0.1.23 → defstream-0.1.24}/src/Descriptor/Value.py +0 -0
  362. {defstream-0.1.23 → defstream-0.1.24}/src/Descriptor/__init__.py +0 -0
  363. {defstream-0.1.23 → defstream-0.1.24}/src/Inspector/Extension.py +0 -0
  364. {defstream-0.1.23 → defstream-0.1.24}/src/Inspector/Extensions/Metrics.py +0 -0
  365. {defstream-0.1.23 → defstream-0.1.24}/src/Inspector/Extensions/Ping.py +0 -0
  366. {defstream-0.1.23 → defstream-0.1.24}/src/Inspector/Extensions/Play.html +0 -0
  367. {defstream-0.1.23 → defstream-0.1.24}/src/Inspector/Extensions/Play.py +0 -0
  368. {defstream-0.1.23 → defstream-0.1.24}/src/Inspector/Extensions/Specifications.py +0 -0
  369. {defstream-0.1.23 → defstream-0.1.24}/src/Inspector/Extensions/Status.html +0 -0
  370. {defstream-0.1.23 → defstream-0.1.24}/src/Inspector/Extensions/Status.py +0 -0
  371. {defstream-0.1.23 → defstream-0.1.24}/src/Inspector/Extensions/__init__.py +0 -0
  372. {defstream-0.1.23 → defstream-0.1.24}/src/Inspector/Inspector.py +0 -0
  373. {defstream-0.1.23 → defstream-0.1.24}/src/Inspector/Response.py +0 -0
  374. {defstream-0.1.23 → defstream-0.1.24}/src/Inspector/__init__.py +0 -0
  375. {defstream-0.1.23 → defstream-0.1.24}/src/Validator/Pattern.py +0 -0
  376. {defstream-0.1.23 → defstream-0.1.24}/src/Validator/Patterns/Array.py +0 -0
  377. {defstream-0.1.23 → defstream-0.1.24}/src/Validator/Patterns/Common.py +0 -0
  378. {defstream-0.1.23 → defstream-0.1.24}/src/Validator/Patterns/Compare.py +0 -0
  379. {defstream-0.1.23 → defstream-0.1.24}/src/Validator/Patterns/Condition.py +0 -0
  380. {defstream-0.1.23 → defstream-0.1.24}/src/Validator/Patterns/DataObject.py +0 -0
  381. {defstream-0.1.23 → defstream-0.1.24}/src/Validator/Patterns/DateTime.py +0 -0
  382. {defstream-0.1.23 → defstream-0.1.24}/src/Validator/Patterns/Number.py +0 -0
  383. {defstream-0.1.23 → defstream-0.1.24}/src/Validator/Patterns/Object.py +0 -0
  384. {defstream-0.1.23 → defstream-0.1.24}/src/Validator/Patterns/Size.py +0 -0
  385. {defstream-0.1.23 → defstream-0.1.24}/src/Validator/Patterns/String.py +0 -0
  386. {defstream-0.1.23 → defstream-0.1.24}/src/Validator/Patterns/Type.py +0 -0
  387. {defstream-0.1.23 → defstream-0.1.24}/src/Validator/Patterns/__init__.py +0 -0
  388. {defstream-0.1.23 → defstream-0.1.24}/src/Validator/Validate.py +0 -0
  389. {defstream-0.1.23 → defstream-0.1.24}/src/Validator/Validator.py +0 -0
  390. {defstream-0.1.23 → defstream-0.1.24}/src/Validator/__init__.py +0 -0
  391. {defstream-0.1.23 → defstream-0.1.24}/src/Worker/Executor.py +0 -0
  392. {defstream-0.1.23 → defstream-0.1.24}/src/Worker/Message.py +0 -0
  393. {defstream-0.1.23 → defstream-0.1.24}/src/Worker/Pool.py +0 -0
  394. {defstream-0.1.23 → defstream-0.1.24}/src/Worker/Run.py +0 -0
  395. {defstream-0.1.23 → defstream-0.1.24}/src/Worker/Specification.py +0 -0
  396. {defstream-0.1.23 → defstream-0.1.24}/src/Worker/Startup.py +0 -0
  397. {defstream-0.1.23 → defstream-0.1.24}/src/Worker/Worker.py +0 -0
  398. {defstream-0.1.23 → defstream-0.1.24}/src/Worker/__init__.py +0 -0
  399. {defstream-0.1.23 → defstream-0.1.24}/src/__init__.py +0 -0
  400. {defstream-0.1.23/tests → defstream-0.1.24/tests/rabbitmq}/test_rabbitmq_broker_methods.py +0 -0
  401. {defstream-0.1.23/tests → defstream-0.1.24/tests/redis}/test_redis.py +0 -0
  402. {defstream-0.1.23 → defstream-0.1.24}/tests/test_descriptor.py +0 -0
  403. {defstream-0.1.23 → defstream-0.1.24}/tests/test_logging.py +0 -0
  404. {defstream-0.1.23 → defstream-0.1.24}/tests/test_pool_callbacks.py +0 -0
  405. {defstream-0.1.23 → defstream-0.1.24}/tests/test_process_signals.py +0 -0
  406. {defstream-0.1.23 → defstream-0.1.24}/tests/test_status.py +0 -0
  407. {defstream-0.1.23 → defstream-0.1.24}/tests/test_status_ui.cjs +0 -0
  408. {defstream-0.1.23 → defstream-0.1.24}/tests/test_validator_patterns.py +0 -0
  409. {defstream-0.1.23 → defstream-0.1.24}/tests/test_worker_startup.py +0 -0
@@ -0,0 +1,26 @@
1
+ from pathlib import Path
2
+ from sys import (
3
+ exit,
4
+ path as module_path,
5
+ )
6
+ from unittest import TestLoader, TextTestRunner
7
+
8
+ ROOT = Path(__file__).resolve().parents[2]
9
+
10
+
11
+ def main() -> int:
12
+ module_path.insert(
13
+ 0,
14
+ str(ROOT),
15
+ )
16
+ modules: list[str] = [
17
+ f'tests.{test_file.stem}'
18
+ for test_file in sorted((ROOT / 'tests').glob('test_*.py'))
19
+ ]
20
+ suite = TestLoader().loadTestsFromNames(modules)
21
+ result = TextTestRunner(verbosity=2).run(suite)
22
+ return 0 if result.wasSuccessful() else 1
23
+
24
+
25
+ if __name__ == '__main__':
26
+ exit(main())
@@ -182,31 +182,6 @@ jobs:
182
182
  os: ubuntu-24.04
183
183
  env:
184
184
  PROJECT: DefStream
185
- DEFSTREAM_RABBITMQ_TESTS: '1'
186
- DEFSTREAM_REDIS_TESTS: '1'
187
- services:
188
- rabbitmq:
189
- image: rabbitmq:4.1
190
- ports:
191
- - 5672:5672
192
- env:
193
- RABBITMQ_DEFAULT_USER: guest
194
- RABBITMQ_DEFAULT_PASS: guest
195
- RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS: '-rabbit loopback_users []'
196
- options: >-
197
- --health-cmd "rabbitmq-diagnostics -q ping"
198
- --health-interval 10s
199
- --health-timeout 10s
200
- --health-retries 12
201
- redis:
202
- image: redis:7.4
203
- ports:
204
- - 6379:6379
205
- options: >-
206
- --health-cmd "redis-cli ping"
207
- --health-interval 5s
208
- --health-timeout 5s
209
- --health-retries 12
210
185
  steps:
211
186
  - name: Check out core
212
187
  uses: actions/checkout@v7
@@ -310,11 +285,10 @@ jobs:
310
285
  "$RUNNER_TEMP/installed/bin/python" -m pip install dist/*.whl
311
286
  "$RUNNER_TEMP/installed/bin/python" -m pip check
312
287
 
313
- - name: Test installed package
288
+ - name: Test core installed package
314
289
  run: |
315
290
  cd "$RUNNER_TEMP"
316
- "$RUNNER_TEMP/installed/bin/python" -m unittest discover \
317
- -s "$GITHUB_WORKSPACE/tests" -p 'test_*.py' -v
291
+ "$RUNNER_TEMP/installed/bin/python" "$GITHUB_WORKSPACE/.github/scripts/run_core_tests.py"
318
292
 
319
293
  - name: Set up Node for core UI tests
320
294
  uses: actions/setup-node@v7
@@ -333,10 +307,124 @@ jobs:
333
307
  if-no-files-found: error
334
308
  retention-days: 14
335
309
 
310
+ test-rabbitmq:
311
+ name: Test RabbitMQ ${{ matrix.broker.version }} / Python ${{ matrix.python }}
312
+ needs: changes
313
+ runs-on: ${{ matrix.os || 'ubuntu-latest' }}
314
+ timeout-minutes: 25
315
+ strategy:
316
+ fail-fast: false
317
+ matrix:
318
+ python: ['3.9', '3.10', '3.11', '3.12', '3.13', '3.14']
319
+ broker:
320
+ - version: '3.13'
321
+ compose_file: res/docker/rabbitmq/rabbitmq-3.yml
322
+ port: '55630'
323
+ - version: '4.4'
324
+ compose_file: res/docker/rabbitmq/rabbitmq-4.yml
325
+ port: '55640'
326
+ include:
327
+ - python: '3.9'
328
+ os: ubuntu-24.04
329
+ env:
330
+ RABBITMQ_TESTS: '1'
331
+ RABBITMQ_PORT: ${{ matrix.broker.port }}
332
+ BROKER_COMPOSE_FILE: ${{ matrix.broker.compose_file }}
333
+ steps:
334
+ - name: Check out core
335
+ uses: actions/checkout@v7
336
+ with:
337
+ ref: ${{ github.sha }}
338
+ fetch-depth: 0
339
+ persist-credentials: false
340
+
341
+ - name: Set up Python
342
+ uses: actions/setup-python@v7
343
+ with:
344
+ python-version: ${{ matrix.python }}
345
+
346
+ - name: Install source and RabbitMQ client
347
+ run: |
348
+ python -m pip install --upgrade "pip>=23" "setuptools>=77" "setuptools-scm>=8,<10" wheel
349
+ python -m pip install --editable . --config-settings EXTRAS=RabbitMQ
350
+
351
+ - name: Start RabbitMQ ${{ matrix.broker.version }}
352
+ run: docker compose -f "$BROKER_COMPOSE_FILE" up -d --wait
353
+
354
+ - name: Verify RabbitMQ plugins
355
+ run: |
356
+ enabled_plugins="$(
357
+ docker compose -f "$BROKER_COMPOSE_FILE" exec -T rabbitmq rabbitmq-plugins list --enabled --minimal
358
+ )"
359
+ for plugin in rabbitmq_management rabbitmq_prometheus rabbitmq_shovel rabbitmq_shovel_management; do
360
+ if ! grep -Fxq "$plugin" <<< "$enabled_plugins"; then
361
+ echo "RabbitMQ plugin is not enabled: $plugin" >&2
362
+ exit 1
363
+ fi
364
+ done
365
+
366
+ - name: Test RabbitMQ broker and worker compatibility
367
+ run: python -m unittest discover -s tests/rabbitmq -t . -p 'test_*.py' -v
368
+
369
+ - name: Stop broker containers
370
+ if: always()
371
+ run: docker compose -f "$BROKER_COMPOSE_FILE" down --remove-orphans
372
+
373
+ test-redis:
374
+ name: Test Redis ${{ matrix.broker.version }} / Python ${{ matrix.python }}
375
+ needs: changes
376
+ runs-on: ${{ matrix.os || 'ubuntu-latest' }}
377
+ timeout-minutes: 25
378
+ strategy:
379
+ fail-fast: false
380
+ matrix:
381
+ python: ['3.9', '3.10', '3.11', '3.12', '3.13', '3.14']
382
+ broker:
383
+ - version: '6.2'
384
+ compose_file: res/docker/redis/redis-6.yml
385
+ port: '56376'
386
+ - version: '7.4'
387
+ compose_file: res/docker/redis/redis-7.yml
388
+ port: '56377'
389
+ include:
390
+ - python: '3.9'
391
+ os: ubuntu-24.04
392
+ env:
393
+ REDIS_TESTS: '1'
394
+ REDIS_PORT: ${{ matrix.broker.port }}
395
+ BROKER_COMPOSE_FILE: ${{ matrix.broker.compose_file }}
396
+ steps:
397
+ - name: Check out core
398
+ uses: actions/checkout@v7
399
+ with:
400
+ ref: ${{ github.sha }}
401
+ fetch-depth: 0
402
+ persist-credentials: false
403
+
404
+ - name: Set up Python
405
+ uses: actions/setup-python@v7
406
+ with:
407
+ python-version: ${{ matrix.python }}
408
+
409
+ - name: Install source and Redis client
410
+ run: |
411
+ python -m pip install --upgrade "pip>=23" "setuptools>=77" "setuptools-scm>=8,<10" wheel
412
+ python -m pip install --editable . --config-settings EXTRAS=Redis
413
+
414
+ - name: Start Redis ${{ matrix.broker.version }}
415
+ run: docker compose -f "$BROKER_COMPOSE_FILE" up -d --wait
416
+
417
+ - name: Test Redis broker and worker compatibility
418
+ run: python -m unittest discover -s tests/redis -t . -p 'test_*.py' -v
419
+
420
+ - name: Stop broker container
421
+ if: always()
422
+ run: docker compose -f "$BROKER_COMPOSE_FILE" down --remove-orphans
423
+
336
424
  publish:
337
425
  name: Publish PyPI
338
426
  if: github.event_name == 'push' && github.ref == 'refs/heads/master' && needs.changes.outputs.release == 'true'
339
- needs: [changes, test]
427
+ needs: [changes, test, test-rabbitmq, test-redis]
340
428
  runs-on: ubuntu-latest
341
429
  timeout-minutes: 10
342
430
  environment: pypi
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: DefStream
3
- Version: 0.1.23
3
+ Version: 0.1.24
4
4
  Summary: Synchronous message processing with pluggable broker adapters
5
5
  Home-page: https://github.com/yong5eon/DefStream
6
6
  Author: Heo Yongseon
@@ -17,9 +17,9 @@ Requires-Python: >=3.9
17
17
  Description-Content-Type: text/markdown
18
18
  License-File: LICENSE
19
19
  Provides-Extra: rabbitmq
20
- Requires-Dist: DefStream-RabbitMQ==0.1.23; extra == "rabbitmq"
20
+ Requires-Dist: DefStream-RabbitMQ==0.1.24; extra == "rabbitmq"
21
21
  Provides-Extra: redis
22
- Requires-Dist: DefStream-Redis==0.1.23; extra == "redis"
22
+ Requires-Dist: DefStream-Redis==0.1.24; extra == "redis"
23
23
  Dynamic: author
24
24
  Dynamic: classifier
25
25
  Dynamic: description
@@ -20,6 +20,7 @@ setup.py
20
20
  .github/scripts/create-issues-from-reviews.mjs
21
21
  .github/scripts/create-pr-from-issue.mjs
22
22
  .github/scripts/prepare_upload.py
23
+ .github/scripts/run_core_tests.py
23
24
  .github/scripts/tests/__init__.py
24
25
  .github/scripts/tests/create-issues-from-reviews.test.mjs
25
26
  .github/scripts/tests/create-pr-from-issue.test.mjs
@@ -233,6 +234,33 @@ issues/task/38/docs/CopilotReviewIssuesSetup.md
233
234
  issues/task/38/implements/1793291844133.md
234
235
  issues/task/38/tasks/1793291844134.md
235
236
  issues/task/38/tasks/1793292234123.md
237
+ issues/task/39/CHANGELOG.md
238
+ issues/task/39/IMPLEMENTS.md
239
+ issues/task/39/PLAN.md
240
+ issues/task/39/README.md
241
+ issues/task/39/REQUIREMENTS.md
242
+ issues/task/39/TASKS.md
243
+ issues/task/39/implements/1793623390266.md
244
+ issues/task/39/implements/1793625464717.md
245
+ issues/task/39/implements/1793626388737.md
246
+ issues/task/39/implements/1793626820522.md
247
+ issues/task/39/implements/1793627348502.md
248
+ issues/task/39/implements/1793628366252.md
249
+ issues/task/39/implements/1793629199999.md
250
+ issues/task/39/implements/1793631035346.md
251
+ issues/task/39/tasks/1793620359610.md
252
+ issues/task/39/tasks/1793621161604.md
253
+ issues/task/39/tasks/1793621502459.md
254
+ issues/task/39/tasks/1793621903677.md
255
+ issues/task/39/tasks/1793623390265.md
256
+ issues/task/39/tasks/1793625269565.md
257
+ issues/task/39/tasks/1793626388737.md
258
+ issues/task/39/tasks/1793626820522.md
259
+ issues/task/39/tasks/1793627348502.md
260
+ issues/task/39/tasks/1793627590185.md
261
+ issues/task/39/tasks/1793628366252.md
262
+ issues/task/39/tasks/1793629199998.md
263
+ issues/task/39/tasks/1793631035345.md
236
264
  issues/task/57/CHANGELOG.md
237
265
  issues/task/57/IMPLEMENTS.md
238
266
  issues/task/57/PLAN.md
@@ -242,6 +270,13 @@ issues/task/57/TASKS.md
242
270
  issues/task/57/implements/1793395003714.md
243
271
  issues/task/57/tasks/1793395003713.md
244
272
  issues/task/57/tasks/1793395058100.md
273
+ res/docker/rabbitmq/README.md
274
+ res/docker/rabbitmq/enabled_plugins
275
+ res/docker/rabbitmq/rabbitmq-3.yml
276
+ res/docker/rabbitmq/rabbitmq-4.yml
277
+ res/docker/redis/README.md
278
+ res/docker/redis/redis-6.yml
279
+ res/docker/redis/redis-7.yml
245
280
  samples/Broker/Sample.py
246
281
  samples/Broker/RabbitMQ/Sample.RPC.py
247
282
  samples/Broker/RabbitMQ/Sample.Stream.py
@@ -321,7 +356,11 @@ src/Worker/Specification.py
321
356
  src/Worker/Startup.py
322
357
  src/Worker/Worker.py
323
358
  src/Worker/__init__.py
359
+ tests/__init__.py
324
360
  tests/_support.py
361
+ tests/_support_inspector.py
362
+ tests/_support_inspector_play.py
363
+ tests/_support_task_messages.py
325
364
  tests/test_broker_packaging.py
326
365
  tests/test_descriptor.py
327
366
  tests/test_inspector.py
@@ -332,24 +371,34 @@ tests/test_logging.py
332
371
  tests/test_pool_callbacks.py
333
372
  tests/test_process_signals.py
334
373
  tests/test_protocol_contracts.py
335
- tests/test_rabbitmq_broker_methods.py
336
- tests/test_rabbitmq_integration.py
337
- tests/test_rabbitmq_logging.py
338
- tests/test_rabbitmq_priorities.py
339
- tests/test_rabbitmq_rpc.py
340
- tests/test_rabbitmq_rpc_integration.py
341
- tests/test_rabbitmq_timeouts.py
342
- tests/test_rabbitmq_worker.py
343
- tests/test_redis.py
344
- tests/test_redis_integration.py
345
- tests/test_redis_logging.py
346
374
  tests/test_runner_hooks.py
347
375
  tests/test_specifications.py
348
376
  tests/test_status.py
349
377
  tests/test_status_ui.cjs
350
378
  tests/test_task_messages.py
351
- tests/test_task_priorities.py
352
379
  tests/test_validator_patterns.py
353
380
  tests/test_worker.py
354
381
  tests/test_worker_recovery.py
355
382
  tests/test_worker_startup.py
383
+ tests/rabbitmq/__init__.py
384
+ tests/rabbitmq/test_inspector.py
385
+ tests/rabbitmq/test_inspector_play.py
386
+ tests/rabbitmq/test_rabbitmq_broker_methods.py
387
+ tests/rabbitmq/test_rabbitmq_integration.py
388
+ tests/rabbitmq/test_rabbitmq_logging.py
389
+ tests/rabbitmq/test_rabbitmq_priorities.py
390
+ tests/rabbitmq/test_rabbitmq_rpc.py
391
+ tests/rabbitmq/test_rabbitmq_rpc_integration.py
392
+ tests/rabbitmq/test_rabbitmq_timeouts.py
393
+ tests/rabbitmq/test_rabbitmq_worker.py
394
+ tests/rabbitmq/test_specifications.py
395
+ tests/rabbitmq/test_task_messages.py
396
+ tests/rabbitmq/test_task_priorities.py
397
+ tests/redis/__init__.py
398
+ tests/redis/test_inspector.py
399
+ tests/redis/test_inspector_play.py
400
+ tests/redis/test_redis.py
401
+ tests/redis/test_redis_integration.py
402
+ tests/redis/test_redis_logging.py
403
+ tests/redis/test_task_messages.py
404
+ tests/redis/test_task_priorities.py
@@ -0,0 +1,3 @@
1
+ # 고객 영향 없음
2
+
3
+ 이번 변경은 DefStream의 공개 API나 고객 실행 동작을 변경하지 않습니다. RabbitMQ·Redis용 Docker Compose 구성과 테스트 연결 설정만 추가하여 개발 환경과 GitHub Actions의 브로커 통합 테스트를 지원합니다.
@@ -0,0 +1,33 @@
1
+ # 구현 결과
2
+
3
+ RabbitMQ 3.13·4.4와 Redis 6.2·7.4의 버전별 테스트용 Compose 환경을 추가하고, 로컬 테스트와 GitHub Actions가 각 버전의 포트에 연결하도록 구성했다. RabbitMQ 네 플러그인, 브로커 health check, 별도 컨테이너 이름 및 loopback 한정 포트 공개를 포함한다.
4
+
5
+ 통합 테스트의 환경변수 포트 지정은 기존 기본 포트를 보존한다. CI는 `test`에서 코어 테스트만 실행하고, `test-rabbitmq`와 `test-redis`에서 해당 브로커 전용 테스트와 Worker 호환성 테스트를 각각 실행한다. 브로커 job은 브로커 버전과 Python 3.9~3.14의 전체 조합을 매트릭스로 사용하고 해당 Compose project만 정리한다. 로컬 실행 절차는 [RabbitMQ 안내](../../../res/docker/rabbitmq/README.md)와 [Redis 안내](../../../res/docker/redis/README.md)에 각각 정리했다.
6
+
7
+ 코어 테스트는 `tests/` 루트에, RabbitMQ와 Redis 전용 테스트는 각각 `tests/rabbitmq/`, `tests/redis/`에 분리했다. `tests`를 패키지로 탐색하고 지원 모듈을 `tests.*`로 가져와 `redis` 테스트 디렉터리가 외부 Redis 클라이언트 import를 가리지 않게 했다. 이동한 로그 테스트의 샘플 경로도 프로젝트 루트를 기준으로 조정했다.
8
+
9
+ `tests/test_broker_packaging.py`는 저장소 루트의 무시된 `DefStream.egg-info` 대신 실제 설치된 distribution 메타데이터를 선택하도록 수정했다. 전체 310개 테스트가 통과하고 15개가 건너뛰어졌으며, 브로커별 테스트도 각각 통과했다. 상세 내용은 [패키징 테스트 수정 구현 기록](./implements/1793626388737.md)과 [전체 테스트 검증 기록](./tasks/1793626388737.md)에 정리했다.
10
+
11
+ 브로커 통합 테스트 활성화·포트 변수에서 `DEFSTREAM_` 접두사를 제거하고 CI, 테스트 지원 코드와 로컬 실행 안내를 함께 갱신했다. 새 환경 변수 이름을 사용하는 전체 테스트 310개가 통과하고 15개가 건너뛰어졌다. 자세한 내용은 [환경 변수 이름 변경 구현 기록](./implements/1793626820522.md)과 [검증 기록](./tasks/1793626820522.md)을 참고한다.
12
+
13
+ CI 테스트를 코어·RabbitMQ·Redis job으로 나누고 RabbitMQ 3.13·4.4, Redis 6.2·7.4 각각을 Python 3.9~3.14 전체 조합으로 검증하도록 매트릭스를 확장했다. 코어 전용 테스트 러너로 저장소 루트 테스트 207개 통과를 확인했다. 상세 변경과 제한은 [CI job 분리 구현 기록](./implements/1793627348502.md) 및 [검증 기록](./tasks/1793627348502.md)에 정리했다.
14
+
15
+ 브로커 job ID는 `test-rabbitmq`, `test-redis`로 단순화했다. 별도 job의 기능과 매트릭스 구성은 그대로 유지했다.
16
+
17
+ 실제 RabbitMQ 4.4 테스트에서 transient non-exclusive queue 선언 실패를 확인했다. 통합 테스트가 제품 기본 설정(`durable=True`)과 동일한 큐를 만들도록 수정했고, RabbitMQ 4.4 suite 전체가 통과했다. 자세한 내용은 [RabbitMQ 4 테스트 큐 호환성 수정](./implements/1793628366252.md)을 참고한다.
18
+
19
+ 브로커별 CI job이 선택한 adapter만 설치하는 점에 맞춰 공통 메시지 fixture에서 RabbitMQ 전용 `Reject`와 Redis 연결 import를 제거했다. RabbitMQ와 Redis connection API 검증도 각 전용 suite로 옮겨 다른 adapter가 설치되지 않은 환경에서 테스트를 import할 수 있게 했다. 상세 변경은 [브로커별 메시지 테스트 의존성 분리](./implements/1793629199999.md)에 기록했다.
20
+
21
+ 로컬 Docker에서 네 브로커의 health check와 RabbitMQ 플러그인 상태를 확인하고 Python 3.9·3.10·3.12·3.14 조합 16개를 통과했다. Actions 실행 #41459408504에서는 브로커 24개 job이 교차 import로 실패했으나 이를 분리한 뒤 실행 #41461742854에서 코어와 브로커 24개 job이 모두 통과했다. 이후 PR 리뷰에서 발견한 플러그인 이름의 부분 문자열 검사와 미사용 import를 수정했으며, 수정 내용은 [PR 리뷰 지적 수정](./implements/1793631035346.md)에 기록했다. 후속 CI 실행은 대기 중이다.
22
+
23
+ Compose 설정과 이전 정적 검증은 [기존 작업 기록](./tasks/1793623390265.md)에, 테스트 분리와 검증은 [테스트 분리 작업 기록](./tasks/1793625269565.md)에 정리했다.
24
+
25
+ ## 단계별 구현 기록
26
+
27
+ - [버전별 RabbitMQ·Redis 테스트 환경 추가](./implements/1793623390266.md)
28
+ - [코어·브로커 테스트 분리](./implements/1793625464717.md)
29
+ - [패키징 테스트 메타데이터 선택 수정](./implements/1793626388737.md)
30
+ - [브로커 테스트 환경 변수 이름 변경](./implements/1793626820522.md)
31
+ - [CI 테스트 job 분리와 버전 매트릭스](./implements/1793627348502.md)
32
+ - [브로커별 메시지 테스트 의존성 분리](./implements/1793629199999.md)
33
+ - [PR 리뷰 지적 수정](./implements/1793631035346.md)
@@ -0,0 +1,52 @@
1
+ # 작업 계획
2
+
3
+ ## 대상 요구사항
4
+
5
+ - RabbitMQ `3.13.x`·`4.4.x` 및 지정된 네 플러그인
6
+ - Redis `6.2`·`7.4` 경계 버전 검증
7
+ - 브로커별·버전별 Compose 파일, 컨테이너 이름, loopback 포트와 health check
8
+ - `tests/`의 코어 테스트와 `tests/rabbitmq/`, `tests/redis/`의 브로커 전용 테스트 분리
9
+ - 로컬 및 GitHub Actions 통합 테스트 실행
10
+
11
+ ## 수행 순서
12
+
13
+ 1. `res/docker/rabbitmq/`와 `res/docker/redis/`에 버전별 Compose 파일을 작성하고 RabbitMQ의 활성 플러그인 설정을 추가한다.
14
+ 2. 구성 파일의 이미지, 고정 컨테이너 이름, 포트, health check와 플러그인 설정을 정적으로 검증한다.
15
+ 3. 테스트가 Compose가 게시하는 RabbitMQ 포트 `55630`·`55640`, Redis 포트 `56376`·`56377`에 연결할 수 있도록 기존 통합 테스트 설정을 확인하고 필요한 부분만 조정한다.
16
+ 4. 코어 테스트를 `tests/` 루트에 두고 RabbitMQ·Redis 전용 테스트를 각각 하위 디렉터리에 분리한다. 전체 discovery에서 외부 `redis` 클라이언트 패키지가 테스트 디렉터리에 가려지지 않도록 패키지 경로를 설정한다.
17
+ 5. GitHub Actions에서 `test` job은 코어 테스트만 실행하고, `test-rabbitmq`·`test-redis` job은 각 브로커의 전용 테스트와 Worker 호환성 테스트를 수행하도록 분리한다. 각 브로커 job은 해당 브로커의 지원 버전과 Python `3.9`~`3.14`의 전체 조합을 매트릭스로 실행한다.
18
+ 6. Docker 엔진이 사용 가능하면 각 Compose 리소스를 기동하여 health check, RabbitMQ 플러그인 활성화와 통합 테스트를 검증한다. 사용할 수 없으면 실행하지 못한 범위를 기록한다.
19
+ 7. 로컬 실행·종료 방법과 포트·플러그인 정보를 작업 기록 및 필요한 문서에 반영하고 상대 링크를 검증한다.
20
+
21
+ ## 진행 상태
22
+
23
+ - [x] 버전별 Compose 파일, 컨테이너 이름, 포트, health check와 RabbitMQ 플러그인 설정 추가
24
+ - [x] 네 Compose 파일의 구문·이미지·컨테이너 이름·포트 검증
25
+ - [x] 통합 테스트 포트 환경변수 연결
26
+ - [x] 코어·RabbitMQ·Redis 테스트 디렉터리 분리 및 전체 discovery 연결
27
+ - [x] 코어·RabbitMQ·Redis CI job 분리, 브로커 버전 × Python 버전 전체 매트릭스와 플러그인 검사·정리 절차 추가
28
+ - [x] 교차 import 수정 후 GitHub Actions 브로커 매트릭스 24개 job 재실행 및 통과 확인
29
+ - [ ] PR 리뷰의 플러그인 정확 일치 검사·미사용 import 수정 후 CI 재실행
30
+ - [x] 실제 컨테이너 기동·health check·플러그인 및 브로커 통합 테스트: 네 브로커와 16개 로컬 브로커 × Python 조합 검증
31
+ - [x] 로컬 실행 문서와 작업 기록 갱신
32
+
33
+ ## 검증 방법
34
+
35
+ - Docker Compose 설정 검증 명령으로 네 Compose 파일을 각각 확인한다.
36
+ - 통합 테스트를 RabbitMQ `3.13.x`와 `4.4.x`, Redis `6.2`와 `7.4`에 연결하여 실행한다.
37
+ - RabbitMQ `rabbitmq-plugins list --enabled` 결과에서 네 플러그인을 확인한다.
38
+ - 저장소의 기존 CI 테스트 범위와 패키지 검증이 유지되는지 확인한다.
39
+
40
+ ## 실행 결과
41
+
42
+ - `docker compose config --format json`으로 네 Compose 파일의 구문을 검사하고 각 이미지, Compose project 이름, 컨테이너 이름과 포트 매핑을 확인했다.
43
+ - 코어 테스트를 `tests/`, RabbitMQ 테스트를 `tests/rabbitmq/`, Redis 테스트를 `tests/redis/`에 분리했다. 패키지 경로 기반 unittest discovery와 `tests/redis` 이름 충돌 방지 설정을 적용했다.
44
+ - 브로커별 discovery는 RabbitMQ 71개(7개 건너뜀), Redis 32개(8개 건너뜀)로 통과했다. 변경된 코어 Inspector·Play·runner hook 테스트 40개, 명세 테스트 28개, 메시지 테스트 11개(3개 건너뜀)도 통과했다.
45
+ - 저장소 루트의 로컬 egg-info가 설치된 distribution보다 우선 선택되는 문제를 패키징 테스트에서 해결했다. CI와 같은 외부 작업 디렉터리에서 전체 discovery를 실행해 310개 테스트 통과와 15개 건너뜀을 확인했다.
46
+ - RabbitMQ 71개(7개 건너뜀), Redis 32개(8개 건너뜀) 테스트와 GitHub Actions YAML 파싱, `git diff --check`도 통과했다. 상세 결과는 [패키징 테스트 수정 및 전체 테스트 검증 기록](./tasks/1793626388737.md)을 참고한다.
47
+ - 브로커 테스트 환경 변수 이름에서 `DEFSTREAM_` 접두사를 제거하고 CI, 테스트, 로컬 실행 안내와 요구사항 명세를 갱신했다. 새 포트 변수 조회 및 전체 310개 테스트(15개 건너뜀)를 통과했다. 자세한 내용은 [브로커 테스트 환경 변수 이름 변경 검증](./tasks/1793626820522.md)에 기록했다.
48
+ - CI에서 코어 테스트를 루트 테스트 모듈로 제한하고 RabbitMQ·Redis job을 각각 분리했다. 각 브로커 job은 두 지원 버전과 Python 3.9~3.14의 12개 조합을 실행하도록 구성했다. 전용 core runner에서 코어 테스트 207개가 통과했으며 YAML 구조상 총 6개 코어 조합과 브로커별 12개 조합이 확인됐다. Docker 엔진이 없어 매트릭스의 실제 브로커 실행은 검증하지 못했다. 자세한 내용은 [CI 테스트 매트릭스 분리 기록](./tasks/1793627348502.md)을 참고한다.
49
+ - 브로커 job ID를 `test-rabbitmq`, `test-redis`로 단순화하고 publish 의존 관계와 이슈 기록을 갱신했다. 변경 내용은 [CI 브로커 job 이름 단순화 기록](./tasks/1793627590185.md)에 기록했다.
50
+ - RabbitMQ 3.13·4.4와 Redis 6.2·7.4를 기동해 health check를 통과시켰고 RabbitMQ 필수 플러그인을 확인했다. 설치된 Python 3.9·3.10·3.12·3.14 각 버전에서 네 브로커 테스트를 실행해 16개 조합을 통과했다. 최초 RabbitMQ 4.4 실행에서 확인된 transient non-exclusive queue 호환성 문제는 테스트 큐를 제품 기본 계약과 일치하도록 durable하게 선언해 해결했다. 상세 결과는 [Docker 기반 통합 테스트 기록](./tasks/1793628366252.md), 수정 내용은 [구현 기록](./implements/1793628366252.md)을 참고한다.
51
+ - GitHub Actions 실행 #41459408504에서 코어 테스트는 통과했지만 24개 브로커 job은 공통 테스트 모듈의 RabbitMQ·Redis 교차 import로 실패했다. 공통 fixture와 브로커별 API 검증을 분리한 뒤 실행 #41461742854에서 코어 및 브로커 24개 job 전체가 통과했다. 원인과 로컬 import 격리 결과는 [작업 기록](./tasks/1793629199998.md)을 참고한다.
52
+ - PR 리뷰에서 지적한 플러그인 이름 부분 문자열 비교와 미사용 import를 수정했다. `tests.test_inspector_play` 21개가 통과했고, 수정 후 CI 재실행 결과는 대기 중이다. [리뷰 수정 작업 기록](./tasks/1793631035345.md)을 참고한다.
@@ -0,0 +1,85 @@
1
+ # RabbitMQ·Redis 지원 범위에 맞는 테스트·워크플로용 Docker 설정 리소스 제공
2
+
3
+ ## 이슈 정보
4
+
5
+ | 항목 | 내용 |
6
+ | --- | --- |
7
+ | 출처 | GitHub Issues |
8
+ | 저장소 | `yong5eon/DefStream` |
9
+ | 원본 이슈 | [#39](https://github.com/yong5eon/DefStream/issues/39) |
10
+ | 상태 | Open |
11
+ | 유형·레이블 | 작업 (`task`, 원본 이슈에 적용됨) |
12
+ | 로컬 진행 상태 | 네 브로커 버전과 Python 3.9·3.10·3.12·3.14의 16개 조합 통과; import 분리 후 Actions 실행 #41461742854에서 코어와 브로커 24개 job 통과; PR 리뷰 지적 2건을 수정해 후속 CI 대기 |
13
+ | 작업 브랜치 | `task/39` |
14
+ | 분기 기준 | `master` |
15
+ | 병합 대상 브랜치 | 미지정 |
16
+
17
+ ## 원본 이슈
18
+
19
+ ## 목적
20
+
21
+ DefStream의 RabbitMQ와 Redis 지원 범위에 맞는 Docker 설정 리소스를 제공하여, 로컬 테스트와 GitHub Actions 워크플로에서 재현 가능한 브로커 환경을 사용할 수 있도록 합니다. 이 이슈는 추후 수행할 작업을 등록하는 것이며 현재 구성이 제공되었다는 의미는 아닙니다.
22
+
23
+ ## 작업 범위
24
+
25
+ - 프로젝트의 RabbitMQ와 Redis 지원 버전 및 필요한 구성 범위를 확인하고, 그 범위에 맞는 Docker 설정 리소스를 제공합니다. 지원 범위가 불명확하면 구현 전에 확정하며 임의로 버전을 확대하거나 축소하지 않습니다.
26
+ - 테스트에 필요한 브로커 설정, 연결 정보, 준비 상태 확인 방법을 포함하여 일관된 테스트 환경을 구성합니다.
27
+ - 로컬 테스트와 GitHub Actions 워크플로에서 해당 리소스를 활용할 수 있도록 연결합니다. 지원 버전별 검증이 필요한 경우 확인된 지원 범위에 맞춰 테스트 구성을 마련합니다.
28
+ - 브로커가 준비된 뒤 테스트를 실행하고, 기동 실패·연결 실패·테스트 실패가 성공으로 처리되지 않도록 합니다.
29
+ - 테스트 환경의 기동·종료·정리 절차와 실행 방법을 한국어로 문서화하고, 관련 영문 문서는 프로젝트 지침에 따라 동기화합니다.
30
+ - 운영 자격 증명을 포함하지 않고, 테스트용 설정과 운영용 설정의 차이를 명확히 합니다. 로컬 사용자 데이터나 다른 컨테이너에 영향을 주지 않도록 테스트 자원을 구분합니다.
31
+
32
+ ## 완료 기준
33
+
34
+ - [ ] RabbitMQ와 Redis의 지원 버전·구성 범위가 확인되고 Docker 리소스와 대응됨
35
+ - [ ] 제공된 리소스로 로컬 브로커 환경을 기동하여 관련 통합 테스트를 실행할 수 있음
36
+ - [ ] GitHub Actions에서 같은 지원 범위에 대한 브로커 테스트가 실행됨
37
+ - [ ] 브로커 준비 상태 확인, 실패 전파 및 테스트 자원 정리 동작이 검증됨
38
+ - [ ] 실행에 필요한 환경·명령·연결 설정·종료 및 정리 방법이 문서화됨
39
+ - [ ] 실제 검증한 버전과 테스트 범위, 검증하지 못한 범위가 기록됨
40
+
41
+ ## 추가 요청사항
42
+
43
+ - RabbitMQ 컨테이너는 다음 플러그인을 활성화하여 생성합니다.
44
+ - `rabbitmq_management`
45
+ - `rabbitmq_prometheus`
46
+ - `rabbitmq_shovel`
47
+ - `rabbitmq_shovel_management`
48
+ - RabbitMQ는 각 메이저의 최신 마이너 계열인 `3.13.x`와 `4.4.x`를 지원 대상으로 조사·검증합니다. `3.13.x`는 RabbitMQ 자체의 커뮤니티 지원이 종료된 계열이므로, 이는 DefStream이 별도로 유지할 호환성 범위입니다.
49
+ - Redis Streams는 Redis 5.0에서 도입되었지만, DefStream은 기본 소비 복구에 Redis 6.2에서 도입된 `XAUTOCLAIM`을 사용하므로 지원 하한은 `6.2`입니다. Redis CI는 최소 버전인 `6.2`와 현재 CI 검증 버전인 `7.4`를 대상으로 합니다.
50
+ - Compose 파일은 `res/docker/rabbitmq/`와 `res/docker/redis/`에 두고, 컨테이너 이름은 각각 `RabbitMQ-3`, `RabbitMQ-4`, `Redis-6`, `Redis-7`로 지정합니다.
51
+
52
+ ## 현재 진행 상태
53
+
54
+ - 네 Compose 파일, RabbitMQ 플러그인 설정, 통합 테스트 포트 연결과 CI 검증 job을 추가했습니다.
55
+ - 코어 테스트는 `tests/`, RabbitMQ 전용 테스트는 `tests/rabbitmq/`, Redis 전용 테스트는 `tests/redis/`로 분리하고 전체 discovery가 하위 테스트를 포함하도록 구성했습니다.
56
+ - CI가 저장소 외부에서 테스트를 실행할 때도 동일하게 탐색하도록 top-level 경로를 지정했습니다.
57
+ - 저장소 루트의 로컬 egg-info가 설치된 distribution 메타데이터를 가리는 문제를 패키징 테스트에서 해결했습니다. CI와 같은 외부 작업 디렉터리 기준 전체 310개 테스트가 통과했고 15개는 건너뛰었습니다.
58
+ - 로컬 Docker에서 네 브로커의 health check와 RabbitMQ 플러그인을 확인하고 16개 브로커 × Python 조합을 통과했습니다. 공통 fixture의 교차 import를 분리한 뒤 Actions 실행 #41461742854에서 코어 테스트와 RabbitMQ·Redis 24개 job이 모두 통과했습니다. 이후 PR 리뷰에서 지적한 RabbitMQ 플러그인 이름의 정확 일치 검사와 미사용 import를 수정했으며, 이 변경을 포함한 CI 재실행은 대기 중입니다.
59
+
60
+ ## 작업 기록
61
+
62
+ - [요구사항 명세서](./REQUIREMENTS.md)
63
+ - [작업 계획서](./PLAN.md)
64
+ - [RabbitMQ 로컬 테스트 환경](../../../res/docker/rabbitmq/README.md)
65
+ - [Redis 로컬 테스트 환경](../../../res/docker/redis/README.md)
66
+ - [구현 종합 기록](./IMPLEMENTS.md)
67
+ - [고객용 변경 로그](./CHANGELOG.md)
68
+ - [패키징 테스트 수정·전체 테스트 검증 기록](./tasks/1793626388737.md)
69
+ - [패키징 테스트 메타데이터 선택 수정](./implements/1793626388737.md)
70
+ - [브로커 환경 변수 이름 변경 작업 기록](./tasks/1793626820522.md)
71
+ - [브로커 테스트 환경 변수 이름 변경 구현 기록](./implements/1793626820522.md)
72
+ - [CI 매트릭스 분리 작업 기록](./tasks/1793627348502.md)
73
+ - [CI 테스트 job 분리 구현 기록](./implements/1793627348502.md)
74
+ - [CI 브로커 job 이름 단순화 기록](./tasks/1793627590185.md)
75
+ - [Docker 기반 브로커 × Python 통합 테스트 기록](./tasks/1793628366252.md)
76
+ - [RabbitMQ 4 테스트 큐 호환성 수정 기록](./implements/1793628366252.md)
77
+ - [브로커별 메시지 테스트 import 격리 검증](./tasks/1793629199998.md)
78
+ - [브로커별 메시지 테스트 의존성 분리](./implements/1793629199999.md)
79
+ - [PR 리뷰 수정 검증](./tasks/1793631035345.md)
80
+ - [PR 리뷰 지적 수정](./implements/1793631035346.md)
81
+ - [테스트 분리·검증 작업 기록](./tasks/1793625269565.md)
82
+ - [테스트 분리 구현 기록](./implements/1793625464717.md)
83
+ - RabbitMQ 지원 버전 조사: [조사 결과](./TASKS.md), [단계별 기록](./tasks/1793620359610.md), [버전 범위 결정](./tasks/1793621161604.md)
84
+ - Redis Streams 최소 버전 조사: [조사 결과](./TASKS.md), [단계별 기록](./tasks/1793621502459.md)
85
+ - Redis 최소 버전 및 CI 검증 대상 결정: [단계별 기록](./tasks/1793621903677.md)
@@ -0,0 +1,54 @@
1
+ # 요구사항 명세
2
+
3
+ ## 목적
4
+
5
+ RabbitMQ와 Redis 지원 범위의 경계 버전에서 통합 테스트를 실행할 수 있도록 버전별 Docker Compose 리소스를 제공한다.
6
+
7
+ ## 확정 요구사항
8
+
9
+ - RabbitMQ는 `3.13.x`와 `4.4.x`, Redis는 `6.2` 이상을 지원 대상으로 한다.
10
+ - 버전별 Compose 파일을 다음 위치에 분리한다.
11
+ - `res/docker/rabbitmq/rabbitmq-3.yml`
12
+ - `res/docker/rabbitmq/rabbitmq-4.yml`
13
+ - `res/docker/redis/redis-6.yml`
14
+ - `res/docker/redis/redis-7.yml`
15
+ - RabbitMQ 컨테이너는 각각 `RabbitMQ-3`, `RabbitMQ-4`로 생성하고 다음 플러그인을 활성화한다.
16
+ - `rabbitmq_management`
17
+ - `rabbitmq_prometheus`
18
+ - `rabbitmq_shovel`
19
+ - `rabbitmq_shovel_management`
20
+ - RabbitMQ 포트는 다음처럼 호스트 loopback에 게시한다.
21
+
22
+ | 컨테이너 | AMQP | Management | Prometheus |
23
+ | --- | --- | --- | --- |
24
+ | `RabbitMQ-3` | `55630:5672` | `55631:15672` | `55632:15692` |
25
+ | `RabbitMQ-4` | `55640:5672` | `55641:15672` | `55642:15692` |
26
+
27
+ - Redis 컨테이너는 `Redis-6`, `Redis-7`로 생성하고 다음 포트를 호스트 loopback에 게시한다.
28
+ - `Redis-6`: `56376:6379`
29
+ - `Redis-7`: `56377:6379`
30
+ - 모든 컨테이너는 시작 준비 상태를 확인하는 health check를 제공한다.
31
+ - Docker Compose 리소스는 테스트용이며 운영 자격 증명이나 호스트 전체 인터페이스에 대한 포트 공개를 포함하지 않는다.
32
+ - GitHub Actions에서 `test`는 `tests/` 루트의 코어 테스트만 실행한다. `test-rabbitmq`와 `test-redis`는 각각 해당 브로커 전용 테스트와 Worker 호환성 테스트를 실행한다.
33
+ - RabbitMQ `3.13.x`·`4.4.x`, Redis `6.2`·`7.4` 각각에 대해 지원 Python 버전 `3.9`~`3.14`를 조합해 검증한다. 브로커별 검증은 브로커 버전과 Python 버전의 전체 조합으로 실행한다.
34
+ - 코어 테스트는 `tests/` 루트에 두고, RabbitMQ 전용 테스트와 Redis 전용 테스트는 각각 `tests/rabbitmq/`, `tests/redis/`에 분리한다. 전체 테스트 discovery는 세 위치의 테스트를 모두 포함해야 한다.
35
+
36
+ ## 완료 기준
37
+
38
+ - 각 Compose 파일이 해당 컨테이너 이름, 이미지 계열, 호스트 포트와 health check를 선언한다.
39
+ - RabbitMQ 컨테이너 시작 시 네 플러그인이 모두 활성화된다.
40
+ - 동일 브로커의 버전별 컨테이너를 겹치지 않는 포트로 실행할 수 있다.
41
+ - Docker Compose 설정 검증이 성공하고, Docker 엔진이 사용 가능한 환경에서 컨테이너 기동·health check와 플러그인 활성화를 확인한다.
42
+ - GitHub Actions가 코어 테스트와 브로커별 테스트를 분리하고, 브로커마다 지원 버전과 Python 버전의 모든 조합을 검증한다.
43
+ - `tests/` 루트에는 코어 테스트만 남고, 브로커 전용 테스트는 각 브로커 디렉터리에서 독립적으로 발견·실행된다.
44
+
45
+ ## 통합 테스트 연결 설정
46
+
47
+ - RabbitMQ 통합 테스트는 `RABBITMQ_PORT`를 사용하고, 미설정 시 기존 기본 포트 `5672`를 사용한다.
48
+ - Redis 통합 테스트는 `REDIS_PORT`를 사용하고, 미설정 시 기존 기본 포트 `6379`를 사용한다.
49
+ - RabbitMQ·Redis 통합 테스트는 각각 `RABBITMQ_TESTS`, `REDIS_TESTS`가 `'1'`일 때 활성화한다.
50
+ - Compose 컨테이너 이름은 `RabbitMQ-3`, `RabbitMQ-4`, `Redis-6`, `Redis-7`이며, 컨테이너를 동시에 실행할 수 있도록 호스트 포트 매핑을 구분한다.
51
+
52
+ ## 확인된 제한사항
53
+
54
+ - 로컬 환경의 Docker 엔진이 실행되지 않으면 실제 이미지 pull, 컨테이너 기동과 플러그인 상태를 검증할 수 없다. 이 경우 Compose 정적 설정 검증과 미실행 사유를 구분해 기록한다.