fix: raise a clear RuntimeError when inject runs without setup_di - #22
Merged
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
An
@inject-decorated arq task that runs on a worker wheresetup_di(worker_settings, container)was never called dies inside the wrapper with:That is a private key name pointing at nothing; it says neither what is missing nor how to fix it.
Change
inject's wrapper now reads the per-job child through a private_fetch_child_container(ctx)helper that catches theKeyErrorand raises a plainRuntimeErrorwithfrom None:Only the lookup is wrapped; behaviour with
setup_diin place is unchanged.This follows the aiohttp/starlette/aiogram integrations (modern-python/modern-di-aiogram#22) and the rule in the integration guide, modern-python/modern-di#490: a package-local
RuntimeErrornaming the fix, not aModernDIErrorsubclass.Tests
tests/test_jobs.py::test_inject_without_setup_di_names_the_fix: calls an@injecttask with a barectxdict (nosetup_di) and assertsRuntimeErrormatchingsetup_di(worker_settings, container). Written first; failed with the originalKeyErrorbefore the fix.just lintandjust test-cipass (coverage 100%).