Skip to content

feat!: drop Python 3.10 - #552

Merged
lesnik512 merged 1 commit into
mainfrom
drop-py310
Oct 3, 2026
Merged

lesnik512 merged 1 commit into
mainfrom
drop-py310

Conversation

@lesnik512

Copy link
Copy Markdown
Member

Python 3.10 reaches end of life on 2026-10-31. This drops it ahead of that date, matching modern-python/eof-fixer#58. The org standard lets a repo raise its floor without recording a decision, so this has no ADR.

Changes

  • requires-python is now >=3.11,<4, and the 3.10 classifier is gone. The same floor applies to benchmarks/comparative/pyproject.toml.
  • CI: lint now runs on 3.11, and "3.10" is dropped from the pytest matrix.
  • container.py and group.py now use typing.Self. The TYPE_CHECKING-only typing_extensions import is gone, and so is typing-extensions from the lint group. The scheduled-failure script no longer lists it as a likely cause.
  • test_modern_di_imports_without_typing_extensions is kept: it still guards the zero-runtime-deps claim. Only its pointer to container.py / group.py is removed.
  • Ruff now targets py311, which triggers UP017 (datetime.UTC) in test_context_provider.py and makes a noqa: PERF203 in cache_registry.py unused. On 3.11+ try is zero-cost, and ruff skips that rule there.
  • test_runtime_cycle_guard.py: removed eight # pragma: no cover - 3.10 coverage loses it after RecursionError markers, plus the comment block and the two pointers that justified them. Without them, coverage stays at 100% on 3.11, 3.12, 3.13, 3.14 and 3.14t, and three repeated runs on 3.11 and 3.14t also held at 100%.
  • README and docs: "Python 3.11+ support".

Verification

  • On 3.11: eof-fixer --check, ruff format --check, ruff check, ty check, just test-ci (548 passed, 100% coverage), just adr-check and just docs-build all pass.
  • The 8 skipped tests are the existing context kwarg skips and are not version-related.

Release

This is a breaking change because it drops a supported interpreter. Release it as a minor or major version, not a patch. The integrations (modern-di-*) still declare 3.10 and will follow in their own PRs.

