DefStream-RabbitMQ 0.1.24__tar.gz → 0.1.25__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.
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/PKG-INFO +2 -2
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/build/RabbitMQ/DefStream_RabbitMQ.egg-info/SOURCES.txt +12 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/docs/Tasks.en.md +40 -3
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/docs/Tasks.md +38 -3
- defstream_rabbitmq-0.1.25/issues/feature/55/CHANGELOG.md +7 -0
- defstream_rabbitmq-0.1.25/issues/feature/55/IMPLEMENTS.md +26 -0
- defstream_rabbitmq-0.1.25/issues/feature/55/PLAN.md +77 -0
- defstream_rabbitmq-0.1.25/issues/feature/55/README.md +81 -0
- defstream_rabbitmq-0.1.25/issues/feature/55/REQUIREMENTS.md +67 -0
- defstream_rabbitmq-0.1.25/issues/feature/55/TASKS.md +22 -0
- defstream_rabbitmq-0.1.25/issues/feature/55/implements/1793714914193.md +7 -0
- defstream_rabbitmq-0.1.25/issues/feature/55/implements/1793717149425.md +7 -0
- defstream_rabbitmq-0.1.25/issues/feature/55/tasks/1793705387888.md +7 -0
- defstream_rabbitmq-0.1.25/issues/feature/55/tasks/1793714914194.md +9 -0
- defstream_rabbitmq-0.1.25/issues/feature/55/tasks/1793715537355.md +5 -0
- defstream_rabbitmq-0.1.25/issues/feature/55/tasks/1793717149426.md +9 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Worker/Message.py +93 -13
- defstream_rabbitmq-0.1.25/tests/test_task_messages.py +533 -0
- defstream_rabbitmq-0.1.24/tests/test_task_messages.py +0 -251
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/.dev/scripts/editable_view.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/.dev/scripts/tests/__init__.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/.dev/scripts/tests/test_editable_view.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/.distribution-target +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/.github/ISSUE_TEMPLATE/01.feature.yml +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/.github/ISSUE_TEMPLATE/02.bug.yml +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/.github/ISSUE_TEMPLATE/03.fix.yml +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/.github/ISSUE_TEMPLATE/04.task.yml +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/.github/scripts/build_backend.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/.github/scripts/build_distributions.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/.github/scripts/check_distributions.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/.github/scripts/create-issues-from-reviews.mjs +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/.github/scripts/create-pr-from-issue.mjs +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/.github/scripts/prepare_upload.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/.github/scripts/run_core_tests.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/.github/scripts/tests/__init__.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/.github/scripts/tests/create-issues-from-reviews.test.mjs +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/.github/scripts/tests/create-pr-from-issue.test.mjs +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/.github/scripts/tests/test_build_backend.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/.github/scripts/tests/test_distributions.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/.github/scripts/tests/test_release.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/.github/workflows/ci.yml +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/.github/workflows/create-issues-from-reviews.yml +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/.github/workflows/create-pr-from-issue.yml +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/.gitignore +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/LICENSE +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/README.en.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/README.setup.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/docs/Contracts.en.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/docs/Contracts.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/docs/GettingStarted.en.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/docs/GettingStarted.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/docs/LifecycleHooks.en.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/docs/LifecycleHooks.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/docs/Operations.en.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/docs/Operations.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/docs/Packaging.en.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/docs/Packaging.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/docs/README.en.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/docs/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/docs/RabbitMQ.en.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/docs/RabbitMQ.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/docs/Redis.en.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/docs/Redis.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/instructions/CODE.instructions.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/instructions/DOCS.instructions.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/instructions/README.instructions.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/bug/16/IMPLEMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/bug/16/ISSUE.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/bug/16/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/bug/16/REQUIREMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/feature/1/IMPLEMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/feature/1/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/feature/1/REQUIREMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/feature/1/TASK.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/feature/1/ci.refs.json +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/feature/46/CHANGELOG.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/feature/46/IMPLEMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/feature/46/PLAN.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/feature/46/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/feature/46/REQUIREMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/feature/46/TASKS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/feature/46/implements/1793274693488.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/feature/46/implements/1793275218996.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/feature/46/implements/1793275899489.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/feature/46/implements/1793276075771.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/feature/46/implements/1793276518340.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/feature/46/implements/1793277364116.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/feature/46/implements/1793278267422.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/feature/46/implements/1793278764701.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/feature/46/implements/1793279849390.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/feature/46/tasks/1793272872217.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/feature/46/tasks/1793274121654.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/feature/46/tasks/1793274231988.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/feature/46/tasks/1793275218995.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/feature/46/tasks/1793275501812.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/feature/46/tasks/1793275955973.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/feature/46/tasks/1793276099601.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/feature/46/tasks/1793276518341.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/feature/46/tasks/1793277424063.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/feature/46/tasks/1793278267423.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/feature/46/tasks/1793278764702.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/feature/46/tasks/1793279849391.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/feature/47/CHANGELOG.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/feature/47/IMPLEMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/feature/47/PLAN.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/feature/47/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/feature/47/REQUIREMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/feature/47/TASKS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/feature/47/implements/1793271568985.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/feature/47/implements/1793272077065.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/feature/47/tasks/1793271236067.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/feature/47/tasks/1793271384432.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/feature/47/tasks/1793271506089.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/feature/47/tasks/1793271819682.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/feature/47/tasks/1793272077066.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/feature/8/IMPLEMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/feature/8/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/feature/8/REQUIREMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/feature/8/ci.refs.json +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/10/IMPLEMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/10/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/10/REQUIREMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/13/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/21/IMPLEMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/21/ISSUE.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/21/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/21/REQUIREMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/24/IMPLEMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/24/ISSUE.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/24/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/24/REQUIREMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/25/IMPLEMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/25/ISSUE.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/25/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/25/REQUIREMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/25/TASK.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/26/IMPLEMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/26/ISSUE.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/26/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/26/REQUIREMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/29/ISSUE.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/29/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/29/REQUIREMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/29/TASK.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/3/IMPLEMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/3/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/3/REQUIREMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/3/ci.refs.json +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/41/CHANGELOG.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/41/IMPLEMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/41/PLAN.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/41/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/41/REQUIREMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/41/TASKS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/41/implements/1793257519898.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/41/implements/1793257826069.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/41/tasks/1793256929057.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/41/tasks/1793256990072.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/41/tasks/1793257216492.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/41/tasks/1793257519899.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/41/tasks/1793257826068.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/43/CHANGELOG.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/43/IMPLEMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/43/PLAN.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/43/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/43/REQUIREMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/43/TASKS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/43/implements/1793260818660.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/43/implements/1793261447018.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/43/tasks/1793260818661.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/43/tasks/1793261447019.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/43/tasks/1793262314955.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/50/CHANGELOG.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/50/IMPLEMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/50/PLAN.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/50/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/50/REQUIREMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/50/TASKS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/50/implements/1793282630353.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/50/tasks/1793282630354.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/53/CHANGELOG.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/53/IMPLEMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/53/PLAN.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/53/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/53/REQUIREMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/53/TASKS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/53/implements/1793294516720.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/53/implements/1793295445979.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/53/implements/1793295838896.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/53/implements/1793296500296.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/53/implements/1793299630936.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/53/implements/1793301537859.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/53/implements/1793301829543.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/53/implements/1793302547669.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/53/implements/1793327181557.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/53/implements/1793329241422.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/53/implements/1793516005517.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/53/implements/1793516879583.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/53/implements/1793517548589.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/53/implements/1793518878753.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/53/tasks/1793294230195.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/53/tasks/1793295445976.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/53/tasks/1793295838893.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/53/tasks/1793296500299.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/53/tasks/1793297795667.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/53/tasks/1793299630939.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/53/tasks/1793301829546.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/53/tasks/1793302844699.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/53/tasks/1793327181558.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/53/tasks/1793327685707.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/53/tasks/1793328011412.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/53/tasks/1793329241423.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/53/tasks/1793516005518.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/53/tasks/1793516879584.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/53/tasks/1793517548590.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/53/tasks/1793518878754.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/6/IMPLEMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/6/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/fix/6/REQUIREMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/18/IMPLEMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/18/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/18/REQUIREMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/32/IMPLEMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/32/ISSUE.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/32/PLAN.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/32/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/32/REQUIREMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/32/TASK.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/34/CHANGELOG.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/34/IMPLEMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/34/PLAN.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/34/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/34/REQUIREMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/36/CHANGELOG.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/36/IMPLEMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/36/PLAN.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/36/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/36/REQUIREMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/38/CHANGELOG.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/38/IMPLEMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/38/PLAN.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/38/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/38/REQUIREMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/38/TASKS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/38/docs/CopilotReviewIssues.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/38/docs/CopilotReviewIssuesSetup.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/38/implements/1793291844133.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/38/tasks/1793291844134.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/38/tasks/1793292234123.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/39/CHANGELOG.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/39/IMPLEMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/39/PLAN.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/39/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/39/REQUIREMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/39/TASKS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/39/implements/1793623390266.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/39/implements/1793625464717.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/39/implements/1793626388737.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/39/implements/1793626820522.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/39/implements/1793627348502.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/39/implements/1793628366252.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/39/implements/1793629199999.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/39/implements/1793631035346.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/39/tasks/1793620359610.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/39/tasks/1793621161604.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/39/tasks/1793621502459.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/39/tasks/1793621903677.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/39/tasks/1793623390265.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/39/tasks/1793625269565.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/39/tasks/1793626388737.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/39/tasks/1793626820522.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/39/tasks/1793627348502.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/39/tasks/1793627590185.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/39/tasks/1793628366252.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/39/tasks/1793629199998.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/39/tasks/1793631035345.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/57/CHANGELOG.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/57/IMPLEMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/57/PLAN.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/57/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/57/REQUIREMENTS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/57/TASKS.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/57/implements/1793395003714.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/57/tasks/1793395003713.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/issues/task/57/tasks/1793395058100.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/pyproject.toml +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/res/docker/rabbitmq/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/res/docker/rabbitmq/enabled_plugins +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/res/docker/rabbitmq/rabbitmq-3.yml +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/res/docker/rabbitmq/rabbitmq-4.yml +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/res/docker/redis/README.md +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/res/docker/redis/redis-6.yml +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/res/docker/redis/redis-7.yml +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/samples/Broker/RabbitMQ/Sample.RPC.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/samples/Broker/RabbitMQ/Sample.Stream.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/samples/Broker/RabbitMQ/Sample.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/samples/Broker/Redis/Sample.Stream.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/samples/Broker/Redis/Sample.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/samples/Broker/Sample.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/samples/Worker/RabbitMQ/Client.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/samples/Worker/RabbitMQ/Tasks.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/samples/Worker/RabbitMQ/Worker.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/samples/Worker/Redis/Sample.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/samples/Worker/Sample.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/setup.cfg +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/setup.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Broker/Configuration.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Broker/Connection.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Broker/Consumer.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Broker/Errors.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Broker/Event.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Broker/Implements/RabbitMQ/Configuration.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Broker/Implements/RabbitMQ/Connection.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Broker/Implements/RabbitMQ/Consumer.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Broker/Implements/RabbitMQ/Event.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Broker/Implements/RabbitMQ/Exchange.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Broker/Implements/RabbitMQ/Queue.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Broker/Implements/RabbitMQ/Serializer.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Broker/Implements/RabbitMQ/Stream.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Broker/Implements/RabbitMQ/Subscription.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Broker/Implements/RabbitMQ/__init__.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Broker/Implements/Redis/Configuration.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Broker/Implements/Redis/Connection.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Broker/Implements/Redis/Consumer.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Broker/Implements/Redis/Event.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Broker/Implements/Redis/Queue.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Broker/Implements/Redis/Serializer.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Broker/Implements/Redis/Subscription.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Broker/Implements/Redis/__init__.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Broker/Implements/__init__.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Broker/Priority.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Broker/Protocol.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Broker/__init__.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Descriptor/DataObject.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Descriptor/Types.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Descriptor/Value.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Descriptor/__init__.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Inspector/Extension.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Inspector/Extensions/Metrics.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Inspector/Extensions/Ping.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Inspector/Extensions/Play.html +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Inspector/Extensions/Play.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Inspector/Extensions/Specifications.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Inspector/Extensions/Status.html +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Inspector/Extensions/Status.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Inspector/Extensions/__init__.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Inspector/Inspector.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Inspector/Response.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Inspector/__init__.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Validator/Pattern.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Validator/Patterns/Array.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Validator/Patterns/Common.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Validator/Patterns/Compare.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Validator/Patterns/Condition.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Validator/Patterns/DataObject.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Validator/Patterns/DateTime.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Validator/Patterns/Number.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Validator/Patterns/Object.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Validator/Patterns/Size.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Validator/Patterns/String.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Validator/Patterns/Type.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Validator/Patterns/__init__.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Validator/Validate.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Validator/Validator.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Validator/__init__.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Worker/Executor.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Worker/Pool.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Worker/Run.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Worker/Specification.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Worker/Startup.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Worker/Worker.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/Worker/__init__.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/src/__init__.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/tests/__init__.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/tests/_support.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/tests/_support_inspector.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/tests/_support_inspector_play.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/tests/_support_task_messages.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/tests/rabbitmq/__init__.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/tests/rabbitmq/test_inspector.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/tests/rabbitmq/test_inspector_play.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/tests/rabbitmq/test_rabbitmq_broker_methods.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/tests/rabbitmq/test_rabbitmq_integration.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/tests/rabbitmq/test_rabbitmq_logging.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/tests/rabbitmq/test_rabbitmq_priorities.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/tests/rabbitmq/test_rabbitmq_rpc.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/tests/rabbitmq/test_rabbitmq_rpc_integration.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/tests/rabbitmq/test_rabbitmq_timeouts.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/tests/rabbitmq/test_rabbitmq_worker.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/tests/rabbitmq/test_specifications.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/tests/rabbitmq/test_task_messages.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/tests/rabbitmq/test_task_priorities.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/tests/redis/__init__.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/tests/redis/test_inspector.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/tests/redis/test_inspector_play.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/tests/redis/test_redis.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/tests/redis/test_redis_integration.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/tests/redis/test_redis_logging.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/tests/redis/test_task_messages.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/tests/redis/test_task_priorities.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/tests/test_broker_packaging.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/tests/test_descriptor.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/tests/test_inspector.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/tests/test_inspector_logging.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/tests/test_inspector_play.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/tests/test_lifecycle_hooks.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/tests/test_logging.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/tests/test_pool_callbacks.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/tests/test_process_signals.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/tests/test_protocol_contracts.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/tests/test_runner_hooks.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/tests/test_specifications.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/tests/test_status.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/tests/test_status_ui.cjs +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/tests/test_validator_patterns.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/tests/test_worker.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/tests/test_worker_recovery.py +0 -0
- {defstream_rabbitmq-0.1.24 → defstream_rabbitmq-0.1.25}/tests/test_worker_startup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: DefStream-RabbitMQ
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.25
|
|
4
4
|
Summary: Synchronous message processing with pluggable broker adapters
|
|
5
5
|
Home-page: https://github.com/yong5eon/DefStream
|
|
6
6
|
Author: Heo Yongseon
|
|
@@ -16,7 +16,7 @@ Classifier: Programming Language :: Python :: 3.14
|
|
|
16
16
|
Requires-Python: >=3.9
|
|
17
17
|
Description-Content-Type: text/markdown
|
|
18
18
|
License-File: LICENSE
|
|
19
|
-
Requires-Dist: DefStream==0.1.
|
|
19
|
+
Requires-Dist: DefStream==0.1.25
|
|
20
20
|
Requires-Dist: pika>=1.3.2
|
|
21
21
|
Dynamic: author
|
|
22
22
|
Dynamic: classifier
|
|
@@ -100,6 +100,18 @@ issues/feature/47/tasks/1793271384432.md
|
|
|
100
100
|
issues/feature/47/tasks/1793271506089.md
|
|
101
101
|
issues/feature/47/tasks/1793271819682.md
|
|
102
102
|
issues/feature/47/tasks/1793272077066.md
|
|
103
|
+
issues/feature/55/CHANGELOG.md
|
|
104
|
+
issues/feature/55/IMPLEMENTS.md
|
|
105
|
+
issues/feature/55/PLAN.md
|
|
106
|
+
issues/feature/55/README.md
|
|
107
|
+
issues/feature/55/REQUIREMENTS.md
|
|
108
|
+
issues/feature/55/TASKS.md
|
|
109
|
+
issues/feature/55/implements/1793714914193.md
|
|
110
|
+
issues/feature/55/implements/1793717149425.md
|
|
111
|
+
issues/feature/55/tasks/1793705387888.md
|
|
112
|
+
issues/feature/55/tasks/1793714914194.md
|
|
113
|
+
issues/feature/55/tasks/1793715537355.md
|
|
114
|
+
issues/feature/55/tasks/1793717149426.md
|
|
103
115
|
issues/feature/8/IMPLEMENTS.md
|
|
104
116
|
issues/feature/8/README.md
|
|
105
117
|
issues/feature/8/REQUIREMENTS.md
|
|
@@ -11,8 +11,8 @@ Task APIs, delivery policies, pools, and lifecycle hooks.
|
|
|
11
11
|
| Function | Purpose | Connection ownership |
|
|
12
12
|
| --- | --- | --- |
|
|
13
13
|
| `declare(task=..., broker=...)` | Declare task queues and subscription resources | Caller connects and closes |
|
|
14
|
-
| `emit(body, task=..., broker
|
|
15
|
-
| `request(body, task=..., broker=..., timeout=5)` | Request a task result synchronously | Caller connects and closes; RabbitMQ only |
|
|
14
|
+
| `emit(body, task=..., broker=..., retry=None, interval=1)` | Publish a one-way message to a task | Caller connects and closes |
|
|
15
|
+
| `request(body, task=..., broker=..., timeout=5, retry=None, interval=1)` | Request a task result synchronously | Caller connects and closes; RabbitMQ only |
|
|
16
16
|
|
|
17
17
|
Import these functions from `DefStream.Worker`. They do not connect or close
|
|
18
18
|
the supplied connection. Neither `emit()` nor `request()` declares destinations.
|
|
@@ -118,6 +118,43 @@ result = request(
|
|
|
118
118
|
- Priority affects delivery of waiting messages within the same queue. It does not
|
|
119
119
|
preempt delivered or running tasks or guarantee execution and completion order.
|
|
120
120
|
|
|
121
|
+
### Publication and request retries
|
|
122
|
+
|
|
123
|
+
`emit()` and `request()` can optionally retry a broker call that raises an exception.
|
|
124
|
+
The default `retry=None` preserves the existing single-call behavior. The value
|
|
125
|
+
counts additional attempts after the first call, so `retry=3` allows up to four
|
|
126
|
+
calls. The default `interval` is one second; it is applied only after a failure
|
|
127
|
+
when another attempt remains. `retry` must be `None` or a non-negative integer
|
|
128
|
+
other than `bool`, and `interval` must be a finite non-negative number other
|
|
129
|
+
than `bool`. To stay within the platform's supported wait range, `interval` is capped
|
|
130
|
+
at `threading.TIMEOUT_MAX` seconds. Out-of-range values raise `ValueError` before the broker call.
|
|
131
|
+
|
|
132
|
+
```python
|
|
133
|
+
emit(
|
|
134
|
+
{'a': 10, 'b': 20},
|
|
135
|
+
task=Add,
|
|
136
|
+
broker=broker,
|
|
137
|
+
retry=3,
|
|
138
|
+
interval=0.5,
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
# The request timeout applies to each call independently of the retry count.
|
|
142
|
+
result = request(
|
|
143
|
+
{'a': 10, 'b': 20},
|
|
144
|
+
task=Add,
|
|
145
|
+
broker=broker,
|
|
146
|
+
timeout=5,
|
|
147
|
+
retry=2,
|
|
148
|
+
)
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
A successful attempt returns immediately. If every attempt fails, the final exception
|
|
152
|
+
is re-raised. Exceptions raised by broker `emit()` and `request()` calls are retried,
|
|
153
|
+
including `RemoteError`; therefore a request may run again even if its remote task
|
|
154
|
+
already executed before returning an error. Retries do not prevent duplicate
|
|
155
|
+
publication or execution, so tasks using retries should be safe to run more than once.
|
|
156
|
+
Invalid inputs and unsupported broker operations are not retried.
|
|
157
|
+
|
|
121
158
|
### Success, failures, and retries
|
|
122
159
|
|
|
123
160
|
- ACK follows successful execution and completion hooks. RabbitMQ RPC also publishes the reply before ACK.
|
|
@@ -125,7 +162,7 @@ result = request(
|
|
|
125
162
|
- `Policy` is the shared broker contract. Import `Requeue` and `Reject` from the selected broker package; behavior can differ by broker.
|
|
126
163
|
- Rejection is broker-specific: RabbitMQ dead-letters to a configured DLQ or discards the message;
|
|
127
164
|
Redis acknowledges it for the group while preserving stream history.
|
|
128
|
-
-
|
|
165
|
+
- Consumer message redelivery has no automatic retry-count limit. Choose a policy that avoids endless redelivery of permanently invalid messages.
|
|
129
166
|
- Publication and ACK are not one transaction. **Make tasks idempotent and safe to execute more than once.**
|
|
130
167
|
|
|
131
168
|
The common resource operations below apply when accessing a broker directly.
|
|
@@ -11,8 +11,8 @@
|
|
|
11
11
|
| 함수 | 역할 | 연결 관리 |
|
|
12
12
|
| --- | --- | --- |
|
|
13
13
|
| `declare(task=..., broker=...)` | 작업의 큐·구독 리소스 선언 | 호출자가 연결·종료 |
|
|
14
|
-
| `emit(body, task=..., broker
|
|
15
|
-
| `request(body, task=..., broker=..., timeout=5)` | 작업 결과를 동기 RPC로 요청 | 호출자가 연결·종료; RabbitMQ만 지원 |
|
|
14
|
+
| `emit(body, task=..., broker=..., retry=None, interval=1)` | 작업 목적지로 단방향 메시지 발행 | 호출자가 연결·종료 |
|
|
15
|
+
| `request(body, task=..., broker=..., timeout=5, retry=None, interval=1)` | 작업 결과를 동기 RPC로 요청 | 호출자가 연결·종료; RabbitMQ만 지원 |
|
|
16
16
|
|
|
17
17
|
세 함수는 `DefStream.Worker`에서 가져옵니다. 전달된 연결을 자동으로 열거나 닫지 않으며,
|
|
18
18
|
`emit()`와 `request()`는 목적지를 자동 선언하지 않습니다.
|
|
@@ -116,6 +116,41 @@ result = request(
|
|
|
116
116
|
- 우선순위는 같은 큐의 대기 메시지 전달에 적용됩니다. 이미 전달·실행 중인
|
|
117
117
|
작업을 선점하거나 여러 작업의 실행·완료 순서를 보장하지 않습니다.
|
|
118
118
|
|
|
119
|
+
### 발행·요청 재시도
|
|
120
|
+
|
|
121
|
+
`emit()`과 `request()`는 브로커 호출이 예외로 실패하면 선택적으로 다시 시도할 수 있습니다.
|
|
122
|
+
기본 `retry=None`은 기존처럼 한 번만 호출합니다. 횟수는 최초 시도 이후의
|
|
123
|
+
추가 횟수이므로 `retry=3`은 최대 네 번 호출합니다. 실패 후 다음 시도가 남았을 때만
|
|
124
|
+
`interval`초를 기다리며 기본 간격은 1초입니다.
|
|
125
|
+
`retry`는 `None` 또는 bool이 아닌 0 이상의 정수이고, `interval`은 bool이 아닌
|
|
126
|
+
유한한 0 이상의 숫자여야 합니다. 플랫폼의 대기 시간 범위를 넘지 않도록 `interval`의 상한은
|
|
127
|
+
`threading.TIMEOUT_MAX`초로 제한합니다. 범위를 벗어난 값은 브로커 호출 전에 `ValueError`로 거부합니다.
|
|
128
|
+
|
|
129
|
+
```python
|
|
130
|
+
emit(
|
|
131
|
+
{'a': 10, 'b': 20},
|
|
132
|
+
task=Add,
|
|
133
|
+
broker=broker,
|
|
134
|
+
retry=3,
|
|
135
|
+
interval=0.5,
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
# 요청의 timeout은 재시도 횟수와 별도로 매 호출에 적용됩니다.
|
|
139
|
+
result = request(
|
|
140
|
+
{'a': 10, 'b': 20},
|
|
141
|
+
task=Add,
|
|
142
|
+
broker=broker,
|
|
143
|
+
timeout=5,
|
|
144
|
+
retry=2,
|
|
145
|
+
)
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
중간 호출이 성공하면 결과를 바로 반환하고, 모든 호출이 실패하면 마지막 예외를 그대로
|
|
149
|
+
전파합니다. `RemoteError`를 포함해 브로커의 발행·요청 호출에서 발생한 예외를 재시도하므로,
|
|
150
|
+
원격 작업이 이미 실행된 뒤 오류 응답을 받은 요청도 다시 실행될 수 있습니다. 중복 전송이나
|
|
151
|
+
작업 실행을 방지하지 않으므로 재시도가 필요한 작업은 중복 실행에 안전하도록 설계하세요.
|
|
152
|
+
잘못된 입력이나 브로커 기능 미지원 오류는 재시도하지 않습니다.
|
|
153
|
+
|
|
119
154
|
### 성공, 실패와 재시도
|
|
120
155
|
|
|
121
156
|
- 작업 실행과 완료 훅이 성공한 뒤 ACK합니다. RabbitMQ RPC는 응답 발행도 ACK보다 먼저 수행합니다.
|
|
@@ -124,7 +159,7 @@ result = request(
|
|
|
124
159
|
패키지에서 가져오며, 같은 이름의 정책도 동작은 브로커마다 다를 수 있습니다.
|
|
125
160
|
- `Reject()`의 실제 효과는 브로커에 따라 다릅니다. RabbitMQ는 설정된 DLQ로 보내거나 폐기하며,
|
|
126
161
|
Redis는 해당 그룹에서 ACK하고 스트림 이력은 유지합니다.
|
|
127
|
-
-
|
|
162
|
+
- 소비자 측 메시지 재전달 횟수에는 자동 제한이 없습니다. 영구적인 오류가 무한 재전달되지 않도록 정책을 선택하세요.
|
|
128
163
|
- 전송과 ACK는 하나의 트랜잭션이 아닙니다. **중복 실행에 안전한 멱등 작업**을 작성해야 합니다.
|
|
129
164
|
|
|
130
165
|
브로커 리소스를 직접 사용할 때의 공통 메서드는 다음과 같습니다.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# Worker 메시지 발행·요청 재시도
|
|
2
|
+
|
|
3
|
+
`emit()`과 `request()`에 `retry`와 `interval` 옵션을 추가했습니다. 기본 설정은 기존처럼 한 번만 호출하며, 재시도 횟수를 설정하면 실패한 브로커 호출을 지정 횟수까지 다시 시도합니다. `request()`의 `timeout`은 각 호출에 적용됩니다.
|
|
4
|
+
|
|
5
|
+
브로커 호출에서 발생한 `RemoteError`를 포함한 예외도 재시도 대상입니다. 원격 작업이 이미 실행된 뒤 오류 응답을 받은 요청도 다시 실행될 수 있으므로, 중복 요청이나 부작용에 안전한 작업에만 재시도를 설정하세요.
|
|
6
|
+
|
|
7
|
+
`interval`은 0 이상 `threading.TIMEOUT_MAX`초 이하로 제한합니다. 지나치게 큰 간격은 브로커 호출 전에 `ValueError`로 거부하여 대기 중 오버플로가 브로커 오류를 가리는 상황을 방지합니다.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Worker 메시지 발행·요청 재시도 구현
|
|
2
|
+
|
|
3
|
+
## 결과
|
|
4
|
+
|
|
5
|
+
[요구사항 명세](./REQUIREMENTS.md)에 따라 [Worker 메시지 함수](../../../src/Worker/Message.py)의 `emit()`과 `request()`에 `retry`와 `interval` 키워드 인자를 추가했습니다. 기본값은 각각 `None`과 1초입니다. `None` 또는 `0`은 한 번 호출하며, `N`은 최초 호출 후 최대 `N`번 추가 호출합니다.
|
|
6
|
+
|
|
7
|
+
입력 설정은 브로커 호출 전에 검증합니다. 재시도는 브로커의 `emit()`·`request()` 호출에만 적용하고, 실패 후 시도가 남은 때만 대기하며, 최종 예외를 그대로 전파합니다. `request()`의 `timeout`과 두 API의 기존 우선순위 전달을 재시도마다 유지합니다. 모든 `Exception`을 대상으로 하므로 `RemoteError`도 재시도되며, 중복 요청·작업 실행 방지는 제공하지 않습니다.
|
|
8
|
+
|
|
9
|
+
브로커 인터페이스나 구현체, 연결 생성·종료 동작은 변경하지 않았습니다.
|
|
10
|
+
|
|
11
|
+
PR 리뷰 후 `interval`을 `threading.TIMEOUT_MAX` 이하로 제한하고 범위 비교를 실수 변환보다 먼저 수행하도록 보완했습니다. 지나치게 큰 간격은 브로커 호출 전에 `ValueError`로 거부합니다. 경계값 테스트 2개를 추가하여 현재 메시지 API 테스트 15개가 통과했습니다.
|
|
12
|
+
|
|
13
|
+
초기 구현 후 공개 인자명을 `retry`와 `interval`로 변경했습니다. 현재 API와 문서에는 이전 이름을 남기지 않았습니다.
|
|
14
|
+
|
|
15
|
+
## 검증
|
|
16
|
+
|
|
17
|
+
- [메시지 API 회귀 테스트](../../../tests/test_task_messages.py): 15개 테스트 통과. 재시도 횟수·대기, 기본값·0회, 중간 성공, 최종 예외 객체 보존, `RemoteError`, priority·timeout, 입력 검증과 간격 경계값을 확인했습니다.
|
|
18
|
+
- Pylance 함수 시그니처 호환성 검사에서 `emit()`·`request()`의 기존 호출부가 각각 호환됨을 확인했습니다.
|
|
19
|
+
- Pylance 진단에서 오류가 없고, 변경한 Python 소스와 테스트의 syntax 검사도 통과했습니다.
|
|
20
|
+
- 한국어·영어 작업 매뉴얼과 고객용 [변경 로그](./CHANGELOG.md)를 갱신했습니다.
|
|
21
|
+
- 실제 RabbitMQ·Redis 연결 장애에 대한 통합 검증은 수행하지 않았습니다.
|
|
22
|
+
|
|
23
|
+
## 단계별 기록
|
|
24
|
+
|
|
25
|
+
- [Worker 재시도 구현](./implements/1793714914193.md)
|
|
26
|
+
- [재시도 간격 오버플로 사전 차단](./implements/1793717149425.md)
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# Worker 메시지 발행·요청 재시도 계획
|
|
2
|
+
|
|
3
|
+
작업 범위와 진행 상태는 [이슈 기록](./README.md), 목표 동작과 미확정 사항은 [요구사항 명세](./REQUIREMENTS.md)를 따릅니다. 구현과 대상 단위 테스트, 한국어·영어 작업 매뉴얼 갱신을 완료했습니다. 최종 검증 결과와 남은 제한은 [작업 종합](./TASKS.md) 및 [구현 종합](./IMPLEMENTS.md)에 반영했습니다.
|
|
4
|
+
|
|
5
|
+
## 수행 단계와 진행 상태
|
|
6
|
+
|
|
7
|
+
### 1. 공개 인자와 입력 계약 확정
|
|
8
|
+
|
|
9
|
+
상태: 완료
|
|
10
|
+
|
|
11
|
+
- `emit()`·`request()`의 키워드 전용 인자는 `retry`와 `interval`로 확정했습니다.
|
|
12
|
+
- 재시도 횟수는 `None` 또는 bool이 아닌 0 이상의 정수, 간격은 bool이 아닌 유한한 0 이상의 정수·실수로 제한하고, 브로커 호출 전에 검증합니다.
|
|
13
|
+
- 재시도 범위가 모든 브로커 호출 예외, `RemoteError` 포함이라는 결정을 유지합니다.
|
|
14
|
+
|
|
15
|
+
대응: R-01·R-04, AC-05·AC-07
|
|
16
|
+
|
|
17
|
+
### 2. Worker 계층 재시도 구현
|
|
18
|
+
|
|
19
|
+
상태: 완료 / 선행: 1단계
|
|
20
|
+
|
|
21
|
+
대상: [Message.py](../../../src/Worker/Message.py)
|
|
22
|
+
|
|
23
|
+
- 기존 입력·지원 기능 확인과 `priority_parameters()` 처리는 재시도 루프 바깥에 유지합니다.
|
|
24
|
+
- `emit()`과 `request()`의 실제 브로커 호출에 동일한 횟수·간격 정책을 적용합니다.
|
|
25
|
+
- 성공값을 그대로 반환하고, 실패 후 시도가 남아 있는 때만 대기하며, 최종 예외를 변환하지 않고 다시 발생시킵니다.
|
|
26
|
+
- 기존 `request(timeout=...)` 및 우선순위 호출 경로의 전달값을 유지합니다.
|
|
27
|
+
- 브로커 Protocol·구현체와 연결 소유권은 변경하지 않습니다.
|
|
28
|
+
|
|
29
|
+
대응: R-02~R-08, AC-01~AC-07
|
|
30
|
+
|
|
31
|
+
### 3. 단위 회귀 테스트
|
|
32
|
+
|
|
33
|
+
상태: 완료 / 선행: 2단계
|
|
34
|
+
|
|
35
|
+
대상: [test_task_messages.py](../../../tests/test_task_messages.py)
|
|
36
|
+
|
|
37
|
+
- Mock 브로커의 성공·실패 순서를 제어해 최초 성공, 중간 성공, 최대 횟수 실패, 마지막 예외 객체 보존을 검증합니다.
|
|
38
|
+
- `sleep` 등 실제 시간 대기는 Mock 처리하고, 기본·사용자 지정 간격 및 대기 횟수를 확인합니다.
|
|
39
|
+
- `emit()`·`request()` 각각에서 `priority`와 `timeout`이 모든 호출에 유지되는지 확인합니다.
|
|
40
|
+
- 기존 입력·기능 지원 검증이 브로커 호출 전에 실패하고 재시도하지 않는지 확인합니다.
|
|
41
|
+
|
|
42
|
+
대응: AC-01~AC-08
|
|
43
|
+
|
|
44
|
+
### 4. 매뉴얼과 고객용 변경 로그 갱신
|
|
45
|
+
|
|
46
|
+
상태: 완료 / 선행: 2·3단계
|
|
47
|
+
|
|
48
|
+
- [한국어 작업 매뉴얼](../../../docs/Tasks.md)과 [영어 작업 매뉴얼](../../../docs/Tasks.en.md)에 API 옵션·사용 예·기본값·시도 횟수 의미를 함께 반영합니다.
|
|
49
|
+
- 호출 재시도와 소비자 메시지 재전달을 구분하고, `RemoteError` 포함 재시도가 중복 요청·작업 실행을 일으킬 수 있음을 설명합니다.
|
|
50
|
+
- 구현 결과를 기준으로 이슈별 [변경 로그](./CHANGELOG.md)를 작성했습니다.
|
|
51
|
+
|
|
52
|
+
대응: R-09, AC-09
|
|
53
|
+
|
|
54
|
+
### 5. 검증 및 완료 확인
|
|
55
|
+
|
|
56
|
+
상태: 완료 / 선행: 2~4단계
|
|
57
|
+
|
|
58
|
+
- 저장소의 focused unittest 명령으로 메시지 API 회귀 테스트를 실행했습니다.
|
|
59
|
+
- 변경된 문서와 인수 기준의 일치, 한국어·영어 매뉴얼 간 내용 일치, 새 예제의 실제 공개 API 적합성을 확인했습니다.
|
|
60
|
+
- 실제 브로커 장애·전송 후 중복 처리 동작은 검증하지 않았으며, 테스트 결과로 주장하지 않고 제한사항으로 남겼습니다.
|
|
61
|
+
- 실제 수행 결과를 작업 기록 및 `TASKS.md`에 반영하고, 구현 종합과 단계별 기록을 작성했습니다.
|
|
62
|
+
|
|
63
|
+
## 검증 계획
|
|
64
|
+
|
|
65
|
+
| 범위 | 방법 | 결과 |
|
|
66
|
+
| --- | --- | --- |
|
|
67
|
+
| Worker 메시지 API 회귀 | `tests.test_task_messages` 단위 테스트 | PR 리뷰 경계값 보완 후 15개 테스트 통과 |
|
|
68
|
+
| 재시도 횟수·대기 | Mock 브로커와 Mock 대기 함수로 호출 수·대기 인자·횟수 확인 | 기본·0회, 최대 3회 추가 재시도, 중간 성공 및 대기 횟수 검증 통과 |
|
|
69
|
+
| 기존 전달 계약 | Mock 호출 인자로 본문·작업 설정·priority·timeout 확인 | `emit()`·`request()` 재시도 호출에서 전달 유지 확인 |
|
|
70
|
+
| 공개 시그니처·정적 검사 | Pylance 호출 호환성·진단·syntax 검사 | 기존 호출부 호환, 진단·syntax 오류 없음 |
|
|
71
|
+
| 문서 계약 | `Tasks.md`·`Tasks.en.md`의 API 설명·예·중복 처리 주의사항 대조 | 한영 매뉴얼 및 이슈별 변경 로그 갱신 |
|
|
72
|
+
|
|
73
|
+
## 계획의 한계
|
|
74
|
+
|
|
75
|
+
- 모든 브로커 호출 예외를 재시도하므로 일시적인 전송 오류뿐 아니라 `RemoteError`와 같은 영구적 원격 작업 오류도 반복할 수 있습니다. 이 범위는 사용자 결정이며, 중복 방지는 별도 범위입니다.
|
|
76
|
+
- 실제 브로커 통합 검증은 단위 테스트와 별개입니다. 구현 시 로컬 브로커 환경이 준비되지 않았다면 실행하지 않은 사실을 기록합니다.
|
|
77
|
+
- 전체 검증 결과와 실행 환경 제약은 [작업 종합](./TASKS.md)을 기준으로 갱신합니다.
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# Worker emit·request에 최대 재시도 횟수와 대기 간격 옵션 추가
|
|
2
|
+
|
|
3
|
+
## 이슈와 작업 상태
|
|
4
|
+
|
|
5
|
+
- 원본: GitHub Issues [#55](https://github.com/yong5eon/DefStream/issues/55)
|
|
6
|
+
- 제목: Worker emit·request에 최대 재시도 횟수와 대기 간격 옵션 추가
|
|
7
|
+
- 상태: Open
|
|
8
|
+
- 유형·레이블: 기능 (`feature`), 원본 이슈에 적용됨
|
|
9
|
+
- 작업 대상: `yong5eon/DefStream`, 작업 브랜치 `feature/55`
|
|
10
|
+
- 분기 기준: 깨끗한 로컬 `master`의 `3ce6044`
|
|
11
|
+
- 병합 대상: 미지정
|
|
12
|
+
- 로컬 진행 상태: 구현·focused 테스트·한영 매뉴얼 갱신 완료, 실제 브로커 통합 검증 미실행
|
|
13
|
+
- 댓글: 없음
|
|
14
|
+
|
|
15
|
+
## 작업 문서
|
|
16
|
+
|
|
17
|
+
- [요구사항 명세](./REQUIREMENTS.md)
|
|
18
|
+
- [작업 계획](./PLAN.md)
|
|
19
|
+
- [구현 종합](./IMPLEMENTS.md)
|
|
20
|
+
- [작업 종합](./TASKS.md)
|
|
21
|
+
- [변경 로그](./CHANGELOG.md)
|
|
22
|
+
- [최신 구현 기록](./implements/1793717149425.md)
|
|
23
|
+
- [최신 작업 기록](./tasks/1793717149426.md)
|
|
24
|
+
|
|
25
|
+
## 이슈 원문
|
|
26
|
+
|
|
27
|
+
## 해결하려는 문제
|
|
28
|
+
|
|
29
|
+
Worker에서 제공하는 `emit`과 `request`는 현재 브로커 호출이 실패하면 즉시 예외를 전파한다. 일시적인 실패에 대응하려면 호출자가 각 호출부에서 재시도 로직을 직접 작성해야 한다.
|
|
30
|
+
|
|
31
|
+
## 제안하는 해결 방법
|
|
32
|
+
|
|
33
|
+
`src/Worker/Message.py`의 `emit`과 `request`에 재시도 횟수와 시도 간 대기 간격을 지정하는 선택 인자를 추가한다. 브로커 구현체가 아닌 Worker 함수 계층에서 처리한다.
|
|
34
|
+
|
|
35
|
+
### 옵션과 기본값
|
|
36
|
+
|
|
37
|
+
| 옵션 | 기본값 | 의미 |
|
|
38
|
+
| --- | --- | --- |
|
|
39
|
+
| 최대 재시도 횟수 | `None` | 최초 호출을 제외하고 추가로 시도할 최대 횟수 |
|
|
40
|
+
| 재시도 간격 | `1`초 | 실패 후 다음 시도 전 대기 시간 |
|
|
41
|
+
|
|
42
|
+
인자명은 구현 시 기존 API 명명 관례에 맞춰 확정한다.
|
|
43
|
+
|
|
44
|
+
### 동작
|
|
45
|
+
|
|
46
|
+
- 재시도 횟수가 `None`이면 기존과 동일하게 한 번만 호출하고, 실패 시 대기 없이 해당 예외를 즉시 전파한다.
|
|
47
|
+
- 재시도 횟수가 `0`이면 추가 시도 없이 최초 호출 결과만 반환하거나 예외를 전파한다.
|
|
48
|
+
- 재시도 횟수가 `N`이면 최초 호출 이후 최대 `N`번 추가로 시도한다. 예를 들어 `3`이면 최초 호출을 포함하여 최대 `4`번 호출한다.
|
|
49
|
+
- 최초 호출은 즉시 실행하며, 실패 후 다음 시도가 남아 있을 때만 지정한 간격만큼 대기한다.
|
|
50
|
+
- 도중에 성공하면 기존 반환값을 즉시 반환하고 추가로 시도하지 않는다.
|
|
51
|
+
- 모든 시도가 실패하면 마지막 시도에서 발생한 예외를 다른 예외로 감싸거나 대체하지 않고 그대로 `raise`한다. 마지막 실패 뒤에는 대기하지 않는다.
|
|
52
|
+
- `emit`과 `request`에 동일한 재시도 정책을 적용한다. 기존 인자와 브로커 호출의 반환값·예외 계약은 유지한다.
|
|
53
|
+
- `request`의 기존 `timeout`은 각 브로커 요청 호출에 그대로 전달한다. 전체 재시도 과정의 총 제한 시간으로 바꾸지 않는다.
|
|
54
|
+
|
|
55
|
+
### 구현 범위
|
|
56
|
+
|
|
57
|
+
- Worker의 `emit`·`request`에서 브로커 호출 실패에 대한 재시도를 제공한다.
|
|
58
|
+
- 브로커 구현체 및 브로커 인터페이스에 재시도 옵션이나 내부 재시도 기능을 추가하지 않는다.
|
|
59
|
+
- Worker의 기존 입력 검증과 지원 기능 확인은 유지하고, 이를 브로커 호출 재시도 대상으로 확대하지 않는다.
|
|
60
|
+
- 재시도 미설정 시 기존 동작을 유지한다.
|
|
61
|
+
|
|
62
|
+
## 고려한 대안
|
|
63
|
+
|
|
64
|
+
- 브로커별 구현체에 재시도를 구현하는 대신, 호출자가 사용하는 Worker 함수 계층에서 공통으로 제공한다.
|
|
65
|
+
|
|
66
|
+
## 인수 기준
|
|
67
|
+
|
|
68
|
+
- [ ] `emit`과 `request` 모두 최대 재시도 횟수와 대기 간격을 지정할 수 있으며, 기본값은 각각 `None`과 `1`초이다.
|
|
69
|
+
- [ ] `None` 또는 `0`이면 한 번만 호출하고 실패 예외를 즉시 전파한다.
|
|
70
|
+
- [ ] 재시도 횟수 `3`에서 계속 실패하면 총 `4`회 호출하고 대기는 `3`회만 수행한다.
|
|
71
|
+
- [ ] 도중에 성공하면 반환값을 그대로 반환하며 남은 시도와 대기를 수행하지 않는다.
|
|
72
|
+
- [ ] 지정한 간격과 기본 간격이 실제 재시도 대기에 적용된다.
|
|
73
|
+
- [ ] 최종 실패 시 마지막 예외 객체와 타입을 그대로 전파하며, 별도 예외로 변환하지 않는다.
|
|
74
|
+
- [ ] 기존 `priority` 전달과 `request`의 `timeout` 전달을 유지한다.
|
|
75
|
+
- [ ] 브로커 구현체에 재시도 기능을 추가하지 않고 두 Worker 함수에서 검증한다.
|
|
76
|
+
|
|
77
|
+
## 추가 정보
|
|
78
|
+
|
|
79
|
+
기존 동작을 바꾸는 것이 아니라 선택적으로 사용할 수 있는 공개 기능을 추가하므로 `feature`로 분류한다.
|
|
80
|
+
|
|
81
|
+
재시도는 중복 전송이나 중복 실행 방지를 보장하지 않는다. 전송 이후 응답 대기 중 실패하는 등의 경우에는 이미 처리된 요청이 다시 전송될 수 있음을 사용 문서에 안내한다. 이 이슈에서 별도의 중복 방지 기능은 추가하지 않는다.
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# Worker 메시지 발행·요청 재시도 요구사항
|
|
2
|
+
|
|
3
|
+
## 목적
|
|
4
|
+
|
|
5
|
+
Worker의 `emit()`과 `request()`에 선택적 재시도를 추가하여 브로커 호출 실패를 설정된 횟수까지 다시 시도합니다. 이슈 원문과 작업 브랜치 정보는 [이슈 기록](./README.md)을 기준으로 합니다. 이 문서는 요청 내용과 현재 구현을 대조한 분석 및 목표 동작을 정의하며, 구현·검증 결과는 아직 포함하지 않습니다.
|
|
6
|
+
|
|
7
|
+
## 분석과 근거
|
|
8
|
+
|
|
9
|
+
### 이슈에서 요청한 결과
|
|
10
|
+
|
|
11
|
+
- `emit()`과 `request()`에서 최대 재시도 횟수와 시도 간 대기 시간을 선택적으로 지정합니다.
|
|
12
|
+
- 기본 최대 재시도 횟수는 `None`으로, 재시도하지 않고 기존처럼 한 번만 호출합니다. 기본 대기 간격은 1초입니다.
|
|
13
|
+
- 재시도 횟수는 최초 호출 이후의 추가 시도 횟수입니다. 실패 후 다음 시도가 있을 때만 대기하고, 성공하면 즉시 반환하며, 마지막 실패 뒤에는 대기하지 않습니다.
|
|
14
|
+
- 모든 시도가 실패하면 마지막 호출에서 난 예외를 그대로 전파합니다.
|
|
15
|
+
- 기존 `request()`의 `timeout`, `priority` 전달과 Worker 계층에서 재시도를 제공한다는 범위를 유지합니다.
|
|
16
|
+
|
|
17
|
+
### 현재 코드와 요구사항의 차이
|
|
18
|
+
|
|
19
|
+
- [Worker 메시지 함수](../../../src/Worker/Message.py)의 `emit()`은 작업·본문·브로커 기능·우선순위를 확인한 뒤 `broker.emit()`을 한 번 호출합니다. `request()`도 같은 순서로 입력을 확인한 뒤 `broker.request()`를 한 번 호출하고, 매번 기존 `timeout`을 전달합니다.
|
|
20
|
+
- 입력 검증과 지원 기능 확인은 브로커 호출보다 앞서 수행됩니다. 재시도는 브로커 메서드 호출에만 적용하고, 이 검증을 반복하거나 `NotImplementedError`를 재시도 대상으로 만들 필요는 없습니다.
|
|
21
|
+
- 공통 [브로커 연결 계약](../../../src/Broker/Connection.py)은 발행·요청 지원 여부를 Protocol로 표현하지만, 재시도 가능한 예외를 공통 분류하는 계약은 없습니다. 이슈의 요청대로 재시도 동작은 Worker API 계층에 둡니다.
|
|
22
|
+
- `request()`를 지원하지 않는 연결은 `Requestable` 검사에서 브로커 I/O 전에 거부됩니다. Redis 연결은 현재 `Requestable`을 구현하지 않습니다.
|
|
23
|
+
- RabbitMQ의 [RPC 응답 처리](../../../src/Broker/Implements/RabbitMQ/Queue.py)는 원격 작업 오류 응답을 `RemoteError`로 던집니다. 사용자는 재시도 범위에 브로커 호출에서 발생하는 모든 예외를 포함하도록 확정했습니다. 따라서 `RemoteError`도 재시도되며, 실패한 원격 작업이 다시 실행될 수 있습니다.
|
|
24
|
+
- 기존 [작업 메시지 테스트](../../../tests/test_task_messages.py)는 Mock 브로커로 Worker 함수의 호출 횟수·인자·오류 전파를 검증할 수 있습니다. 실제 브로커에 의존하지 않고 재시도 횟수와 대기를 검증할 수 있습니다.
|
|
25
|
+
- [작업 매뉴얼](../../../docs/Tasks.md)과 영어판은 현재 소비 메시지의 오류 정책·재전달을 설명합니다. 새 API 재시도와 소비자 재전달이 서로 다른 동작임을 구분하여 두 문서를 함께 갱신해야 합니다.
|
|
26
|
+
|
|
27
|
+
## 확정 요구사항
|
|
28
|
+
|
|
29
|
+
| ID | 요구사항 |
|
|
30
|
+
| --- | --- |
|
|
31
|
+
| R-01 | `emit()`과 `request()`에 `retry`와 `interval` 키워드 인자를 제공해야 합니다. 기본값은 각각 `None`과 1초입니다. |
|
|
32
|
+
| R-02 | `None` 또는 `0`회 재시도는 최초 호출만 수행합니다. `N`회 재시도는 최초 호출 후 최대 `N`회 추가 호출까지 허용합니다. |
|
|
33
|
+
| R-03 | 최초 호출은 대기 없이 수행합니다. 실패 후 재시도가 남은 경우에만 지정 간격을 기다립니다. 성공하면 즉시 반환하고, 마지막 실패 후에는 대기하지 않습니다. |
|
|
34
|
+
| R-04 | 브로커의 `emit()` 또는 `request()` 호출이 예외를 던지면 재시도 정책을 적용합니다. 사용자가 확정한 범위에는 `RemoteError`를 포함한 브로커 호출의 모든 일반 예외가 포함됩니다. 입력·작업 검증 및 기능 지원 확인 단계에서 발생하는 오류는 재시도하지 않습니다. |
|
|
35
|
+
| R-05 | 어느 시도에서든 성공하면 해당 호출의 기존 반환값을 그대로 반환합니다. 모든 시도가 실패하면 마지막 시도의 예외 객체와 타입을 바꾸지 않고 전파합니다. |
|
|
36
|
+
| R-06 | `request()`의 기존 `timeout`은 각 재시도 호출에 동일하게 전달합니다. 재시도 전체 시간에 대한 별도 총 timeout은 추가하지 않습니다. 기존 `priority`, 본문과 작업 매개변수 전달도 유지합니다. |
|
|
37
|
+
| R-07 | 재시도는 `DefStream.Worker`의 `emit()`·`request()`에만 적용합니다. 브로커 Protocol·구현체에는 재시도 설정이나 중복 재시도를 추가하지 않습니다. |
|
|
38
|
+
| R-08 | 기존 동작을 유지하면서 재시도가 기본 비활성화된 선택 기능으로 동작해야 합니다. 입력 검증·브로커 소유권·연결 수명주기 계약은 바꾸지 않습니다. |
|
|
39
|
+
| R-09 | 문서에서 `emit()`/`request()` 호출 재시도와 소비 중 메시지 오류·재전달 정책을 구분하고, 이미 처리된 발행·요청이 다시 전송될 수 있음을 안내합니다. |
|
|
40
|
+
|
|
41
|
+
## 구체화한 구현 계약
|
|
42
|
+
|
|
43
|
+
- `retry`는 `None` 또는 `bool`이 아닌 0 이상의 정수입니다. 다른 타입은 `TypeError`, 음수는 `ValueError`로 거부합니다.
|
|
44
|
+
- `interval`은 `bool`이 아닌 유한한 0 이상 `threading.TIMEOUT_MAX` 이하의 정수 또는 실수입니다. 타입이 맞지 않으면 `TypeError`, 범위 밖 값이나 비유한 값은 `ValueError`로 거부합니다. 큰 정수의 실수 변환 오버플로를 피하도록 범위를 먼저 확인하며, 두 인자의 유효성은 브로커 메서드 호출 전에 검사합니다.
|
|
45
|
+
- `RemoteError`까지 재시도하면 원격 작업 오류 응답을 받은 경우에도 해당 요청을 다시 실행할 수 있습니다. 이 동작은 사용자가 선택한 예외 범위에 따른 의도된 결과이며, 멱등성이나 중복 방지는 이 요구사항에 포함되지 않습니다.
|
|
46
|
+
|
|
47
|
+
## 인수 기준
|
|
48
|
+
|
|
49
|
+
아래 기준은 구현 완료 후 확인했으며, 검증 범위와 미실행 항목은 [작업 종합](./TASKS.md)에 기록합니다.
|
|
50
|
+
|
|
51
|
+
| ID | 검증 기준 |
|
|
52
|
+
| --- | --- |
|
|
53
|
+
| AC-01 | 기본값에서는 `emit()`과 `request()`가 한 번만 호출되고 재시도 대기가 없습니다. |
|
|
54
|
+
| AC-02 | 재시도 횟수 `0`은 한 번, `N`은 최대 `N + 1`번 호출합니다. |
|
|
55
|
+
| AC-03 | 계속 실패하는 `N`회 재시도는 `N`회 대기만 수행하며, 마지막 실패 후에는 대기하지 않습니다. |
|
|
56
|
+
| AC-04 | 중간 시도에서 성공하면 반환값을 보존하고 후속 호출·대기를 하지 않습니다. |
|
|
57
|
+
| AC-05 | 계속 실패하면 마지막 예외 객체를 그대로 전파합니다. `RemoteError`도 지정 횟수까지 재시도합니다. |
|
|
58
|
+
| AC-06 | 두 함수의 재시도에서 `priority`·요청 `timeout`·본문·작업 매개변수 전달이 기존 계약과 일치합니다. |
|
|
59
|
+
| AC-07 | 작업·본문·브로커 기능 검증 실패는 브로커 메서드를 호출하지 않고 재시도도 하지 않습니다. |
|
|
60
|
+
| AC-08 | 단위 테스트에서 실제 대기 없이 기본·사용자 지정 간격과 정확한 대기 횟수를 검증합니다. |
|
|
61
|
+
| AC-09 | 한국어·영어 작업 매뉴얼에 공개 API, 사용 예, 기본 동작 및 중복 실행 주의사항을 일관되게 반영합니다. |
|
|
62
|
+
|
|
63
|
+
## 범위 제외
|
|
64
|
+
|
|
65
|
+
- 브로커별 재시도, 오류 종류별 backoff·jitter, 재시도 전체 deadline, 자동 연결 재생성은 추가하지 않습니다.
|
|
66
|
+
- 멱등 키, 중복 요청 제거, exactly-once 처리 또는 중복 실행 방지는 보장하지 않습니다.
|
|
67
|
+
- 소비자 측 ACK·NACK·메시지 재전달 정책은 변경하지 않습니다.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# 작업 종합
|
|
2
|
+
|
|
3
|
+
## 결과
|
|
4
|
+
|
|
5
|
+
이슈 #55의 요구를 현재 Worker API, Broker Protocol, 메시지 테스트와 작업 매뉴얼에 대조해 분석했다. `emit()`·`request()` 호출에만 재시도를 적용하고 입력 검증·지원 기능 확인은 재시도 바깥에 두었다. 구현 내용과 변경 파일은 [구현 종합](./IMPLEMENTS.md)에 정리했다.
|
|
6
|
+
|
|
7
|
+
사용자 선택에 따라 브로커 호출에서 발생하는 모든 예외를 재시도하며 `RemoteError`도 포함한다. 따라서 재시도 도중 동일 작업이나 요청이 반복될 수 있다는 제한과 문서 반영 필요성을 명시했다.
|
|
8
|
+
|
|
9
|
+
## 단계별 기록
|
|
10
|
+
|
|
11
|
+
- [이슈 #55 분석 및 검증 계획 작성](./tasks/1793705387888.md)
|
|
12
|
+
- [Worker 재시도 구현 검증 및 문서 갱신](./tasks/1793714914194.md)
|
|
13
|
+
- [재시도 API 인자 이름 변경](./tasks/1793715537355.md)
|
|
14
|
+
- [PR 리뷰 경계값 회귀 검증](./tasks/1793717149426.md)
|
|
15
|
+
|
|
16
|
+
## 검증 결과와 제한사항
|
|
17
|
+
|
|
18
|
+
- PR 리뷰 보완 후 15개 테스트가 통과했다. 큰 간격의 사전 거부와 허용 경계를 검증했으며, 수정 전 회귀 테스트 실패도 확인했다.
|
|
19
|
+
- `tests.test_task_messages` focused suite의 13개 테스트가 통과했다. 기본 Python 명령은 editable `.pth`의 Windows symlink 권한 문제로 import에 실패했으나, workspace Python과 임시 unittest runner로 동일한 suite를 통과시켰다.
|
|
20
|
+
- Pylance 함수 시그니처 호환성 검사를 통과했고, `Message.py`에 진단이 없으며 변경 Python 파일의 syntax 오류가 없다.
|
|
21
|
+
- 한국어·영어 작업 매뉴얼과 고객용 변경 로그를 갱신했다.
|
|
22
|
+
- 실제 RabbitMQ·Redis 브로커 장애·전송 결과의 통합 검증은 수행하지 않았다. `RemoteError`도 재시도하므로 원격 작업이 이미 처리된 경우 중복 실행 가능성이 남는다.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# Worker 메시지 발행·요청 재시도 구현
|
|
2
|
+
|
|
3
|
+
[Worker 메시지 함수](../../../../src/Worker/Message.py)의 `emit()`·`request()`에 키워드 인자 `retry`와 `interval`을 추가했다. 기본값은 각각 `None`과 1초이며, 재시도 횟수는 최초 호출 이후의 추가 시도 수로 해석한다. 횟수는 `None` 또는 bool이 아닌 0 이상의 정수, 간격은 bool이 아닌 유한한 0 이상의 숫자만 허용하고 브로커 메서드 호출 전에 검증한다.
|
|
4
|
+
|
|
5
|
+
공통 내부 호출 경로는 브로커의 실제 `emit()` 또는 `request()` 예외만 재시도한다. 입력·작업·지원 기능 검증은 반복하지 않는다. 다음 시도가 남은 실패에만 `sleep()`을 적용하고, 성공값과 최종 예외 객체를 그대로 반환·전파한다. `request()`의 `timeout` 및 우선순위 인자는 각 시도에 유지된다. 사용자 결정대로 `RemoteError`를 포함한 일반 예외를 모두 재시도하므로 요청·작업이 중복될 수 있다.
|
|
6
|
+
|
|
7
|
+
[메시지 API 테스트](../../../../tests/test_task_messages.py)에 Mock 브로커와 Mock 대기를 사용하는 검증을 추가했다. `emit()`과 `request()`의 13개 focused 테스트가 통과했으며, 실제 브로커 연결 검증은 수행하지 않았다. API 사용법과 중복 실행 주의사항은 한국어·영어 [작업 매뉴얼](../../../../docs/Tasks.md), [영문 작업 매뉴얼](../../../../docs/Tasks.en.md)과 [변경 로그](../CHANGELOG.md)에 반영했다.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# 재시도 간격 오버플로 사전 차단
|
|
2
|
+
|
|
3
|
+
[PR #61 리뷰](https://github.com/yong5eon/DefStream/pull/61#discussion_r4456061735)와 [대기 오버플로 지적](https://github.com/yong5eon/DefStream/pull/61#discussion_r4456061789)에 따라 [Message.py](../../../../src/Worker/Message.py)의 간격 검증만 보완했다.
|
|
4
|
+
|
|
5
|
+
`interval`은 플랫폼별 `threading.TIMEOUT_MAX`초 이하로 제한한다. `isfinite()`보다 먼저 범위를 비교하여 `10**400` 같은 정수의 실수 변환 오버플로도 피한다. 범위 밖 값은 브로커 호출 전에 `ValueError`로 거부하며, 재시도 루프·공개 시그니처·기본값은 유지한다.
|
|
6
|
+
|
|
7
|
+
한국어·영어 매뉴얼과 요구사항·변경 로그에 상한을 반영했다. 이슈 원문과 기존 단계별 기록은 변경하지 않았다. 검증 결과는 [작업 기록](../tasks/1793717149426.md)에 정리했다.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# 이슈 #55 분석 및 검증 계획 작성
|
|
2
|
+
|
|
3
|
+
이슈 원문을 [Worker 메시지 함수](../../../../src/Worker/Message.py), 브로커 호출 계약, 기존 메시지 테스트와 한국어·영어 작업 매뉴얼에 대조했다. `emit()`과 `request()`는 현재 검증 후 각 브로커 메서드를 한 번 호출하며, `request()`의 `timeout`·priority 전달은 호출 경로에 유지되어야 한다.
|
|
4
|
+
|
|
5
|
+
사용자 결정에 따라 브로커 호출에서 발생하는 모든 예외를 재시도 범위에 포함하고 `RemoteError`도 제외하지 않는다. 이에 따라 원격 작업이 이미 실행된 뒤 오류 응답을 받은 경우에도 요청이 반복될 수 있음을 요구사항과 향후 매뉴얼 안내 사항으로 기록했다.
|
|
6
|
+
|
|
7
|
+
`REQUIREMENTS.md`에 현재 동작·요구사항·인수 기준과 구현 전 구체화할 인자 검증 사항을 정리하고, `PLAN.md`에 구현·단위 테스트·한영 매뉴얼·검증 순서를 작성했다. 구현, 테스트 및 매뉴얼 갱신은 아직 수행하지 않았다.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Worker 재시도 구현 검증 및 문서 갱신
|
|
2
|
+
|
|
3
|
+
저장소의 `tests.test_task_messages` focused suite를 실행해 13개 테스트가 통과함을 확인했다. 기본 `python -m unittest tests.test_task_messages -v` 실행은 전역 Python의 editable `.pth`가 Windows symlink 권한 문제로 패키지 경로를 구성하지 못해 import 단계에서 실패했다. workspace 가상 환경의 Python에서 임시 unittest runner를 사용하고 `DefStream.__path__`에 `src`를 앞에 추가해 같은 테스트를 실행했으며 통과했다.
|
|
4
|
+
|
|
5
|
+
Pylance `checkSignatureCompatibility`에서 `emit()`과 `request()`의 기존 호출부가 각각 호환됨을 확인했다. `Message.py`의 Pylance diagnostics는 비어 있고, 변경된 Python 소스와 테스트 모두 syntax 오류가 없다.
|
|
6
|
+
|
|
7
|
+
한국어·영어 `Tasks` 매뉴얼에 공개 인자, 기본값, 추가 시도 횟수, timeout 전달 및 `RemoteError`로 인한 중복 실행 가능성을 추가했다. 실제 RabbitMQ·Redis 통합 장애 테스트는 수행하지 않았다.
|
|
8
|
+
|
|
9
|
+
상세 작업 매뉴얼에 API와 사용 주의사항을 반영했으므로 프로젝트 소개와 빠른 시작을 담당하는 루트 README는 변경하지 않았다.
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
# 재시도 API 인자 이름 변경
|
|
2
|
+
|
|
3
|
+
사용자 요청에 따라 공개 API 인자명을 `max_retries`에서 `retry`로, `retry_interval`에서 `interval`로 변경했다. `emit()`·`request()` 구현, 단위 테스트, 한국어·영어 작업 매뉴얼, 요구사항·계획·구현 요약과 고객용 변경 로그를 새 이름에 맞췄다. 재시도 횟수와 기본값·입력 검증 동작은 변경하지 않았다.
|
|
4
|
+
|
|
5
|
+
`tests.test_task_messages` focused suite를 다시 실행해 13개 테스트가 통과함을 확인했다. Pylance에서 두 공개 함수의 호출부 호환성을 확인했고 `Message.py` 진단은 없으며 syntax 검사도 통과했다. 저장소에서 기존 인자명 문자열을 검색했을 때 일치 항목은 없었다.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# PR 리뷰 경계값 회귀 검증
|
|
2
|
+
|
|
3
|
+
수정 전 `tests.test_task_messages.MessageTests.test_interval_above_timeout_max_is_rejected_before_broker_calls`를 실행하여 두 API에서 `10**400`은 `OverflowError`, `1e100`과 `TIMEOUT_MAX + 1`은 사전 거부 누락으로 실패하는 것을 확인했다.
|
|
4
|
+
|
|
5
|
+
수정 후 workspace Python에서 `DefStream.__path__`의 첫 경로를 `src`로 지정한 기존 unittest 실행 방식으로 `tests.test_task_messages`를 실행했다. 15개 테스트가 통과했다. 두 API에서 범위 밖 값은 브로커 호출·대기 없이 거부되고, 0과 `TIMEOUT_MAX` 경계는 허용되어 Mock 대기에 그대로 전달됨을 확인했다. 실제 장시간 대기는 수행하지 않았다.
|
|
6
|
+
|
|
7
|
+
Pylance의 `Message.py` 진단은 없고, 변경 테스트의 syntax 검사도 통과했다. 실제 브로커 통합 테스트는 실행하지 않았다.
|
|
8
|
+
|
|
9
|
+
[앞선 인자명 변경 기록](./1793715537355.md)의 “기존 인자명 검색 결과 없음”은 당시 코드·현행 매뉴얼 대상 결과로 한정해 읽어야 한다. 변경 전 이름을 보존한 기록 자체까지 포함한 저장소 전체 결과를 뜻하지 않는다.
|