Skip to content

docs: 4.0 fixes and migration guide gaps (#577) - #590

Merged
lesnik512 merged 2 commits into
mainfrom
docs/4-0-fixes
Oct 5, 2026
Merged

lesnik512 merged 2 commits into
mainfrom
docs/4-0-fixes

Conversation

@lesnik512

@lesnik512 lesnik512 commented Oct 4, 2026 •

Copy link
Copy Markdown
Member

Closes #577.

Summary

  • Migration guide: the modern_di.exceptions.warnings module is gone, and an except ArgumentResolutionError clause no longer catches a missing context value (ContextValueNotSetError is a sibling under ResolutionError).
  • Troubleshooting pages use the # Broken / # Works contrast markers from docs/agents/docs-style.md. Besides the five pages the issue lists, invalid-child-scope-error.md, scope-skipped-error.md and group-instantiation-error.md had the same # Wrong / # Right markers and are converted too.
  • integrations/grpc.md: the examples take a required grpc.ServicerContext. The page now says a parameter default does not make the context optional, and shows an app-owned ContextProvider(..., bound_type=None, default=None) passed through kwargs for a factory that must also resolve outside an RPC.
  • integrations/writing-integrations.md: no longer recommends the X | None = None parameter pattern. It points authors at the app-owned optional provider.
  • troubleshooting/missing-provider.md: the create_engine sample is valid Python.
  • troubleshooting/argument-resolution-error.md: same rewrite as writing-integrations.md. It no longer offers request: fastapi.Request | None = None as a way to validate before setup_di(); it says to validate after setup_di() and points to the app-owned optional provider.

Design decisions

  • 4.0 semantics checked against modern_di/wiring.py and resolver_compiler.py. Once a provider is registered for the type, the parameter is wired to it and its default is ignored. A ContextProvider with no default= raises ContextValueNotSetError when unset.
  • A marker with no trailing text is written # Broken / # Works, without the colon.

Test plan

  • Ran the changed snippets against 4.0 with stubs: the three gRPC snippets (with grpcio, plus a stand-in ContextProvider for the interceptor's), all eight troubleshooting contrast snippets, the missing-provider.md engine sample (with sqlalchemy[asyncio]), and the argument-resolution-error.md claim plus the optional-provider pattern (with fastapi)
  • just lint, just lint-ci
  • just test-ci
  • mkdocs build --strict

@github-actions github-actions Bot left a comment •

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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
lesnik512 merged commit fd1e0f4 into main Oct 5, 2026
9 checks passed
@lesnik512
lesnik512 deleted the docs/4-0-fixes branch October 5, 2026 08:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Docs: 4.0 fixes and migration guide gaps

1 participant