Skip to content

refactor!: rename ProviderNotRegisteredError.provider_type to dependency_type, and exception group keywords to exceptions (#614) - #619

Merged
lesnik512 merged 1 commit into
mainfrom
issue-614
Oct 7, 2026
Merged

lesnik512 merged 1 commit into
mainfrom
issue-614

Conversation

@lesnik512

Copy link
Copy Markdown
Member

Closes #614.

Summary

  • ProviderNotRegisteredError.provider_type is now .dependency_type, and so is its constructor keyword. The message now reads No provider is registered for B., matching the troubleshooting page.
  • FinalizerError(finalizer_errors=) and ValidationFailedError(errors=) now take exceptions=, the name of the attribute that holds them.
  • modern_di.types.P is deleted. Nothing used it.
  • Migration guide: new entries for the three renames and the new message, the creator= that ArgumentResolutionError now requires, and a "Only four modules are public" section covering the deleted cache_registry / context_registry modules, the helpers removed from modern_di.scope, and types.P.
  • Stale text: "context registry" and "cache registry" wording in docstrings and docs, the CacheRegistry.fetch_cache_item reference in the performance history, the InvalidChildScopeError note about a constructor parent, the internal register named on the lifecycle page, the container page H1 (now "Container", as in the nav), its explicit-injection example (the parameter is no longer annotated Container), and the factories.md finalizer lambda that failed pyright (now a def).

Design decisions

Test plan

  • Tests updated first and seen failing: new attribute and keyword names, the new message text, and a full-string assert for the typo suggestion (the old one avoided the <locals> repr)
  • New test: the message names list[int] and a NewType correctly
  • just lint, just lint-ci
  • just test-ci (100% coverage)
  • mkdocs build --strict
  • The edited container and factories doc samples run and pass pyright

…ncy_type, and exception group keywords to exceptions (#614)

Reword the missing-provider message, drop the unused types.P, fill migration guide gaps and fix stale docs.

@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: 6e24334 Previous: f6e343d Ratio
benchmarks/test_guard_by_type.py::test_g16_resolve_by_type 2876876.7521229764 iter/sec (stddev: 1.1696033830753136e-8) 2921718.256656569 iter/sec (stddev: 1.675866103278825e-8) 1.02
benchmarks/test_guard_by_type.py::test_g17_resolve_by_type_large_registry 2873344.0020654784 iter/sec (stddev: 1.0792850543847373e-8) 2939203.314248642 iter/sec (stddev: 1.204015671986658e-8) 1.02
benchmarks/test_guard_cold.py::test_g8_cold_first_resolve 21337.417788597268 iter/sec (stddev: 0.00004319748084508497) 21762.967229655445 iter/sec (stddev: 0.00004094890871011781) 1.02
benchmarks/test_guard_cold.py::test_g8b_cold_first_resolve_cached 16602.147921189095 iter/sec (stddev: 0.00011596111660614653) 16433.6760366631 iter/sec (stddev: 0.00010812780919654217) 0.99
benchmarks/test_guard_concurrency.py::test_g14_concurrent_cached_hit[1] 339.74360636823667 iter/sec (stddev: 0.00004409823041302261) 461.45135894055323 iter/sec (stddev: 0.00003990784243928985) 1.36
benchmarks/test_guard_concurrency.py::test_g14_concurrent_cached_hit[2] 340.14769253060797 iter/sec (stddev: 0.0000848787600443331) 451.0026376153234 iter/sec (stddev: 0.000054903965874733085) 1.33
benchmarks/test_guard_concurrency.py::test_g14_concurrent_cached_hit[4] 357.1023656420849 iter/sec (stddev: 0.00014472413870029096) 425.7675844707922 iter/sec (stddev: 0.00008308038620630768) 1.19
benchmarks/test_guard_concurrency.py::test_g15_concurrent_first_resolve[1] 12905.503003303023 iter/sec (stddev: 0.000007207691697000248) 12751.290749215299 iter/sec (stddev: 0.00000819216963265991) 0.99
benchmarks/test_guard_concurrency.py::test_g15_concurrent_first_resolve[2] 6409.680155344794 iter/sec (stddev: 0.000024502105748011574) 6401.705755814795 iter/sec (stddev: 0.000022867724842553285) 1.00
benchmarks/test_guard_concurrency.py::test_g15_concurrent_first_resolve[4] 3344.018121458962 iter/sec (stddev: 0.00004400377315312043) 3423.3858792657397 iter/sec (stddev: 0.000040939280354384506) 1.02
benchmarks/test_guard_concurrency.py::test_g15b_concurrent_first_resolve_sibling_children[1] 8239.983476082682 iter/sec (stddev: 0.000010742401355025445) 7612.8302325882405 iter/sec (stddev: 0.000010256134066683693) 0.92
benchmarks/test_guard_concurrency.py::test_g15b_concurrent_first_resolve_sibling_children[2] 3527.312495050392 iter/sec (stddev: 0.000020281655325898572) 3618.370685087365 iter/sec (stddev: 0.00002517012025414019) 1.03
benchmarks/test_guard_concurrency.py::test_g15b_concurrent_first_resolve_sibling_children[4] 1715.014227829269 iter/sec (stddev: 0.00004653093307089315) 1719.2318706952121 iter/sec (stddev: 0.00004854649644947838) 1.00
benchmarks/test_guard_concurrency.py::test_g15c_worker_pool_floor_control[1] 40502.52837066591 iter/sec (stddev: 0.000005362763750588661) 32996.42153964083 iter/sec (stddev: 0.000006880551983878211) 0.81
benchmarks/test_guard_concurrency.py::test_g15c_worker_pool_floor_control[2] 13958.854415514363 iter/sec (stddev: 0.000014119539297385203) 14659.535942872064 iter/sec (stddev: 0.000012750288363749525) 1.05
benchmarks/test_guard_concurrency.py::test_g15c_worker_pool_floor_control[4] 5919.772578139759 iter/sec (stddev: 0.00003551057028411714) 5849.76259472311 iter/sec (stddev: 0.0000335570564798276) 0.99
benchmarks/test_guard_lifecycle.py::test_g6_build_child_container 1628864.1238215764 iter/sec (stddev: 3.169392048789073e-8) 1585121.4791400717 iter/sec (stddev: 3.581802492697611e-8) 0.97
benchmarks/test_guard_lifecycle.py::test_g6b_build_child_container_auto_scope 1577316.983020222 iter/sec (stddev: 2.4889369271199436e-8) 1634928.8822412132 iter/sec (stddev: 2.2739949474734155e-8) 1.04
benchmarks/test_guard_lifecycle.py::test_g7_request_lifecycle_batch 2805.286465082796 iter/sec (stddev: 0.000013069684558158616) 2851.9403996074443 iter/sec (stddev: 0.00001246850076439463) 1.02
benchmarks/test_guard_lifecycle.py::test_g7c_event_loop_floor_control 57610.72882387156 iter/sec (stddev: 0.000002558145117166013) 58007.21870000694 iter/sec (stddev: 0.00000208313451377107) 1.01
benchmarks/test_guard_lifecycle.py::test_g7b_request_cycle_sync 344700.5046398797 iter/sec (stddev: 1.4150320288726064e-7) 332497.14734137605 iter/sec (stddev: 7.44393106694809e-8) 0.96
benchmarks/test_guard_lifecycle.py::test_g13_teardown_at_scale 48879.97919771222 iter/sec (stddev: 0.0000026061143853176474) 48889.69298560324 iter/sec (stddev: 0.000001820471012608131) 1.00
benchmarks/test_guard_lifecycle.py::test_g13b_teardown_at_scale_async_no_finalizers 460.741650330517 iter/sec (stddev: 0.001109702313569377) 472.1940049135932 iter/sec (stddev: 0.001026790425194055) 1.02
benchmarks/test_guard_resolve.py::test_g1_transient_resolve 1985595.8917150293 iter/sec (stddev: 4.91556318072766e-8) 2178750.936263875 iter/sec (stddev: 2.6353327029762944e-8) 1.10
benchmarks/test_guard_resolve.py::test_g2_cached_resolve 2772472.805092418 iter/sec (stddev: 1.0591957006213357e-8) 3311376.0403177035 iter/sec (stddev: 2.072399608841274e-8) 1.19
benchmarks/test_guard_resolve.py::test_g3_deep_chain 707343.6541965557 iter/sec (stddev: 4.23623889972603e-8) 678836.554249412 iter/sec (stddev: 4.6008684988825406e-8) 0.96
benchmarks/test_guard_resolve.py::test_g4_wide_resolve 444648.4096104095 iter/sec (stddev: 4.038849480355304e-7) 436782.78901172994 iter/sec (stddev: 3.7702362683787223e-7) 0.98
benchmarks/test_guard_resolve.py::test_g5_cross_scope 1723795.846715483 iter/sec (stddev: 2.2071017689722112e-8) 1876457.2449674914 iter/sec (stddev: 3.702446327477425e-8) 1.09
benchmarks/test_guard_resolve.py::test_g9_context_resolve 1309741.741194973 iter/sec (stddev: 1.555277413482454e-7) 1310469.1843290261 iter/sec (stddev: 1.5759486009534166e-7) 1.00
benchmarks/test_guard_resolve.py::test_g12_override_active_resolve 730129.231779183 iter/sec (stddev: 4.7694322862630576e-8) 715658.0140887419 iter/sec (stddev: 4.497059959957813e-8) 0.98
benchmarks/test_guard_resolve.py::test_g18_alias_hop 2749724.4776143027 iter/sec (stddev: 1.0229654417429118e-8) 2903717.0685449257 iter/sec (stddev: 8.479702107212049e-9) 1.06
benchmarks/test_guard_validate.py::test_g10_validate_deep_chain 27449.318470454247 iter/sec (stddev: 0.000021319509854083832) 27290.39780542258 iter/sec (stddev: 0.00002305556618279706) 0.99
benchmarks/test_guard_validate.py::test_g11_validate_wide 16462.904203780417 iter/sec (stddev: 0.000025955323870805172) 16384.134733354367 iter/sec (stddev: 0.000027709419502202343) 1.00

This comment was automatically generated by workflow using github-action-benchmark.

@lesnik512
lesnik512 merged commit d2ce7c3 into main Oct 7, 2026
11 checks passed
@lesnik512
lesnik512 deleted the issue-614 branch October 7, 2026 19:40
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.

Breaking renames, migration guide gaps and stale docs before 4.0.0

1 participant