@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: 1e928f5 Previous: 57d766b Ratio
benchmarks/test_guard_by_type.py::test_g16_resolve_by_type 2989626.44467516 iter/sec (stddev: 1.4645598277692729e-8) 3614640.0440299055 iter/sec (stddev: 1.607689610789833e-8) 1.21
benchmarks/test_guard_by_type.py::test_g17_resolve_by_type_large_registry 3138900.4243519125 iter/sec (stddev: 1.3857333262265615e-8) 3613607.37101661 iter/sec (stddev: 1.8429723622872588e-8) 1.15
benchmarks/test_guard_cold.py::test_g8_cold_first_resolve 16350.861713056067 iter/sec (stddev: 0.0000442005014390633) 14983.349814429757 iter/sec (stddev: 0.000056999021269073526) 0.92
benchmarks/test_guard_cold.py::test_g8b_cold_first_resolve_cached 13201.079852881641 iter/sec (stddev: 0.00011588647692419056) 12772.28969340765 iter/sec (stddev: 0.000155760881123249) 0.97
benchmarks/test_guard_concurrency.py::test_g14_concurrent_cached_hit[1] 338.50489619999024 iter/sec (stddev: 0.00004029347855232769) 369.1584500827664 iter/sec (stddev: 0.00006535018283212508) 1.09
benchmarks/test_guard_concurrency.py::test_g14_concurrent_cached_hit[2] 325.16716391421585 iter/sec (stddev: 0.00007488556888978227) 352.266575529102 iter/sec (stddev: 0.000050097003155912846) 1.08
benchmarks/test_guard_concurrency.py::test_g14_concurrent_cached_hit[4] 302.8486100960956 iter/sec (stddev: 0.00005688462533569907) 329.77881890170994 iter/sec (stddev: 0.0000670627805046678) 1.09
benchmarks/test_guard_concurrency.py::test_g15_concurrent_first_resolve[1] 1651.3274856526941 iter/sec (stddev: 0.00017714958122320724) 1567.8798489764295 iter/sec (stddev: 0.0002102871811052278) 0.95
benchmarks/test_guard_concurrency.py::test_g15_concurrent_first_resolve[2] 1114.8346692294972 iter/sec (stddev: 0.00025323994755666594) 1255.7227734132307 iter/sec (stddev: 0.0002346899154467564) 1.13
benchmarks/test_guard_concurrency.py::test_g15_concurrent_first_resolve[4] 856.0318684114928 iter/sec (stddev: 0.00028488512400748757) 913.3539193157175 iter/sec (stddev: 0.0002462301143844135) 1.07
benchmarks/test_guard_concurrency.py::test_g15b_concurrent_first_resolve_sibling_children[1] 1320.9327542090928 iter/sec (stddev: 0.0012598952103770801) 1257.3505498993757 iter/sec (stddev: 0.0012668067129371057) 0.95
benchmarks/test_guard_concurrency.py::test_g15b_concurrent_first_resolve_sibling_children[2] 1168.9447272574948 iter/sec (stddev: 0.0002287483838433314) 1103.8702232766773 iter/sec (stddev: 0.00035184756907846227) 0.94
benchmarks/test_guard_concurrency.py::test_g15b_concurrent_first_resolve_sibling_children[4] 772.4117241054473 iter/sec (stddev: 0.00022907971866503553) 753.6268764446363 iter/sec (stddev: 0.00025469666061486907) 0.98
benchmarks/test_guard_lifecycle.py::test_g6_build_child_container 792597.488202698 iter/sec (stddev: 5.1378491779789886e-8) 819810.9782315302 iter/sec (stddev: 4.615432986323787e-8) 1.03
benchmarks/test_guard_lifecycle.py::test_g6b_build_child_container_auto_scope 726172.7076511333 iter/sec (stddev: 4.4572497060229244e-8) 750997.968344333 iter/sec (stddev: 8.032264915780852e-8) 1.03
benchmarks/test_guard_lifecycle.py::test_g7_request_lifecycle_batch 2363.116633997438 iter/sec (stddev: 0.000012771850834320758) 2196.718760122603 iter/sec (stddev: 0.00006898048861633186) 0.93
benchmarks/test_guard_lifecycle.py::test_g7c_event_loop_floor_control 57722.83859431334 iter/sec (stddev: 0.000002681995178628031) 56689.00724323654 iter/sec (stddev: 0.0000026349948904927352) 0.98
benchmarks/test_guard_lifecycle.py::test_g13_teardown_at_scale 43988.8601964208 iter/sec (stddev: 0.000002246050542627313) 42307.14670681229 iter/sec (stddev: 0.0000033291332693164523) 0.96
benchmarks/test_guard_lifecycle.py::test_g13b_teardown_at_scale_async_no_finalizers 529.2522069771097 iter/sec (stddev: 0.000023358880394468254) 542.4555691622402 iter/sec (stddev: 0.00005392622444586941) 1.02
benchmarks/test_guard_resolve.py::test_g1_transient_resolve 2026761.0488782187 iter/sec (stddev: 2.7396561727257988e-8) 2181369.0577609935 iter/sec (stddev: 3.20701118310741e-8) 1.08
benchmarks/test_guard_resolve.py::test_g2_cached_resolve 2827490.080036776 iter/sec (stddev: 1.1007386381107459e-8) 3353634.785086139 iter/sec (stddev: 3.6396568888459826e-8) 1.19
benchmarks/test_guard_resolve.py::test_g3_deep_chain 722459.9617198608 iter/sec (stddev: 4.125478172178737e-8) 682970.609350519 iter/sec (stddev: 3.0595027462448446e-7) 0.95
benchmarks/test_guard_resolve.py::test_g4_wide_resolve 458559.7386068158 iter/sec (stddev: 2.993745547266525e-7) 446558.6416007748 iter/sec (stddev: 3.534407178193005e-7) 0.97
benchmarks/test_guard_resolve.py::test_g5_cross_scope 1823736.920847165 iter/sec (stddev: 2.9347184454060098e-8) 2016045.8094048374 iter/sec (stddev: 2.8921586035787833e-8) 1.11
benchmarks/test_guard_resolve.py::test_g9_context_resolve 1039425.5406868078 iter/sec (stddev: 1.3008484579991707e-7) 1068276.5737078178 iter/sec (stddev: 1.7049355155904538e-7) 1.03
benchmarks/test_guard_resolve.py::test_g12_override_active_resolve 707027.6962182277 iter/sec (stddev: 6.777404973805501e-8) 732685.8368784948 iter/sec (stddev: 5.017116564900238e-8) 1.04
benchmarks/test_guard_resolve.py::test_g18_alias_hop 1995747.74012042 iter/sec (stddev: 1.0527338028035814e-8) 2014341.1420495408 iter/sec (stddev: 1.6108681399623987e-8) 1.01
benchmarks/test_guard_validate.py::test_g10_validate_deep_chain 23648.174193869654 iter/sec (stddev: 0.000022747911750112896) 23143.01293500811 iter/sec (stddev: 0.000022232789607034827) 0.98
benchmarks/test_guard_validate.py::test_g11_validate_wide 14291.873811100602 iter/sec (stddev: 0.000026054018131333103) 13762.324121128708 iter/sec (stddev: 0.0000309564549357182) 0.96

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

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.

1 participant