docs: 4.0 fixes and migration guide gaps (#577) - #590
Merged
Merged
Conversation
There was a problem hiding this comment.
Benchmark
Details
| Benchmark suite | Current: 5195d97 | Previous: dc429b5 | Ratio |
|---|---|---|---|
benchmarks/test_guard_by_type.py::test_g16_resolve_by_type |
4771135.318356021 iter/sec (stddev: 1.3175779358335544e-8) |
5102055.914236189 iter/sec (stddev: 9.52400729433369e-9) |
1.07 |
benchmarks/test_guard_by_type.py::test_g17_resolve_by_type_large_registry |
4714049.526915855 iter/sec (stddev: 1.592273020013432e-8) |
5085831.8032986615 iter/sec (stddev: 1.2522495572118478e-8) |
1.08 |
benchmarks/test_guard_cold.py::test_g8_cold_first_resolve |
19295.745913383544 iter/sec (stddev: 0.0000576425132481251) |
29297.543956083937 iter/sec (stddev: 0.00004072602176145284) |
1.52 |
benchmarks/test_guard_cold.py::test_g8b_cold_first_resolve_cached |
15816.803241693817 iter/sec (stddev: 0.00016178619339037338) |
23435.427647346183 iter/sec (stddev: 0.0000861219218687902) |
1.48 |
benchmarks/test_guard_concurrency.py::test_g14_concurrent_cached_hit[1] |
591.5330062506752 iter/sec (stddev: 0.00008661424912311344) |
628.4019931849183 iter/sec (stddev: 0.00007894652359503973) |
1.06 |
benchmarks/test_guard_concurrency.py::test_g14_concurrent_cached_hit[2] |
555.2082204631286 iter/sec (stddev: 0.0000703562559922407) |
594.9347183710668 iter/sec (stddev: 0.000026614480956311327) |
1.07 |
benchmarks/test_guard_concurrency.py::test_g14_concurrent_cached_hit[4] |
430.1097649721541 iter/sec (stddev: 0.00016163168463164302) |
533.1577728093033 iter/sec (stddev: 0.00007451280002003127) |
1.24 |
benchmarks/test_guard_concurrency.py::test_g15_concurrent_first_resolve[1] |
1843.3324698332342 iter/sec (stddev: 0.0001620478102492111) |
2467.844348033351 iter/sec (stddev: 0.00019201076735409257) |
1.34 |
benchmarks/test_guard_concurrency.py::test_g15_concurrent_first_resolve[2] |
1440.8787631360672 iter/sec (stddev: 0.00020122945041234745) |
1996.258910989472 iter/sec (stddev: 0.00016202977289099483) |
1.39 |
benchmarks/test_guard_concurrency.py::test_g15_concurrent_first_resolve[4] |
977.5804151548479 iter/sec (stddev: 0.00020271188010750934) |
1378.4303200556712 iter/sec (stddev: 0.00014383378156102803) |
1.41 |
benchmarks/test_guard_concurrency.py::test_g15b_concurrent_first_resolve_sibling_children[1] |
1825.1220105497932 iter/sec (stddev: 0.00018872827269576442) |
2421.135251758205 iter/sec (stddev: 0.0001383706078002257) |
1.33 |
benchmarks/test_guard_concurrency.py::test_g15b_concurrent_first_resolve_sibling_children[2] |
1280.1486747581635 iter/sec (stddev: 0.00020308569166298645) |
1425.655877442154 iter/sec (stddev: 0.001165531284634692) |
1.11 |
benchmarks/test_guard_concurrency.py::test_g15b_concurrent_first_resolve_sibling_children[4] |
709.2860707650832 iter/sec (stddev: 0.0018528942457432336) |
1089.407718707469 iter/sec (stddev: 0.00015847542212734113) |
1.54 |
benchmarks/test_guard_lifecycle.py::test_g6_build_child_container |
1079086.0551164974 iter/sec (stddev: 3.6614530263713845e-8) |
1052773.3154799314 iter/sec (stddev: 1.9559760452511905e-7) |
0.98 |
benchmarks/test_guard_lifecycle.py::test_g6b_build_child_container_auto_scope |
1006576.7966352337 iter/sec (stddev: 5.9305695141277764e-8) |
1164955.5508298832 iter/sec (stddev: 5.1300722385687454e-8) |
1.16 |
benchmarks/test_guard_lifecycle.py::test_g7_request_lifecycle_batch |
2407.0639402488055 iter/sec (stddev: 0.000024974584133009478) |
3376.1630000852792 iter/sec (stddev: 0.0000072017809059870304) |
1.40 |
benchmarks/test_guard_lifecycle.py::test_g7c_event_loop_floor_control |
65860.34216468423 iter/sec (stddev: 0.0000035655171479245484) |
75833.34391169326 iter/sec (stddev: 9.942965400992478e-7) |
1.15 |
benchmarks/test_guard_lifecycle.py::test_g13_teardown_at_scale |
48532.19180500658 iter/sec (stddev: 0.0000020875723966144385) |
60341.35809279078 iter/sec (stddev: 0.0000012936345931504521) |
1.24 |
benchmarks/test_guard_lifecycle.py::test_g13b_teardown_at_scale_async_no_finalizers |
626.8272106690766 iter/sec (stddev: 0.00003677403774367395) |
796.5046635634772 iter/sec (stddev: 0.00002241367497023057) |
1.27 |
benchmarks/test_guard_resolve.py::test_g1_transient_resolve |
2652817.192356441 iter/sec (stddev: 3.218531949801046e-8) |
3010872.8640906387 iter/sec (stddev: 1.9601871327214897e-8) |
1.13 |
benchmarks/test_guard_resolve.py::test_g2_cached_resolve |
4512071.370100776 iter/sec (stddev: 2.3228762981428263e-8) |
4892921.112540098 iter/sec (stddev: 5.771379287349851e-9) |
1.08 |
benchmarks/test_guard_resolve.py::test_g3_deep_chain |
932254.1838587186 iter/sec (stddev: 5.5208576742968e-8) |
1039817.0379571484 iter/sec (stddev: 8.394174234613398e-8) |
1.12 |
benchmarks/test_guard_resolve.py::test_g4_wide_resolve |
537514.6959878608 iter/sec (stddev: 4.998135604108468e-7) |
631991.1253260545 iter/sec (stddev: 4.0070337905016315e-7) |
1.18 |
benchmarks/test_guard_resolve.py::test_g5_cross_scope |
2500174.699659692 iter/sec (stddev: 2.6630144311611854e-8) |
2755316.7798065064 iter/sec (stddev: 1.8462195706672834e-8) |
1.10 |
benchmarks/test_guard_resolve.py::test_g9_context_resolve |
1775134.4054278834 iter/sec (stddev: 1.6904586799524437e-7) |
2035069.2287456358 iter/sec (stddev: 1.2760908740540846e-7) |
1.15 |
benchmarks/test_guard_resolve.py::test_g12_override_active_resolve |
932219.2257085211 iter/sec (stddev: 4.561539044538833e-8) |
1032310.8655577603 iter/sec (stddev: 2.9718512203265305e-8) |
1.11 |
benchmarks/test_guard_resolve.py::test_g18_alias_hop |
4511010.519537326 iter/sec (stddev: 1.5341852428061085e-8) |
4881197.271801505 iter/sec (stddev: 5.008867382165462e-9) |
1.08 |
benchmarks/test_guard_validate.py::test_g10_validate_deep_chain |
23847.98587901712 iter/sec (stddev: 0.00002157370897751112) |
37755.77365696317 iter/sec (stddev: 0.000017183016529795874) |
1.58 |
benchmarks/test_guard_validate.py::test_g11_validate_wide |
14840.386522974419 iter/sec (stddev: 0.000026964685909947117) |
22092.356803040475 iter/sec (stddev: 0.00002123170424890081) |
1.49 |
This comment was automatically generated by workflow using github-action-benchmark.
lesnik512
force-pushed
the
docs/4-0-fixes
branch
from
October 5, 2026 08:48
03970b3 to
5195d97
Compare
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.
Closes #577.
Summary
modern_di.exceptions.warningsmodule is gone, and anexcept ArgumentResolutionErrorclause no longer catches a missing context value (ContextValueNotSetErroris a sibling underResolutionError).# Broken/# Workscontrast markers fromdocs/agents/docs-style.md. Besides the five pages the issue lists,invalid-child-scope-error.md,scope-skipped-error.mdandgroup-instantiation-error.mdhad the same# Wrong/# Rightmarkers and are converted too.integrations/grpc.md: the examples take a requiredgrpc.ServicerContext. The page now says a parameter default does not make the context optional, and shows an app-ownedContextProvider(..., bound_type=None, default=None)passed throughkwargsfor a factory that must also resolve outside an RPC.integrations/writing-integrations.md: no longer recommends theX | None = Noneparameter pattern. It points authors at the app-owned optional provider.troubleshooting/missing-provider.md: thecreate_enginesample is valid Python.troubleshooting/argument-resolution-error.md: same rewrite aswriting-integrations.md. It no longer offersrequest: fastapi.Request | None = Noneas a way to validate beforesetup_di(); it says to validate aftersetup_di()and points to the app-owned optional provider.Design decisions
modern_di/wiring.pyandresolver_compiler.py. Once a provider is registered for the type, the parameter is wired to it and its default is ignored. AContextProviderwith nodefault=raisesContextValueNotSetErrorwhen unset.# Broken/# Works, without the colon.Test plan
grpcio, plus a stand-inContextProviderfor the interceptor's), all eight troubleshooting contrast snippets, themissing-provider.mdengine sample (withsqlalchemy[asyncio]), and theargument-resolution-error.mdclaim plus the optional-provider pattern (withfastapi)just lint,just lint-cijust test-cimkdocs build --strict