Patch dependency CVEs, drop Python 3.9, add Python 3.10–3.14 support#608
Merged
Conversation
nytian
approved these changes
Jun 24, 2026
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.
Summary
This PR started as a Dependabot CVE remediation and grew to cover the Python support matrix and the dev toolchain needed to build/test on current Python versions. The on-the-wire format and runtime behavior of the library are unchanged.
What changed
Security: patch Dependabot CVEs
Bumped vulnerable dependencies to patched versions (resolves all 13 Dependabot findings — 9 moderate, 4 low):
aiohttprequestspytestsetup.py install_requiresnow usesaiohttp>=3.14.1andrequests>=2.33.0,<3(replacing the looserequests==2.*).Drop Python 3.9 (EOL / unsupported in Azure Functions)
python_requiresraised to>=3.10,<4.azure-pipelines.yml,azure-pipelines-release.yml,eng/templates/build.yml,.github/workflows/validate.yml,.github/workflows/durable_python_action.yml,noxfile.py, andCONTRIBUTING.md.azure-functions<1.26.0on the floor CI leg, so both serialization branches remain tested.Add Python 3.10–3.14 support
3.10–3.14classifiers insetup.py.validate.ymllint/test matrix to3.10, 3.11, 3.12, 3.13, 3.14, preserving both serialization-path legs (legacy fallback on the 3.10 floor; SDK-delegated path on 3.13).noxfile.py(tests/typecheckacross 3.10–3.14;lint/autopepkept on the canonical 3.10 to avoid PEP 701 f-string false positives).Modernize the dev toolchain for Python 3.14
Building on a fresh 3.14 venv reproduced two failures that traced back to stale, under-constrained dev tooling:
AttributeError: 'Constant' object has no attribute 's'): the unpinnedautopep8was backtracked by pip to a 2020-era sdist whosesetup.pyusesast.Constant.s(removed in 3.14). Root cause:flake8==3.7.8cappedpycodestyle<2.6, which conflicted with modernautopep8. Fixed by bumpingflake83.7.8 → 7.1.1,flake8-docstrings1.5.0 → 1.7.0, and pinningautopep8==2.3.2.pytest-asyncio==0.20.2callsasyncio.iscoroutinefunction()(deprecated in 3.14, removed in 3.16). Bumped topytest-asyncio==1.4.0, dropping warnings from ~9,746 to 12.Validation
requirements.txtinstalls cleanly on a fresh Python 3.14 venv (all wheels, no source build).flake8 7.1.1reports 0 findings onazure/.pip checkreports no broken requirements;pip-auditreports no known vulnerabilities.Notes / follow-ups (out of scope for this PR)
requirements.txtmixes runtime, test, and lint deps and partially duplicatessetup.py. A future cleanup could split runtime vs. dev requirements, switchsetup.pydev extras to compatible ranges (and fix theextra_requires→extras_requirekey), and add a lockfile for reproducible CI.flake8also unblocks a previously-deferredmatch/casemodernization inDurableOrchestrationClient.py, if desired later.