{"id":1831,"name":"virtualenv","ecosystem":"pip","repository_url":"https://github.com/pypa/virtualenv","issues_count":3259,"created_at":"2025-06-06T15:01:51.460Z","updated_at":"2025-06-06T15:01:51.460Z","purl":"pkg:pypi/virtualenv","metadata":{"id":2964496,"name":"virtualenv","ecosystem":"pypi","description":"Virtual Python Environment builder","homepage":"https://github.com/pypa/virtualenv","licenses":"MIT License","normalized_licenses":["MIT"],"repository_url":"https://github.com/pypa/virtualenv","keywords_array":["environments","isolated","virtual"],"namespace":null,"versions_count":235,"first_release_published_at":"2007-09-14T23:32:10.000Z","latest_release_published_at":"2025-05-08T17:58:21.000Z","latest_release_number":"20.31.2","last_synced_at":"2025-05-08T18:32:35.687Z","created_at":"2022-04-10T13:00:47.625Z","updated_at":"2025-05-08T18:32:36.225Z","registry_url":"https://pypi.org/project/virtualenv/","install_command":"pip install virtualenv --index-url https://pypi.org/simple","documentation_url":"https://virtualenv.pypa.io","metadata":{"funding":null,"documentation":"https://virtualenv.pypa.io","classifiers":["Development Status :: 5 - Production/Stable","Intended Audience :: Developers","License :: OSI Approved :: MIT License","Operating System :: MacOS :: MacOS X","Operating System :: Microsoft :: Windows","Operating System :: POSIX","Programming Language :: Python :: 3 :: Only","Programming Language :: Python :: 3.10","Programming Language :: Python :: 3.11","Programming Language :: Python :: 3.12","Programming Language :: Python :: 3.13","Programming Language :: Python :: 3.8","Programming Language :: Python :: 3.9","Programming Language :: Python :: Implementation :: CPython","Programming Language :: Python :: Implementation :: PyPy","Topic :: Software Development :: Libraries","Topic :: Software Development :: Testing","Topic :: Utilities"],"normalized_name":"virtualenv"},"repo_metadata":{"uuid":"1446474","full_name":"pypa/virtualenv","owner":"pypa","description":"Virtual Python Environment builder","archived":false,"fork":false,"pushed_at":"2023-12-25T18:33:07.000Z","size":139733,"stargazers_count":4611,"open_issues_count":22,"forks_count":1090,"subscribers_count":170,"default_branch":"main","last_synced_at":"2024-01-04T14:23:44.912Z","etag":null,"topics":["cython","hacktoberfest","jython","library","pypa","pypy","pypy3","python","virtualenv"],"latest_commit_sha":null,"homepage":"https://virtualenv.pypa.io","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pypa.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":".github/CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":".github/SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null},"funding":{"tidelift":"pypi/virtualenv"}},"created_at":"2011-03-06T14:33:27.000Z","updated_at":"2024-01-04T12:44:56.000Z","dependencies_parsed_at":"2023-12-16T05:42:46.808Z","dependency_job_id":"3995fecc-de66-4dd8-a58c-5b6631e054f2","html_url":"https://github.com/pypa/virtualenv","commit_stats":{"total_commits":661,"total_committers":120,"mean_commits":5.508333333333334,"dds":0.5113464447806354,"last_synced_commit":"5ad4de304a8e0344d0c3084c31f129119e50a377"},"previous_names":[],"tags_count":218,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pypa","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":179165645,"owners_count":10778410,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"},"owner_record":{"login":"pypa","name":"Python Packaging Authority","uuid":"647025","kind":"organization","description":"","email":"info@pypa.io","website":"https://www.pypa.io","location":null,"twitter":null,"company":null,"icon_url":"https://avatars.githubusercontent.com/u/647025?v=4","repositories_count":52,"last_synced_at":"2023-04-09T06:01:36.542Z","metadata":{"has_sponsors_listing":true},"html_url":"https://github.com/pypa","created_at":"2022-11-02T16:21:37.826Z","updated_at":"2023-04-09T06:01:37.141Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pypa","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pypa/repositories"},"tags":[{"name":"20.25.0","sha":"1941c1d5abf81814992b68bbc86c0020dc75a3ad","kind":"commit","published_at":"2023-12-01T16:23:39.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.25.0","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.25.0","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.25.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.25.0/manifests"},{"name":"20.24.7","sha":"6558fc799b02d9cd4860269d694b4b2a995e6afe","kind":"commit","published_at":"2023-11-21T17:51:22.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.24.7","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.24.7","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.24.7","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.24.7/manifests"},{"name":"20.24.6","sha":"29c08dfd640ecc176df995c39a55a0509990bdc4","kind":"commit","published_at":"2023-10-23T18:21:41.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.24.6","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.24.6","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.24.6","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.24.6/manifests"},{"name":"20.24.5","sha":"7e50f99e1b749ab02bcfd413c7fd9a43e4be83a6","kind":"commit","published_at":"2023-09-08T14:36:01.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.24.5","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.24.5","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.24.5","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.24.5/manifests"},{"name":"20.24.4","sha":"564a87797c2a93abfb75ce4d825bbf40d38494ac","kind":"commit","published_at":"2023-08-30T14:27:43.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.24.4","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.24.4","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.24.4","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.24.4/manifests"},{"name":"20.24.3","sha":"3e09cd266ccdb0d7e513b68474d6c218681c7584","kind":"commit","published_at":"2023-08-11T15:47:34.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.24.3","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.24.3","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.24.3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.24.3/manifests"},{"name":"20.24.2","sha":"ea1862f43ba29ed7904e89170906b8a0379ad208","kind":"commit","published_at":"2023-07-24T14:46:23.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.24.2","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.24.2","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.24.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.24.2/manifests"},{"name":"20.24.1","sha":"5d080380ce4a438a43213d712e889964b6a7a8fe","kind":"commit","published_at":"2023-07-20T02:23:27.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.24.1","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.24.1","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.24.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.24.1/manifests"},{"name":"20.24.0","sha":"9af15e39c6101f930989889839b1217cee894c0f","kind":"commit","published_at":"2023-07-14T22:59:22.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.24.0","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.24.0","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.24.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.24.0/manifests"},{"name":"20.23.1","sha":"10eec29256bf7273dbf9bb10bc08226e67ee1701","kind":"commit","published_at":"2023-06-16T18:38:12.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.23.1","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.23.1","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.23.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.23.1/manifests"},{"name":"20.23.0","sha":"6327f153bb0366c3c332f3814a6bcd0223cb4e26","kind":"commit","published_at":"2023-04-27T23:36:47.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.23.0","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.23.0","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.23.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.23.0/manifests"},{"name":"20.22.0","sha":"540d20029edb0d95af4a912ffead1a05d83cffea","kind":"commit","published_at":"2023-04-19T23:06:16.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.22.0","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.22.0","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.22.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.22.0/manifests"},{"name":"20.21.1","sha":"17a8b3b80a7251b1779f666dc7f5841de526a175","kind":"commit","published_at":"2023-04-19T20:00:13.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.21.1","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.21.1","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.21.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.21.1/manifests"},{"name":"20.21.0","sha":"f6e3f754700d3ce27f224c6b1937ea36478dc4f2","kind":"commit","published_at":"2023-03-12T17:23:55.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.21.0","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.21.0","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.21.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.21.0/manifests"},{"name":"20.20.0","sha":"2e22984737769626727998a777f89dcff6dbb6ed","kind":"commit","published_at":"2023-02-28T18:20:01.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.20.0","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.20.0","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.20.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.20.0/manifests"},{"name":"20.19.0","sha":"e2833afe407ea8a9b8abd79befd4339f7c1c873b","kind":"commit","published_at":"2023-02-07T19:14:43.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.19.0","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.19.0","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.19.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.19.0/manifests"},{"name":"20.18.0","sha":"32f270c11621c0658e8ae95e3060c1896a03d13b","kind":"commit","published_at":"2023-02-06T17:33:30.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.18.0","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.18.0","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.18.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.18.0/manifests"},{"name":"20.17.1","sha":"63d5a3ceaf66441542da951914f34d8c1951ab28","kind":"commit","published_at":"2022-12-05T20:00:26.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.17.1","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.17.1","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.17.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.17.1/manifests"},{"name":"20.17.0","sha":"33e7b9db29e93493e695f929767a27f007d31f4c","kind":"commit","published_at":"2022-11-28T03:54:35.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.17.0","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.17.0","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.17.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.17.0/manifests"},{"name":"20.16.7","sha":"d536b25fd38699a15cb9d782be2786d2aec4de83","kind":"commit","published_at":"2022-11-12T21:38:58.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.16.7","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.16.7","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.16.7","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.16.7/manifests"},{"name":"20.16.6","sha":"26f68e205dfbe36c47fdd1886b0c0060024dbeec","kind":"commit","published_at":"2022-10-25T16:00:21.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.16.6","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.16.6","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.16.6","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.16.6/manifests"},{"name":"20.16.5","sha":"0a7d1edf0fe115d869f3f8cc07c97057e4353091","kind":"commit","published_at":"2022-09-08T00:14:11.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.16.5","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.16.5","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.16.5","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.16.5/manifests"},{"name":"20.16.4","sha":"27550925aa56229279a5b13d6bb2c334d328e99d","kind":"commit","published_at":"2022-08-30T01:12:12.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.16.4","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.16.4","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.16.4","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.16.4/manifests"},{"name":"20.16.3","sha":"2f8667abaa0e3b96f706635f81efa3c54db076ff","kind":"commit","published_at":"2022-08-04T14:55:38.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.16.3","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.16.3","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.16.3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.16.3/manifests"},{"name":"20.16.2","sha":"854e777152eab0c581850a73175e569db6e9f2ff","kind":"commit","published_at":"2022-07-27T21:08:27.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.16.2","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.16.2","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.16.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.16.2/manifests"},{"name":"20.16.1","sha":"3ee69bab4852b50eb056b65708ebd699676ecbcd","kind":"commit","published_at":"2022-07-26T23:57:31.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.16.1","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.16.1","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.16.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.16.1/manifests"},{"name":"20.16.0","sha":"c0ba7809fb5d077ca12d4ab0dee4057513f908e5","kind":"commit","published_at":"2022-07-25T22:40:34.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.16.0","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.16.0","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.16.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.16.0/manifests"},{"name":"20.15.1","sha":"5e96f89e3dff0fec7d104144795a47d3fd390cbc","kind":"commit","published_at":"2022-06-29T00:59:50.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.15.1","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.15.1","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.15.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.15.1/manifests"},{"name":"20.15.0","sha":"26ed3d2aac43e4c8ec512c63e138d621af9a4be5","kind":"commit","published_at":"2022-06-25T17:55:30.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.15.0","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.15.0","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.15.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.15.0/manifests"},{"name":"20.14.2","sha":"5cc37b64af54b90ff645caf606cb3e5ea42958c7","kind":"commit","published_at":"2022-06-13T10:14:27.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.14.2","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.14.2","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.14.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.14.2/manifests"},{"name":"20.14.1","sha":"17cef12d780e512738b8aed8d02eaee35f50d7cd","kind":"commit","published_at":"2022-04-11T07:55:01.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.14.1","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.14.1","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.14.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.14.1/manifests"},{"name":"20.14.0","sha":"a731637cbaf2da326a8ce5c857e2e873ef1120ce","kind":"commit","published_at":"2022-03-25T18:20:16.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.14.0","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.14.0","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.14.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.14.0/manifests"},{"name":"20.13.4","sha":"775c1893e555139a9fbe7429c04062f4904afbe8","kind":"commit","published_at":"2022-03-18T17:32:13.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.13.4","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.13.4","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.13.4","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.13.4/manifests"},{"name":"20.13.3","sha":"e3c30b7e6a9d6743e2374cba8885c599801be767","kind":"commit","published_at":"2022-03-07T13:25:05.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.13.3","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.13.3","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.13.3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.13.3/manifests"},{"name":"20.13.2","sha":"bcf9bb892d020ba8993bd06ce8a6c43796ae97e0","kind":"commit","published_at":"2022-02-24T10:18:42.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.13.2","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.13.2","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.13.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.13.2/manifests"},{"name":"20.13.1","sha":"16ad07fdcc7fe1d5f9a40ff5cf9cec005ff2cb1c","kind":"commit","published_at":"2022-02-05T20:29:47.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.13.1","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.13.1","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.13.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.13.1/manifests"},{"name":"20.13.0","sha":"568136cd8872e78a266411ca83b0cfc190acc090","kind":"commit","published_at":"2022-01-02T15:04:14.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.13.0","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.13.0","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.13.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.13.0/manifests"},{"name":"20.12.1","sha":"879926629d8c26856e225ee65b02fc75a72aa186","kind":"commit","published_at":"2022-01-01T10:36:31.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.12.1","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.12.1","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.12.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.12.1/manifests"},{"name":"20.12.0","sha":"232a0b644471bd26ed3147404df1bc018fc5a097","kind":"commit","published_at":"2021-12-31T08:01:21.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.12.0","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.12.0","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.12.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.12.0/manifests"},{"name":"20.11.2","sha":"b33e0ef37800ef24ae67a6bf7f8a68e3221c9685","kind":"commit","published_at":"2021-12-29T11:00:58.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.11.2","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.11.2","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.11.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.11.2/manifests"},{"name":"20.11.1","sha":"4d90b4f905f5d6bd6bbc2721bbfe4f938845f2b4","kind":"commit","published_at":"2021-12-29T00:05:11.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.11.1","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.11.1","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.11.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.11.1/manifests"},{"name":"20.11.0","sha":"72106af48f00936b50160ad9f7a921c91508c983","kind":"commit","published_at":"2021-12-28T10:43:15.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.11.0","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.11.0","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.11.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.11.0/manifests"},{"name":"20.10.0","sha":"2f4e2668a4f70047549a5c8b146ac75143367538","kind":"commit","published_at":"2021-11-01T06:55:52.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.10.0","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.10.0","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.10.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.10.0/manifests"},{"name":"20.9.0","sha":"35d6a19dad02c5b9d4f700f3aaf9cbecb284cbb6","kind":"commit","published_at":"2021-10-23T10:21:54.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.9.0","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.9.0","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.9.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.9.0/manifests"},{"name":"20.8.1","sha":"433840821a5d2a2308eb84a53bac95efdfacbe7c","kind":"commit","published_at":"2021-09-24T09:57:51.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.8.1","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.8.1","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.8.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.8.1/manifests"},{"name":"20.8.0","sha":"c54c7efe172adb206c75cc1499cf8625b19064e8","kind":"commit","published_at":"2021-09-16T12:14:25.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.8.0","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.8.0","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.8.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.8.0/manifests"},{"name":"20.7.2","sha":"7bf206e86d06cd77f85981117834ad7b223c0b16","kind":"commit","published_at":"2021-08-10T22:15:17.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.7.2","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.7.2","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.7.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.7.2/manifests"},{"name":"20.7.1","sha":"7f465469060ebffe02ca54f4a6f5e0f1d58761d2","kind":"commit","published_at":"2021-08-09T12:56:09.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.7.1","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.7.1","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.7.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.7.1/manifests"},{"name":"20.7.0","sha":"f418ffb69578cf607223919d71cd17305347ee03","kind":"commit","published_at":"2021-07-31T12:08:54.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.7.0","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.7.0","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.7.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.7.0/manifests"},{"name":"16.7.12","sha":"fdfec65ff031997503fb409f365ee3aeb4c2c89f","kind":"commit","published_at":"2021-07-22T07:31:27.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/16.7.12","html_url":"https://github.com/pypa/virtualenv/releases/tag/16.7.12","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/16.7.12","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/16.7.12/manifests"},{"name":"16.7.11","sha":"7d3c85146f95dc828396bc4e38308ea738c15665","kind":"commit","published_at":"2021-07-20T22:54:05.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/16.7.11","html_url":"https://github.com/pypa/virtualenv/releases/tag/16.7.11","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/16.7.11","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/16.7.11/manifests"},{"name":"20.6.0","sha":"75f020242a400e219367636d9d33d8f00f8e05f5","kind":"commit","published_at":"2021-07-14T16:45:52.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.6.0","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.6.0","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.6.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.6.0/manifests"},{"name":"20.5.0","sha":"ca0d409623b7b31123149cba8304210e9442e946","kind":"commit","published_at":"2021-07-13T10:49:16.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.5.0","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.5.0","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.5.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.5.0/manifests"},{"name":"20.4.7","sha":"a144c3cec99349985f448ed01b256421ab5995b6","kind":"commit","published_at":"2021-05-24T17:39:05.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.4.7","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.4.7","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.4.7","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.4.7/manifests"},{"name":"20.4.6","sha":"190ea80bc142e2c16356accd2840ceea1a268355","kind":"commit","published_at":"2021-05-05T17:27:56.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.4.6","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.4.6","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.4.6","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.4.6/manifests"},{"name":"20.4.5","sha":"6c8d4369fe7d178e02c9c056fd06cd6ec0a3b57f","kind":"commit","published_at":"2021-05-05T07:53:14.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.4.5","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.4.5","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.4.5","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.4.5/manifests"},{"name":"20.4.4","sha":"2a30e67b1572c2a7f0ffe4748d8e64d6d09708c4","kind":"commit","published_at":"2021-04-20T08:56:59.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.4.4","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.4.4","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.4.4","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.4.4/manifests"},{"name":"20.4.3","sha":"39911d5d4167882e56ee926bc7390d43d2c21d9c","kind":"commit","published_at":"2021-03-16T10:54:59.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.4.3","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.4.3","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.4.3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.4.3/manifests"},{"name":"20.4.2","sha":"325e95eee6411bc1d24d9dc66b16ae163e88458e","kind":"commit","published_at":"2021-02-01T07:38:55.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.4.2","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.4.2","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.4.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.4.2/manifests"},{"name":"20.4.1","sha":"61b2f6f1085ff590631cdbe4a3cb1f924751aac7","kind":"commit","published_at":"2021-01-31T09:49:39.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.4.1","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.4.1","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.4.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.4.1/manifests"},{"name":"20.4.0","sha":"d47e0a520e19b56db67597259633d7cfdd65d071","kind":"commit","published_at":"2021-01-19T08:31:35.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.4.0","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.4.0","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.4.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.4.0/manifests"},{"name":"20.3.1","sha":"395696dace669b3880cb686172d055717d80f3e7","kind":"commit","published_at":"2021-01-13T06:49:21.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.3.1","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.3.1","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.3.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.3.1/manifests"},{"name":"20.3.0","sha":"a4025d673c2db418379ce2a1d99398e12db8fb74","kind":"commit","published_at":"2021-01-10T12:24:09.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.3.0","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.3.0","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.3.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.3.0/manifests"},{"name":"20.2.2","sha":"b4607d1954170e27a308438517e01ffe535c709a","kind":"commit","published_at":"2020-12-07T10:30:25.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.2.2","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.2.2","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.2.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.2.2/manifests"},{"name":"20.2.1","sha":"e8041cf53c8fbb3e6559753ce89c709c44c24129","kind":"commit","published_at":"2020-11-23T10:55:32.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.2.1","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.2.1","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.2.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.2.1/manifests"},{"name":"20.2.0","sha":"e6f7485dd9f196e547d6d701f56ad87fc7faf65f","kind":"commit","published_at":"2020-11-21T11:43:08.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.2.0","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.2.0","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.2.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.2.0/manifests"},{"name":"20.1.0","sha":"d4c9a0e038e8d211e108c768f8f8c265b67d3ae4","kind":"commit","published_at":"2020-10-25T08:47:18.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.1.0","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.1.0","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.1.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.1.0/manifests"},{"name":"20.0.35","sha":"da1c6a3541817dbafeed9efc37129f7284f05a98","kind":"commit","published_at":"2020-10-15T12:11:17.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.0.35","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.0.35","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.35","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.35/manifests"},{"name":"20.0.34","sha":"15583b29c4992d061df3f85d00d66d13aec9a737","kind":"commit","published_at":"2020-10-12T12:00:44.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.0.34","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.0.34","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.34","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.34/manifests"},{"name":"20.0.33","sha":"7fab0679a4e46e181fb182c2992012a2bc1221ba","kind":"commit","published_at":"2020-10-04T17:20:35.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.0.33","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.0.33","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.33","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.33/manifests"},{"name":"20.0.32","sha":"368f830bbb5fe4ecc7c24aed9b9d1f99620c3982","kind":"commit","published_at":"2020-10-02T00:23:27.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.0.32","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.0.32","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.32","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.32/manifests"},{"name":"20.0.31","sha":"1dc5ebe1753b8351950c98ddda06274304f303a8","kind":"commit","published_at":"2020-08-17T09:38:43.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.0.31","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.0.31","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.31","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.31/manifests"},{"name":"20.0.30","sha":"2b6cc55b23634457235f51e009b9fd6ba6f86e7e","kind":"commit","published_at":"2020-08-04T17:02:20.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.0.30","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.0.30","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.30","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.30/manifests"},{"name":"20.0.29","sha":"283bfae5810037b7efb2d11c25f23624d79cf530","kind":"commit","published_at":"2020-07-31T16:20:38.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.0.29","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.0.29","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.29","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.29/manifests"},{"name":"20.0.28","sha":"09c4f084760ed5bbd83f12856042c3fc8a922dad","kind":"commit","published_at":"2020-07-24T06:43:21.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.0.28","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.0.28","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.28","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.28/manifests"},{"name":"20.0.27","sha":"bf79e0f2e232feb29c73af121205c6c885591968","kind":"commit","published_at":"2020-07-15T14:29:22.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.0.27","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.0.27","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.27","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.27/manifests"},{"name":"20.0.26","sha":"6e0bbcedb51736eb3fba260bc29af07e3219e1d9","kind":"commit","published_at":"2020-07-07T15:34:40.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.0.26","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.0.26","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.26","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.26/manifests"},{"name":"20.0.25","sha":"6e3fa99effcf29f0890b8e16704d4dc1c8f43352","kind":"commit","published_at":"2020-06-23T17:20:15.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.0.25","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.0.25","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.25","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.25/manifests"},{"name":"20.0.24","sha":"c5e9c9e5e9e2130d91195c473b505403ef590922","kind":"commit","published_at":"2020-06-22T08:40:52.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.0.24","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.0.24","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.24","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.24/manifests"},{"name":"20.0.23","sha":"1313b9d2406dcce8adc9c4233594aaa398e03ec6","kind":"commit","published_at":"2020-06-12T19:09:43.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.0.23","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.0.23","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.23","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.23/manifests"},{"name":"20.0.22","sha":"4b8153de435aba9067bd1fa93d7aa45783e34aca","kind":"commit","published_at":"2020-06-12T18:17:34.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.0.22","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.0.22","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.22","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.22/manifests"},{"name":"20.0.21","sha":"64ca39f68c7070043dfd1b98017763d0d5622402","kind":"commit","published_at":"2020-05-20T08:05:02.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.0.21","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.0.21","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.21","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.21/manifests"},{"name":"20.0.20","sha":"768468e462173fb4e4f0b4aac61c040bd1f457c3","kind":"commit","published_at":"2020-05-04T08:46:58.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.0.20","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.0.20","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.20","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.20/manifests"},{"name":"20.0.19","sha":"1338f7cccdbc229f7a20d2c71bf7d82474cf5477","kind":"commit","published_at":"2020-05-03T12:43:55.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.0.19","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.0.19","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.19","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.19/manifests"},{"name":"20.0.18","sha":"2b4f4d75247d3248d4ccdbb3b8f77f192d70b6e8","kind":"commit","published_at":"2020-04-16T15:36:53.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.0.18","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.0.18","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.18","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.18/manifests"},{"name":"20.0.17","sha":"4c2ea2397dc2d75870034bd07a2e30cf3e044a89","kind":"commit","published_at":"2020-04-09T17:38:52.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.0.17","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.0.17","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.17","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.17/manifests"},{"name":"20.0.16","sha":"c0fb95a4b26dd97e6bcec0f4c0c8f46f17651f28","kind":"commit","published_at":"2020-04-04T08:40:18.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.0.16","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.0.16","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.16","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.16/manifests"},{"name":"20.0.15","sha":"e1ced9bc65930f137cf6b90887ae47246abf517c","kind":"commit","published_at":"2020-03-27T10:05:30.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.0.15","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.0.15","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.15","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.15/manifests"},{"name":"20.0.14","sha":"37cd7981650262fa0a082e693134da1a59816e4a","kind":"commit","published_at":"2020-03-25T09:29:40.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.0.14","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.0.14","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.14","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.14/manifests"},{"name":"20.0.13","sha":"8e4f5b6842f54fac5d7f53a16dcf17aa4e8bfb9c","kind":"commit","published_at":"2020-03-19T19:01:58.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.0.13","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.0.13","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.13","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.13/manifests"},{"name":"20.0.12","sha":"0027a3ddf5017d18f3b28c29e39b008b5141af31","kind":"commit","published_at":"2020-03-19T11:52:16.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.0.12","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.0.12","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.12","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.12/manifests"},{"name":"20.0.11","sha":"5b7a4e2533a60a4fab1bd30ec242bc8cc09c11c9","kind":"commit","published_at":"2020-03-18T19:25:58.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.0.11","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.0.11","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.11","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.11/manifests"},{"name":"20.0.10","sha":"206018051e7793636430d9a092183b9e40b0bac2","kind":"commit","published_at":"2020-03-10T11:22:21.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.0.10","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.0.10","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.10","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.10/manifests"},{"name":"20.0.9","sha":"f4dd9d75e32ca61d3071ca8b3831d624794c1287","kind":"commit","published_at":"2020-03-08T10:15:53.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.0.9","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.0.9","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.9","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.9/manifests"},{"name":"20.0.8","sha":"b4039a2a6c09d54b99168da06a11da3926cb20a0","kind":"commit","published_at":"2020-03-04T16:24:43.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.0.8","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.0.8","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.8","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.8/manifests"},{"name":"20.0.7","sha":"365c6a5300393055007efd29ec4488fa28a45526","kind":"commit","published_at":"2020-02-26T15:36:07.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.0.7","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.0.7","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.7","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.7/manifests"},{"name":"20.0.6","sha":"21ba7aa7ee7bd7396a223a387279f8d4bb514c72","kind":"commit","published_at":"2020-02-26T10:43:50.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.0.6","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.0.6","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.6","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.6/manifests"},{"name":"16.7.10","sha":"941d218accf5e8b5672b3c528a73f7d5e2aa18bb","kind":"commit","published_at":"2020-02-24T18:17:48.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/16.7.10","html_url":"https://github.com/pypa/virtualenv/releases/tag/16.7.10","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/16.7.10","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/16.7.10/manifests"},{"name":"20.0.5","sha":"3f19b6dc775af5cac0210cc7aa3ec743404a4312","kind":"commit","published_at":"2020-02-21T16:14:22.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.0.5","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.0.5","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.5","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.5/manifests"},{"name":"20.0.4","sha":"9fc6cc1bf64fd8c047e2c0f409711910076a688b","kind":"commit","published_at":"2020-02-14T10:01:17.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.0.4","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.0.4","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.4","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.4/manifests"},{"name":"20.0.3","sha":"c511998e64d5d7cf2587074726cff1119fa85f1d","kind":"commit","published_at":"2020-02-12T13:50:43.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.0.3","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.0.3","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.3/manifests"},{"name":"20.0.2","sha":"ab6dd74b4b718d649fde91b8a75de293d557f3e3","kind":"commit","published_at":"2020-02-11T17:52:00.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.0.2","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.0.2","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.2/manifests"},{"name":"20.0.1","sha":"17363d5bc520df42d6b3311e5d438f1c2df2a1f5","kind":"commit","published_at":"2020-02-10T15:24:02.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.0.1","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.0.1","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.1/manifests"},{"name":"20.0.0","sha":"0c020c69c6729350ba27fea094f36ad4e847731e","kind":"commit","published_at":"2020-02-10T09:23:18.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.0.0","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.0.0","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.0/manifests"},{"name":"20.0.0b2","sha":"8be186a1155dc353f872b9cd227ab0edf58978b9","kind":"commit","published_at":"2020-02-04T16:40:05.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.0.0b2","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.0.0b2","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.0b2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.0b2/manifests"},{"name":"20.0.0b1","sha":"599907870e9a501224cf603af863c712e581c752","kind":"commit","published_at":"2020-01-28T11:34:40.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/20.0.0b1","html_url":"https://github.com/pypa/virtualenv/releases/tag/20.0.0b1","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.0b1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/20.0.0b1/manifests"},{"name":"16.7.9","sha":"34c62baef8e3ef47d693ce0d6a7035969878db48","kind":"commit","published_at":"2019-12-15T19:24:24.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/16.7.9","html_url":"https://github.com/pypa/virtualenv/releases/tag/16.7.9","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/16.7.9","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/16.7.9/manifests"},{"name":"16.7.8","sha":"c85afa57db531355aaa17977729528f0f9326887","kind":"commit","published_at":"2019-11-22T19:16:26.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/16.7.8","html_url":"https://github.com/pypa/virtualenv/releases/tag/16.7.8","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/16.7.8","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/16.7.8/manifests"},{"name":"16.7.7","sha":"b83cc3a6497b54015290eba20c4423db3a23fd6c","kind":"commit","published_at":"2019-10-22T08:38:05.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/16.7.7","html_url":"https://github.com/pypa/virtualenv/releases/tag/16.7.7","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/16.7.7","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/16.7.7/manifests"},{"name":"16.7.6","sha":"2e962ee0b961f8f146fe90def713d51c6f79d543","kind":"commit","published_at":"2019-10-16T09:05:55.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/16.7.6","html_url":"https://github.com/pypa/virtualenv/releases/tag/16.7.6","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/16.7.6","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/16.7.6/manifests"},{"name":"16.7.5","sha":"894c1b000ea5182a4b49f2bf4983b5828ce23207","kind":"commit","published_at":"2019-09-03T16:32:54.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/16.7.5","html_url":"https://github.com/pypa/virtualenv/releases/tag/16.7.5","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/16.7.5","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/16.7.5/manifests"},{"name":"16.7.4","sha":"65cb1fe3b1aa68969bef168d64fd6f1c4a4c934d","kind":"commit","published_at":"2019-08-23T08:36:28.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/16.7.4","html_url":"https://github.com/pypa/virtualenv/releases/tag/16.7.4","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/16.7.4","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/16.7.4/manifests"},{"name":"16.7.3","sha":"7c70dd4714f06296ddb3f7ed4a919e1816ce00f3","kind":"commit","published_at":"2019-08-16T08:11:33.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/16.7.3","html_url":"https://github.com/pypa/virtualenv/releases/tag/16.7.3","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/16.7.3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/16.7.3/manifests"},{"name":"16.7.2","sha":"d1fd6945dc88a36ee0fb87c4ebec76395ad3e9ad","kind":"commit","published_at":"2019-07-26T09:03:54.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/16.7.2","html_url":"https://github.com/pypa/virtualenv/releases/tag/16.7.2","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/16.7.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/16.7.2/manifests"},{"name":"16.7.1","sha":"6108f101308a6b667f863d4754e9f8386ba9b1eb","kind":"commit","published_at":"2019-07-25T10:57:39.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/16.7.1","html_url":"https://github.com/pypa/virtualenv/releases/tag/16.7.1","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/16.7.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/16.7.1/manifests"},{"name":"16.7.0","sha":"bd8e36308bcff5862cea04c19664161ddde57750","kind":"commit","published_at":"2019-07-23T15:29:32.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/16.7.0","html_url":"https://github.com/pypa/virtualenv/releases/tag/16.7.0","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/16.7.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/16.7.0/manifests"},{"name":"16.6.2","sha":"fa4000383d77d4a2da925f4094d7830ad9ac5533","kind":"commit","published_at":"2019-07-14T21:16:44.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/16.6.2","html_url":"https://github.com/pypa/virtualenv/releases/tag/16.6.2","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/16.6.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/16.6.2/manifests"},{"name":"16.1.2","sha":"9e1c57f7ad1f75a9b7c39092a7248f9dab51cbec","kind":"commit","published_at":"2019-07-14T21:14:25.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/16.1.2","html_url":"https://github.com/pypa/virtualenv/releases/tag/16.1.2","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/16.1.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/16.1.2/manifests"},{"name":"16.6.1","sha":"ce9343cb91926cdc32431fcf2770b613c89739ff","kind":"commit","published_at":"2019-06-16T13:02:25.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/16.6.1","html_url":"https://github.com/pypa/virtualenv/releases/tag/16.6.1","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/16.6.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/16.6.1/manifests"},{"name":"16.6.0","sha":"8cd725480ad25f2c444c9ad0f88a0d0279b8f3e0","kind":"commit","published_at":"2019-05-15T09:07:11.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/16.6.0","html_url":"https://github.com/pypa/virtualenv/releases/tag/16.6.0","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/16.6.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/16.6.0/manifests"},{"name":"16.5.0","sha":"debbaa4ff2712167006f21d978267968c2191d2b","kind":"commit","published_at":"2019-04-24T09:47:39.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/16.5.0","html_url":"https://github.com/pypa/virtualenv/releases/tag/16.5.0","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/16.5.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/16.5.0/manifests"},{"name":"16.4.3","sha":"3272f7b50c1bb83caeee3b0597de2ff321244386","kind":"commit","published_at":"2019-02-28T22:01:52.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/16.4.3","html_url":"https://github.com/pypa/virtualenv/releases/tag/16.4.3","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/16.4.3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/16.4.3/manifests"},{"name":"16.4.0","sha":"bc1d76dadbc716951cb62c378331bc98ff96fd5e","kind":"commit","published_at":"2019-02-22T15:05:18.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/16.4.0","html_url":"https://github.com/pypa/virtualenv/releases/tag/16.4.0","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/16.4.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/16.4.0/manifests"},{"name":"16.4.1","sha":"be34ae044174b3fc401dd8245de982c7307dc4fe","kind":"commit","published_at":"2019-02-22T14:15:50.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/16.4.1","html_url":"https://github.com/pypa/virtualenv/releases/tag/16.4.1","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/16.4.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/16.4.1/manifests"},{"name":"16.3.0","sha":"591282f224d5d128f4452a319e0ed9a3bcb058c1","kind":"commit","published_at":"2019-01-25T14:35:24.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/16.3.0","html_url":"https://github.com/pypa/virtualenv/releases/tag/16.3.0","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/16.3.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/16.3.0/manifests"},{"name":"16.2.0","sha":"d5fed2304992a85b378e31b5cf26ce957b324976","kind":"commit","published_at":"2018-12-31T20:05:52.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/16.2.0","html_url":"https://github.com/pypa/virtualenv/releases/tag/16.2.0","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/16.2.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/16.2.0/manifests"},{"name":"16.1.0","sha":"4ad2742eec5266c2e42b0651d1cd4b78393699c4","kind":"commit","published_at":"2018-10-31T15:06:44.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/16.1.0","html_url":"https://github.com/pypa/virtualenv/releases/tag/16.1.0","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/16.1.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/16.1.0/manifests"},{"name":"16.0.0","sha":"7a9a89890a4e0aa22389e647cf867f0d1b4bf65e","kind":"tag","published_at":"2018-05-16T23:34:42.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/16.0.0","html_url":"https://github.com/pypa/virtualenv/releases/tag/16.0.0","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/16.0.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/16.0.0/manifests"},{"name":"15.2.0","sha":"61255cf0397a7d5f73e1f070a3d32ed620c63780","kind":"commit","published_at":"2018-03-22T02:25:17.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/15.2.0","html_url":"https://github.com/pypa/virtualenv/releases/tag/15.2.0","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/15.2.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/15.2.0/manifests"},{"name":"15.1.0","sha":"2db288fe1f8b6755f8df53b8a8a0667a0f71b1cf","kind":"tag","published_at":"2016-11-16T02:36:08.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/15.1.0","html_url":"https://github.com/pypa/virtualenv/releases/tag/15.1.0","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/15.1.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/15.1.0/manifests"},{"name":"15.0.3","sha":"aab34a1e059d6586419cca2f912f4297c1a4a660","kind":"tag","published_at":"2016-08-05T12:36:04.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/15.0.3","html_url":"https://github.com/pypa/virtualenv/releases/tag/15.0.3","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/15.0.3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/15.0.3/manifests"},{"name":"15.0.2","sha":"57b2953631760dc76b9ffce856ba0ad17ee69c49","kind":"tag","published_at":"2016-05-28T19:19:51.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/15.0.2","html_url":"https://github.com/pypa/virtualenv/releases/tag/15.0.2","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/15.0.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/15.0.2/manifests"},{"name":"15.0.1","sha":"e7243400fb3022be6a13daa8069e1e6307a7057e","kind":"tag","published_at":"2016-03-17T15:15:03.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/15.0.1","html_url":"https://github.com/pypa/virtualenv/releases/tag/15.0.1","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/15.0.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/15.0.1/manifests"},{"name":"15.0.0","sha":"388081d7fc615cd4b4bf87ab635173c50b86637f","kind":"tag","published_at":"2016-03-06T01:14:00.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/15.0.0","html_url":"https://github.com/pypa/virtualenv/releases/tag/15.0.0","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/15.0.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/15.0.0/manifests"},{"name":"14.0.6","sha":"fd5d16bb8dcb2024debe5e88b9b60a04ff39a3b8","kind":"tag","published_at":"2016-02-07T19:43:54.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/14.0.6","html_url":"https://github.com/pypa/virtualenv/releases/tag/14.0.6","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/14.0.6","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/14.0.6/manifests"},{"name":"14.0.5","sha":"171734bbb59a809c006aa760fb386465759a5bf1","kind":"tag","published_at":"2016-02-01T07:07:51.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/14.0.5","html_url":"https://github.com/pypa/virtualenv/releases/tag/14.0.5","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/14.0.5","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/14.0.5/manifests"},{"name":"14.0.4","sha":"4aeb4f40fff73e2462400f42a11cd82870ec4f54","kind":"tag","published_at":"2016-01-31T21:59:52.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/14.0.4","html_url":"https://github.com/pypa/virtualenv/releases/tag/14.0.4","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/14.0.4","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/14.0.4/manifests"},{"name":"14.0.3","sha":"30d13567ca09ad2546e99afaaa7a21d87fba2d48","kind":"tag","published_at":"2016-01-28T18:49:23.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/14.0.3","html_url":"https://github.com/pypa/virtualenv/releases/tag/14.0.3","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/14.0.3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/14.0.3/manifests"},{"name":"14.0.2","sha":"a9b13e9288bba1ed7850634c59d2cf0f45d2cd58","kind":"tag","published_at":"2016-01-28T12:35:52.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/14.0.2","html_url":"https://github.com/pypa/virtualenv/releases/tag/14.0.2","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/14.0.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/14.0.2/manifests"},{"name":"14.0.1","sha":"2fd5f65f464ae6da8f5d5da0980c64b101a71957","kind":"tag","published_at":"2016-01-22T00:48:41.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/14.0.1","html_url":"https://github.com/pypa/virtualenv/releases/tag/14.0.1","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/14.0.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/14.0.1/manifests"},{"name":"14.0.0","sha":"4ac44d2a1508e86d78e06fa158373e723f3b4dcb","kind":"tag","published_at":"2016-01-20T00:55:39.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/14.0.0","html_url":"https://github.com/pypa/virtualenv/releases/tag/14.0.0","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/14.0.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/14.0.0/manifests"},{"name":"13.1.2","sha":"134c9a6c67081cda67befd61bae68a999ed00f48","kind":"tag","published_at":"2015-08-22T22:55:58.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/13.1.2","html_url":"https://github.com/pypa/virtualenv/releases/tag/13.1.2","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/13.1.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/13.1.2/manifests"},{"name":"13.1.1","sha":"813e136c28ce2135a435d0e5eb1e5104a5d8c0c2","kind":"tag","published_at":"2015-08-20T22:08:41.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/13.1.1","html_url":"https://github.com/pypa/virtualenv/releases/tag/13.1.1","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/13.1.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/13.1.1/manifests"},{"name":"13.1.0","sha":"a9b4e673559a5beb24bac1a8fb81446dd84ec6ed","kind":"tag","published_at":"2015-07-01T00:31:48.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/13.1.0","html_url":"https://github.com/pypa/virtualenv/releases/tag/13.1.0","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/13.1.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/13.1.0/manifests"},{"name":"13.0.3","sha":"f330de3d757a63e6f9b79101ef73364c86345b32","kind":"tag","published_at":"2015-06-02T01:37:56.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/13.0.3","html_url":"https://github.com/pypa/virtualenv/releases/tag/13.0.3","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/13.0.3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/13.0.3/manifests"},{"name":"13.0.2","sha":"3a9f63f32ab6a96c013a05e2a3ed63fe95e04c75","kind":"tag","published_at":"2015-06-02T00:43:32.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/13.0.2","html_url":"https://github.com/pypa/virtualenv/releases/tag/13.0.2","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/13.0.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/13.0.2/manifests"},{"name":"13.0.1","sha":"dac316c13d6bfdc8acd241147708488aaddd3a99","kind":"tag","published_at":"2015-05-23T00:46:53.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/13.0.1","html_url":"https://github.com/pypa/virtualenv/releases/tag/13.0.1","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/13.0.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/13.0.1/manifests"},{"name":"13.0.0","sha":"f07c175204647f95a89a5fd66c0c87a522c02cfa","kind":"tag","published_at":"2015-05-22T04:05:13.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/13.0.0","html_url":"https://github.com/pypa/virtualenv/releases/tag/13.0.0","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/13.0.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/13.0.0/manifests"},{"name":"12.1.1","sha":"bf843d4c3163d8e6ed48945c5b360d4c756984c8","kind":"tag","published_at":"2015-04-07T11:05:01.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/12.1.1","html_url":"https://github.com/pypa/virtualenv/releases/tag/12.1.1","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/12.1.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/12.1.1/manifests"},{"name":"12.1.0","sha":"7c0f5d076870bdbc1f938aeec27708afb77fa575","kind":"tag","published_at":"2015-04-07T05:19:46.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/12.1.0","html_url":"https://github.com/pypa/virtualenv/releases/tag/12.1.0","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/12.1.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/12.1.0/manifests"},{"name":"12.0.7","sha":"a12d05af27ae092e49270e416b3beb69fa0acb54","kind":"tag","published_at":"2015-02-05T02:48:03.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/12.0.7","html_url":"https://github.com/pypa/virtualenv/releases/tag/12.0.7","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/12.0.7","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/12.0.7/manifests"},{"name":"12.0.6","sha":"b789e821e77b6e4f41ee777b5cc823c5d0676661","kind":"tag","published_at":"2015-01-28T22:41:40.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/12.0.6","html_url":"https://github.com/pypa/virtualenv/releases/tag/12.0.6","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/12.0.6","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/12.0.6/manifests"},{"name":"12.0.5","sha":"9205ff46a67130e8835f14bb4f802fd59e7dcf2c","kind":"tag","published_at":"2015-01-03T09:42:51.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/12.0.5","html_url":"https://github.com/pypa/virtualenv/releases/tag/12.0.5","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/12.0.5","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/12.0.5/manifests"},{"name":"12.0.4","sha":"ecf572da011aa0d3a1c96e840e72069e49f26bf6","kind":"tag","published_at":"2014-12-24T02:57:50.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/12.0.4","html_url":"https://github.com/pypa/virtualenv/releases/tag/12.0.4","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/12.0.4","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/12.0.4/manifests"},{"name":"12.0.3","sha":"a331207e2efef23b663dcfff409c144f60ab1272","kind":"tag","published_at":"2014-12-24T01:29:17.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/12.0.3","html_url":"https://github.com/pypa/virtualenv/releases/tag/12.0.3","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/12.0.3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/12.0.3/manifests"},{"name":"12.0.2","sha":"cd3b9c94126b11338538b64185e45fe7cb00ad69","kind":"tag","published_at":"2014-12-23T13:22:28.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/12.0.2","html_url":"https://github.com/pypa/virtualenv/releases/tag/12.0.2","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/12.0.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/12.0.2/manifests"},{"name":"12.0.1","sha":"84b0e7be5222a267952c8b5c1d2c5643a96e7493","kind":"tag","published_at":"2014-12-22T23:22:45.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/12.0.1","html_url":"https://github.com/pypa/virtualenv/releases/tag/12.0.1","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/12.0.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/12.0.1/manifests"},{"name":"12.0","sha":"4243b272823228dde5d18a7400c404ce52fb4cea","kind":"tag","published_at":"2014-12-22T18:08:58.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/12.0","html_url":"https://github.com/pypa/virtualenv/releases/tag/12.0","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/12.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/12.0/manifests"},{"name":"1.11.6","sha":"93cfa83481a1cb934eb14c946d33aef94c21bcb0","kind":"tag","published_at":"2014-05-17T02:39:02.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.11.6","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.11.6","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.11.6","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.11.6/manifests"},{"name":"1.11.5","sha":"ce04baeb1eedc86710aa87c129fc3391a21cd244","kind":"tag","published_at":"2014-05-03T06:23:25.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.11.5","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.11.5","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.11.5","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.11.5/manifests"},{"name":"1.11.4","sha":"6dc9b1d376b041d83472c03c1ef334919a3b7c12","kind":"tag","published_at":"2014-02-21T12:16:20.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.11.4","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.11.4","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.11.4","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.11.4/manifests"},{"name":"1.11.3","sha":"b0f05ea36cba51bf88562d043bedc9e742b6c387","kind":"tag","published_at":"2014-02-21T00:56:27.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.11.3","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.11.3","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.11.3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.11.3/manifests"},{"name":"1.11.2","sha":"71d3a9e0cbfc0f7d04114c7b60467af45f38c535","kind":"tag","published_at":"2014-01-26T05:08:24.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.11.2","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.11.2","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.11.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.11.2/manifests"},{"name":"1.11.1","sha":"ef04aed9da6112c956888440dfb25e16461a1249","kind":"tag","published_at":"2014-01-21T03:41:36.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.11.1","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.11.1","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.11.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.11.1/manifests"},{"name":"1.11.1rc2","sha":"b9a7f0bb1927188b4ee6203eed06be3d6f22e68a","kind":"tag","published_at":"2014-01-17T01:32:04.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.11.1rc2","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.11.1rc2","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.11.1rc2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.11.1rc2/manifests"},{"name":"1.11.1rc1","sha":"7bee487b3ed22a1f9b72a5cbc656bd95cc3a2a81","kind":"tag","published_at":"2014-01-07T23:11:08.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.11.1rc1","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.11.1rc1","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.11.1rc1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.11.1rc1/manifests"},{"name":"1.11","sha":"dc004f6f1e3a96bcfdaf6b6721ee517dfeb80859","kind":"tag","published_at":"2014-01-02T13:38:20.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.11","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.11","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.11","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.11/manifests"},{"name":"1.11rc4","sha":"2df2d1903a354d279f91d1670e3274e3e0d603d7","kind":"tag","published_at":"2013-12-31T11:45:35.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.11rc4","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.11rc4","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.11rc4","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.11rc4/manifests"},{"name":"1.11rc3","sha":"825abe6007f6557249b3489394b0adbdc0be39ca","kind":"tag","published_at":"2013-12-27T06:55:03.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.11rc3","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.11rc3","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.11rc3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.11rc3/manifests"},{"name":"1.11rc2","sha":"e0177e23971a6f9b9e95ca918893d39e3ee2b5b0","kind":"tag","published_at":"2013-12-20T23:37:28.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.11rc2","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.11rc2","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.11rc2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.11rc2/manifests"},{"name":"1.11rc1","sha":"4ac9b7c838d9e1b956f7780dd703a2a81bbad51d","kind":"tag","published_at":"2013-11-22T06:13:25.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.11rc1","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.11rc1","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.11rc1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.11rc1/manifests"},{"name":"1.10.1","sha":"b8e43e724112ef26bd057df296cc66baabe2e032","kind":"tag","published_at":"2013-08-08T01:05:41.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.10.1","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.10.1","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.10.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.10.1/manifests"},{"name":"1.10","sha":"a35d13d4ec2c787083c00f59ec6cd5be21992560","kind":"tag","published_at":"2013-07-23T21:05:22.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.10","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.10","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.10","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.10/manifests"},{"name":"1.10rc10","sha":"7c07213acdde83d7f5d357e57fcd007dcc5b07c0","kind":"commit","published_at":"2013-07-22T22:19:47.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.10rc10","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.10rc10","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.10rc10","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.10rc10/manifests"},{"name":"1.10rc9","sha":"8b1084530228b24921efc0659a9a01eb0b1d3a2c","kind":"commit","published_at":"2013-07-22T16:09:33.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.10rc9","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.10rc9","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.10rc9","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.10rc9/manifests"},{"name":"1.10rc8","sha":"988125041c6bffc0043abef7e7f7c85fe60314a1","kind":"commit","published_at":"2013-07-16T04:13:44.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.10rc8","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.10rc8","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.10rc8","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.10rc8/manifests"},{"name":"1.10rc7","sha":"5ee3055d781a76217da986f1e189dd83b2867cb5","kind":"commit","published_at":"2013-07-14T04:56:54.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.10rc7","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.10rc7","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.10rc7","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.10rc7/manifests"},{"name":"1.10rc6","sha":"2aeaa5fced88d17476be659c21aa8373e106fead","kind":"commit","published_at":"2013-07-13T23:48:34.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.10rc6","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.10rc6","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.10rc6","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.10rc6/manifests"},{"name":"1.10rc5","sha":"6c264808b7dd5031673f70598c93f872f8d79868","kind":"commit","published_at":"2013-07-13T23:19:14.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.10rc5","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.10rc5","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.10rc5","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.10rc5/manifests"},{"name":"1.10rc4","sha":"0371d8b29ebc1554a1830cfe5d41bfc1fade9180","kind":"commit","published_at":"2013-07-06T06:30:32.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.10rc4","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.10rc4","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.10rc4","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.10rc4/manifests"},{"name":"1.10rc3","sha":"d3c38a0b1acfc317c5a938a78cbe9fca0e9cce68","kind":"commit","published_at":"2013-07-03T04:38:35.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.10rc3","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.10rc3","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.10rc3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.10rc3/manifests"},{"name":"1.10rc2","sha":"ba5bce0649e610721e76807b067b4ef00197d770","kind":"commit","published_at":"2013-07-02T05:08:15.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.10rc2","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.10rc2","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.10rc2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.10rc2/manifests"},{"name":"1.10rc1","sha":"2365a439c5d6fbbb9ddc3fb1ae45577f736ae8f7","kind":"commit","published_at":"2013-06-30T06:13:59.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.10rc1","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.10rc1","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.10rc1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.10rc1/manifests"},{"name":"1.9.1","sha":"f731ddc882ede9b45ba9f0815ff68734784dbfcd","kind":"tag","published_at":"2013-03-07T23:14:25.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.9.1","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.9.1","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.9.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.9.1/manifests"},{"name":"1.9","sha":"69eb6f4f932d7479ca166e221177cbb8f13b7c84","kind":"tag","published_at":"2013-03-07T22:15:54.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.9","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.9","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.9","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.9/manifests"},{"name":"1.9rc2","sha":"95b6438012114f0dd2586eb76e7c7a8c9d50d4dd","kind":"commit","published_at":"2013-03-05T23:09:17.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.9rc2","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.9rc2","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.9rc2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.9rc2/manifests"},{"name":"1.9rc1","sha":"fec7804415a79bae319c9df64d0e1375d8f3212e","kind":"commit","published_at":"2013-02-22T06:47:20.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.9rc1","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.9rc1","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.9rc1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.9rc1/manifests"},{"name":"1.8.4","sha":"c4f53fe3320af97c45d6436430ded3f51067ab98","kind":"tag","published_at":"2012-11-25T17:13:07.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.8.4","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.8.4","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.8.4","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.8.4/manifests"},{"name":"1.8.3","sha":"70c2d9e7456f54f03a2268d9b093b6eba2bae932","kind":"tag","published_at":"2012-11-21T21:54:50.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.8.3","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.8.3","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.8.3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.8.3/manifests"},{"name":"1.8.2","sha":"239d5a9e79e10d59df0a2744e3f490d56f89c640","kind":"tag","published_at":"2012-09-06T08:36:57.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.8.2","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.8.2","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.8.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.8.2/manifests"},{"name":"1.8.1","sha":"14061f75db00dc2d1e6bd0baa9111d1f7064cddb","kind":"commit","published_at":"2012-09-03T08:03:49.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.8.1","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.8.1","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.8.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.8.1/manifests"},{"name":"1.8","sha":"119e624547128f6dd485a30238eaf9d1686baf89","kind":"commit","published_at":"2012-09-01T20:30:04.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.8","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.8","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.8","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.8/manifests"},{"name":"1.7.2","sha":"c80ab42b6d3a345d71c39c8bdab197015ad3ed4b","kind":"tag","published_at":"2012-06-22T16:39:47.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.7.2","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.7.2","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.7.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.7.2/manifests"},{"name":"1.7.1.2","sha":"1a3a9c099163126e9be49114ca57937d71777597","kind":"tag","published_at":"2012-02-17T09:58:52.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.7.1.2","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.7.1.2","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.7.1.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.7.1.2/manifests"},{"name":"1.7.1.1","sha":"389e806a5885a369aa91d701dfbc945e29a4cafb","kind":"tag","published_at":"2012-02-16T21:49:17.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.7.1.1","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.7.1.1","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.7.1.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.7.1.1/manifests"},{"name":"1.7.1","sha":"7c5e2af85f567c50e15ab65745327207f3b62e08","kind":"tag","published_at":"2012-02-16T20:46:38.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.7.1","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.7.1","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.7.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.7.1/manifests"},{"name":"1.7","sha":"1405b48b1d6347ed350e40f5cd5df96c0836eb9e","kind":"tag","published_at":"2011-11-30T11:54:46.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.7","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.7","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.7","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.7/manifests"},{"name":"1.6.4","sha":"b8a7db81c5a7db7a970240b0c13001203d831311","kind":"tag","published_at":"2011-07-21T16:51:58.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.6.4","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.6.4","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.6.4","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.6.4/manifests"},{"name":"1.6.3","sha":"12f7b05fc4f46f7d7018b40e2f31615e385e3bc0","kind":"tag","published_at":"2011-07-16T16:33:40.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.6.3","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.6.3","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.6.3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.6.3/manifests"},{"name":"1.6.2","sha":"f8038141962aa66116e5e37d250320579c7354a8","kind":"tag","published_at":"2011-07-16T15:07:45.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.6.2","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.6.2","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.6.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.6.2/manifests"},{"name":"1.6.1","sha":"53b7b5ac8bf4605a27ba5abfb97256a109949473","kind":"tag","published_at":"2011-04-30T22:44:23.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.6.1","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.6.1","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.6.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.6.1/manifests"},{"name":"1.6","sha":"70f442ffb31615f1b08c3ccc9d945032dc0a74d8","kind":"commit","published_at":"2011-04-04T17:56:15.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.6","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.6","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.6","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.6/manifests"},{"name":"1.5.2","sha":"7d8c636af36923752864e2fe5e52782972feb9c4","kind":"commit","published_at":"2011-03-12T20:26:54.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.5.2","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.5.2","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.5.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.5.2/manifests"},{"name":"1.5.1","sha":"dd1f55dc688ea6f15c05419ddb8b781157780f42","kind":"commit","published_at":"2010-09-19T22:37:10.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.5.1","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.5.1","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.5.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.5.1/manifests"},{"name":"1.5","sha":"56e5d05fb6b03f71b289a06e442da2d4a6103c2b","kind":"commit","published_at":"2010-09-14T16:46:46.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.5","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.5","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.5","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.5/manifests"},{"name":"1.4.9","sha":"bb589ad6f756ebc6a86d636ccbe4d1f9b4bd45ef","kind":"commit","published_at":"2010-05-27T21:59:23.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.4.9","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.4.9","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.4.9","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.4.9/manifests"},{"name":"1.4.8","sha":"35b8ff465735a59ced26bf01d139a043da85f6a8","kind":"commit","published_at":"2010-04-22T08:00:34.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.4.8","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.4.8","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.4.8","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.4.8/manifests"},{"name":"1.4.6","sha":"963821cad88fdc437bf025a6b56d9d8dde1615b0","kind":"commit","published_at":"2010-03-31T22:06:54.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.4.6","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.4.6","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.4.6","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.4.6/manifests"},{"name":"1.4.3","sha":"71924106a8df163d84db2353e48d2f2f5db8da0f","kind":"commit","published_at":"2009-11-20T16:36:29.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.4.3","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.4.3","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.4.3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.4.3/manifests"},{"name":"1.4.2","sha":"62303ce1f65f1526d2531878e99e99d14ef41bbf","kind":"commit","published_at":"2009-11-10T18:29:04.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.4.2","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.4.2","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.4.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.4.2/manifests"},{"name":"1.4.1","sha":"25c0f769524feaa840f10a04c5e9e101a729d17e","kind":"commit","published_at":"2009-11-10T15:28:23.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.4.1","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.4.1","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.4.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.4.1/manifests"},{"name":"1.4","sha":"27fa7e3a7860121ea5845bfb5b8db928ae343c67","kind":"commit","published_at":"2009-11-06T23:22:48.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.4","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.4","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.4","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.4/manifests"},{"name":"1.3.4","sha":"a620d0542d060746c6c9e4a73fc086ddabea7c73","kind":"commit","published_at":"2009-10-02T06:28:38.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.3.4","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.3.4","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.3.4","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.3.4/manifests"},{"name":"1.3.3","sha":"e312be179dcf54936866bb9715413d60d679af1c","kind":"commit","published_at":"2009-03-12T18:21:35.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.3.3","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.3.3","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.3.3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.3.3/manifests"},{"name":"1.3.2","sha":"669f6d1272653f750ca63c9e5ab20aeebc168f59","kind":"commit","published_at":"2008-12-17T23:26:34.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.3.2","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.3.2","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.3.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.3.2/manifests"},{"name":"1.3.1","sha":"87e6007800492c5806bdaf7313bca0315e58334a","kind":"commit","published_at":"2008-11-18T17:59:22.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.3.1","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.3.1","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.3.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.3.1/manifests"},{"name":"1.3","sha":"d67b140278b87bf0d3e7dc42a1dfedf80f7c8246","kind":"commit","published_at":"2008-09-24T21:15:19.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.3","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.3","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.3/manifests"},{"name":"1.2","sha":"f0be1b2acf8af3bd3b4792c470209aba77fccbf1","kind":"commit","published_at":"2008-08-29T16:23:24.000Z","download_url":"https://codeload.github.com/pypa/virtualenv/tar.gz/1.2","html_url":"https://github.com/pypa/virtualenv/releases/tag/1.2","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pypa%2Fvirtualenv/tags/1.2/manifests"}]},"repo_metadata_updated_at":"2024-01-04T14:24:39.561Z","dependent_packages_count":516,"downloads":197625578,"downloads_period":"last-month","dependent_repos_count":76779,"rankings":{"downloads":0.008620578972757136,"dependent_repos_count":0.016690908223848923,"dependent_packages_count":0.05209030698431972,"stargazers_count":1.5036490727375107,"forks_count":1.6470808335182785,"docker_downloads_count":0.015223575632741326,"average":0.5405592126782427},"purl":"pkg:pypi/virtualenv","advisories":[{"uuid":"GSA_kwCzR0hTQS0zamhjLXdqcWYtNWYyY84AAf0J","url":"https://github.com/advisories/GHSA-3jhc-wjqf-5f2c","title":"Virtualenv Allows Symlink Attack on /tmp/","description":"virtualenv.py in virtualenv before 1.5 allows local users to overwrite arbitrary files via a symlink attack on a certain file in /tmp/.","origin":"UNSPECIFIED","severity":"MODERATE","published_at":"2022-05-17T05:35:07.000Z","withdrawn_at":null,"classification":"GENERAL","cvss_score":6.9,"cvss_vector":"CVSS:4.0/AV:L/AC:L/AT:N/PR:N/UI:N/VC:N/VI:H/VA:N/SC:N/SI:N/SA:N","references":["https://nvd.nist.gov/vuln/detail/CVE-2011-4617","http://lists.fedoraproject.org/pipermail/package-announce/2012-January/071638.html","http://lists.fedoraproject.org/pipermail/package-announce/2012-January/071643.html","http://openwall.com/lists/oss-security/2011/12/19/2","http://openwall.com/lists/oss-security/2011/12/19/4","http://openwall.com/lists/oss-security/2011/12/19/5","https://github.com/pypa/virtualenv/commit/68075ad9ededf7df2c46d385f836c13b729de2ca","https://web.archive.org/web/20200228151935/https://bitbucket.org/ianb/virtualenv/commits/8be37c509fe5","https://bitbucket.org/ianb/virtualenv/changeset/8be37c509fe5","https://github.com/pypa/advisory-database/tree/main/vulns/virtualenv/PYSEC-2011-23.yaml","https://github.com/advisories/GHSA-3jhc-wjqf-5f2c"],"source_kind":"github","identifiers":["GHSA-3jhc-wjqf-5f2c","CVE-2011-4617"],"repository_url":"https://github.com/pypa/virtualenv","blast_radius":33.7081729146288,"packages":[{"versions":[{"first_patched_version":"1.5","vulnerable_version_range":"\u003c 1.5"}],"ecosystem":"pypi","package_name":"virtualenv"}],"created_at":"2024-01-19T18:06:24.433Z","updated_at":"2024-11-18T23:01:51.000Z","epss_percentage":0.00051,"epss_percentile":0.15836},{"uuid":"GSA_kwCzR0hTQS1ycWM0LTJoYzctOGM4ds4ABBuF","url":"https://github.com/advisories/GHSA-rqc4-2hc7-8c8v","title":"virtualenv allows command injection through activation scripts for a virtual environment","description":"virtualenv before 20.26.6 allows command injection through the activation scripts for a virtual environment. Magic template strings are not quoted correctly when replacing. NOTE: this is not the same as CVE-2024-9287.","origin":"UNSPECIFIED","severity":"HIGH","published_at":"2024-11-24T18:31:39.000Z","withdrawn_at":null,"classification":"GENERAL","cvss_score":0.0,"cvss_vector":null,"references":["https://nvd.nist.gov/vuln/detail/CVE-2024-53899","https://github.com/pypa/virtualenv/issues/2768","https://github.com/pypa/virtualenv/pull/2771","https://github.com/pypa/virtualenv/releases/tag/20.26.6","https://github.com/pypa/advisory-database/tree/main/vulns/virtualenv/PYSEC-2024-187.yaml","https://github.com/advisories/GHSA-rqc4-2hc7-8c8v"],"source_kind":"github","identifiers":["GHSA-rqc4-2hc7-8c8v","CVE-2024-53899"],"repository_url":"https://github.com/pypa/virtualenv","blast_radius":0.0,"packages":[{"versions":[{"first_patched_version":"20.26.6","vulnerable_version_range":"\u003c 20.26.6"}],"ecosystem":"pypi","package_name":"virtualenv"}],"created_at":"2025-01-13T18:08:56.902Z","updated_at":"2025-04-23T01:08:24.308Z","epss_percentage":0.00395,"epss_percentile":0.59289}],"docker_usage_url":"https://docker.ecosyste.ms/usage/pypi/virtualenv","docker_dependents_count":5172,"docker_downloads_count":2767331019,"usage_url":"https://repos.ecosyste.ms/usage/pypi/virtualenv","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/pypi/virtualenv/dependencies","status":null,"funding_links":["https://tidelift.com/funding/github/pypi/virtualenv","https://github.com/sponsors/pypa"],"critical":true,"versions_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/virtualenv/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/virtualenv/version_numbers","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/virtualenv/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/virtualenv/related_packages","maintainers":[{"uuid":"gaborbernat","login":"gaborbernat","name":null,"email":null,"url":null,"packages_count":18,"html_url":"https://pypi.org/user/gaborbernat/","role":null,"created_at":"2022-12-05T15:48:01.815Z","updated_at":"2022-12-05T15:48:01.815Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/maintainers/gaborbernat/packages"},{"uuid":"pf_moore","login":"pf_moore","name":null,"email":null,"url":null,"packages_count":19,"html_url":"https://pypi.org/user/pf_moore/","role":null,"created_at":"2022-12-05T15:48:01.824Z","updated_at":"2022-12-05T15:48:01.824Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/maintainers/pf_moore/packages"}],"registry":{"name":"pypi.org","url":"https://pypi.org","ecosystem":"pypi","default":true,"packages_count":688906,"maintainers_count":292111,"namespaces_count":0,"keywords_count":228261,"github":"pypi","metadata":{"funded_packages_count":48932},"icon_url":"https://github.com/pypi.png","created_at":"2022-04-04T15:19:23.364Z","updated_at":"2025-06-02T05:39:57.603Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages","maintainers_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/maintainers","namespaces_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/namespaces"}},"unique_repositories_count":1412,"unique_repositories_count_past_30_days":94,"recent_issues":[{"uuid":"5930118870","node_id":"PR_kwDOOFT1Qs8AAAABJZ_v3w","number":193,"state":"open","title":"deps(deps-dev): bump virtualenv from 20.29.3 to 21.14.11","user":"dependabot[bot]","labels":[],"assignees":[],"locked":false,"comments_count":1,"pull_request":true,"closed_at":null,"author_association":null,"state_reason":null,"created_at":"2026-10-19T19:24:24.000Z","updated_at":"2026-10-19T19:24:27.000Z","time_to_close":null,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"deps(deps-dev)","packages":[{"name":"virtualenv","old_version":"20.29.3","new_version":"21.14.11","repository_url":"https://github.com/pypa/virtualenv"}],"path":null,"ecosystem":"pip"},"body":"Bumps [virtualenv](https://github.com/pypa/virtualenv) from 20.29.3 to 21.14.11.\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pypa/virtualenv/releases\"\u003evirtualenv's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e21.14.11\u003c/h2\u003e\n\u003ch1\u003eBugfixes - 21.14.11\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eSearch all directories supplied by repeated \u003ccode\u003e--extra-search-dir\u003c/code\u003e options instead of keeping only the last group.\n(\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3440\"\u003e#3440\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eOn Windows, the app data is now migrated into the nested cache directory instead of the migration failing with a\nwarning on every run. (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3441\"\u003e#3441\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003ca href=\"https://pypi.org/project/virtualenv/21.14.11/\"\u003ePyPI release\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.14.10...21.14.11\"\u003ehttps://github.com/pypa/virtualenv/compare/21.14.10...21.14.11\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e21.14.10\u003c/h2\u003e\n\u003ch1\u003eBugfixes - 21.14.10\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eAlways copy seed packages when app-data is temporary, including when symlink seeding is enabled through an environment\nvariable or configuration file. Seeded packages remain available after temporary cache cleanup. (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3437\"\u003e#3437\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003ca href=\"https://pypi.org/project/virtualenv/21.14.10/\"\u003ePyPI release\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.14.9...21.14.10\"\u003ehttps://github.com/pypa/virtualenv/compare/21.14.9...21.14.10\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e21.14.9\u003c/h2\u003e\n\u003ch1\u003eBugfixes - 21.14.9\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eParse \u003ccode\u003eVIRTUALENV_PERIODIC_UPDATE_INSECURE\u003c/code\u003e as a boolean, so \u003ccode\u003e0\u003c/code\u003e, \u003ccode\u003efalse\u003c/code\u003e, \u003ccode\u003eno\u003c/code\u003e and \u003ccode\u003eoff\u003c/code\u003e keep certificate\nverification enabled. (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3398\"\u003e#3398\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eReject destinations whose resolved path contains the platform's PATH separator, including separators inherited from\nthe working directory or a directory symlink. (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3399\"\u003e#3399\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ePreserve an existing \u003ccode\u003epyvenv.cfg\u003c/code\u003e when a prompt or configuration value cannot be encoded as UTF-8, instead of\nleaving the file empty after a failed environment creation. The file now ends its lines with LF on every platform.\u003c/p\u003e\n\u003cp\u003eDebug logs show each configuration line as a Python string literal, so control characters are visible. (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3400\"\u003e#3400\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSkip writing a \u003ccode\u003e.venv\u003c/code\u003e redirect when the environment name contains a line boundary. The environment is still\ncreated, and any existing redirect remains unchanged. (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3401\"\u003e#3401\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ePreserve non-ASCII values in \u003ccode\u003eactivate_this.py\u003c/code\u003e when applications read the script with a legacy text encoding before\nexecuting it. (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3402\"\u003e#3402\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eReject malformed seed versions and requirements ending in archive suffixes before starting pip, with an error\nidentifying the invalid value instead of a misleading download or local-file error. (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3403\"\u003e#3403\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAllow a literal percent sign as a csh prompt and preserve carets in tcsh prompt display instead of interpreting them\nas control-character notation.\u003c/p\u003e\n\u003cp\u003eSeparate csh history and prompt escapes from preceding non-ASCII text in legacy locales. (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3404\"\u003e#3404\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eReport an error when an existing \u003ccode\u003epyvenv.cfg\u003c/code\u003e is not a regular file, instead of trying to read or write directories,\npipes, or devices as configuration files. (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3405\"\u003e#3405\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pypa/virtualenv/blob/main/docs/changelog.rst\"\u003evirtualenv's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003eBugfixes - 21.14.11\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eSearch all directories supplied by repeated \u003ccode\u003e--extra-search-dir\u003c/code\u003e options instead of keeping only the last group.\n(:issue:\u003ccode\u003e3440\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eOn Windows, the app data is now migrated into the nested cache directory instead of the migration failing with a\nwarning on every run. (:issue:\u003ccode\u003e3441\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003ev21.14.10 (2026-10-17)\u003c/p\u003e\n\u003chr /\u003e\n\u003ch1\u003eBugfixes - 21.14.10\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eAlways copy seed packages when app-data is temporary, including when symlink seeding is enabled through an environment\nvariable or configuration file. Seeded packages remain available after temporary cache cleanup. (:issue:\u003ccode\u003e3437\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003ev21.14.9 (2026-10-17)\u003c/p\u003e\n\u003chr /\u003e\n\u003ch1\u003eBugfixes - 21.14.9\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eParse \u003ccode\u003eVIRTUALENV_PERIODIC_UPDATE_INSECURE\u003c/code\u003e as a boolean, so \u003ccode\u003e0\u003c/code\u003e, \u003ccode\u003efalse\u003c/code\u003e, \u003ccode\u003eno\u003c/code\u003e and \u003ccode\u003eoff\u003c/code\u003e keep certificate\nverification enabled. (:issue:\u003ccode\u003e3398\u003c/code\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eReject destinations whose resolved path contains the platform's PATH separator, including separators inherited from\nthe working directory or a directory symlink. (:issue:\u003ccode\u003e3399\u003c/code\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ePreserve an existing \u003ccode\u003epyvenv.cfg\u003c/code\u003e when a prompt or configuration value cannot be encoded as UTF-8, instead of\nleaving the file empty after a failed environment creation. The file now ends its lines with LF on every platform.\u003c/p\u003e\n\u003cp\u003eDebug logs show each configuration line as a Python string literal, so control characters are visible. (:issue:\u003ccode\u003e3400\u003c/code\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSkip writing a \u003ccode\u003e.venv\u003c/code\u003e redirect when the environment name contains a line boundary. The environment is still\ncreated, and any existing redirect remains unchanged. (:issue:\u003ccode\u003e3401\u003c/code\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ePreserve non-ASCII values in \u003ccode\u003eactivate_this.py\u003c/code\u003e when applications read the script with a legacy text encoding before\nexecuting it. (:issue:\u003ccode\u003e3402\u003c/code\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eReject malformed seed versions and requirements ending in archive suffixes before starting pip, with an error\nidentifying the invalid value instead of a misleading download or local-file error. (:issue:\u003ccode\u003e3403\u003c/code\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAllow a literal percent sign as a csh prompt and preserve carets in tcsh prompt display instead of interpreting them\nas control-character notation.\u003c/p\u003e\n\u003cp\u003eSeparate csh history and prompt escapes from preceding non-ASCII text in legacy locales. (:issue:\u003ccode\u003e3404\u003c/code\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eReport an error when an existing \u003ccode\u003epyvenv.cfg\u003c/code\u003e is not a regular file, instead of trying to read or write directories,\npipes, or devices as configuration files. (:issue:\u003ccode\u003e3405\u003c/code\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ePreserve percent-containing paths during batch reactivation and show dollar signs literally in command prompts. Skip\nbatch scripts for paths containing line boundaries, and remove stale batch scripts for unsupported paths even when\nonly other activators are selected. (:issue:\u003ccode\u003e3406\u003c/code\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/1d1231fb40ab795014108e8433bcb7b2f979facc\"\u003e\u003ccode\u003e1d1231f\u003c/code\u003e\u003c/a\u003e release 21.14.11\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/b83363bdcb28d104cd0491341772a9bc89ba0477\"\u003e\u003ccode\u003eb83363b\u003c/code\u003e\u003c/a\u003e 🐛 fix(app-data): migrate nested cache safely (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3441\"\u003e#3441\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/8a7de0a40461d3d6dc01aa260137d394432e7da0\"\u003e\u003ccode\u003e8a7de0a\u003c/code\u003e\u003c/a\u003e Fix repeated --extra-search-dir options (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3440\"\u003e#3440\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/236f395eba928d084d8d8fb6c3a7224555139056\"\u003e\u003ccode\u003e236f395\u003c/code\u003e\u003c/a\u003e release 21.14.10\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/cd774762a5e99cf8f07c993231242a44201f75bf\"\u003e\u003ccode\u003ecd77476\u003c/code\u003e\u003c/a\u003e 🐛 fix(test): exclude broken pytest-mock (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3438\"\u003e#3438\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/b81995c3feab9e1edb453c75ffc6616e1a77335e\"\u003e\u003ccode\u003eb81995c\u003c/code\u003e\u003c/a\u003e 🐛 fix(seed): copy from temporary app-data (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3437\"\u003e#3437\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/e53e30b9c8fbc3f4f502223819449ddc970fbbe8\"\u003e\u003ccode\u003ee53e30b\u003c/code\u003e\u003c/a\u003e release 21.14.9\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/2519941bed33ee0d3ac99277f67913e439e476a9\"\u003e\u003ccode\u003e2519941\u003c/code\u003e\u003c/a\u003e 🐛 fix(seed): preserve interpreter paths in console scripts (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3417\"\u003e#3417\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/70a010204e1adff2536222a00b19a529291b3256\"\u003e\u003ccode\u003e70a0102\u003c/code\u003e\u003c/a\u003e 🐛 fix(seed): preserve shared cache when reseeding with pip (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3423\"\u003e#3423\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/554d9f9d4f7758f5cf53f993031e29787f1f74c5\"\u003e\u003ccode\u003e554d9f9\u003c/code\u003e\u003c/a\u003e 🐛 fix(create): replace linked output directories (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3429\"\u003e#3429\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/pypa/virtualenv/compare/20.29.3...21.14.11\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=virtualenv\u0026package-manager=pip\u0026previous-version=20.29.3\u0026new-version=21.14.11)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n\n\n\u003c/details\u003e","html_url":"https://github.com/ahmed5145/retro_game_engine/pull/193","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/ahmed5145%2Fretro_game_engine/issues/193","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/193/packages"},{"uuid":"5903237165","node_id":"PR_kwDOD8f9xs8AAAABJE3DGg","number":95,"state":"open","title":"Bump the python-packages group across 1 directory with 47 updates","user":"dependabot[bot]","labels":["dependencies","python:uv"],"assignees":[],"locked":false,"comments_count":1,"pull_request":true,"closed_at":null,"author_association":null,"state_reason":null,"created_at":"2026-10-17T21:23:29.000Z","updated_at":"2026-10-17T21:23:47.000Z","time_to_close":null,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"Bump","group_name":"python-packages","update_count":47,"packages":[{"name":"griffe-warnings-deprecated","old_version":"1.1.1","new_version":"1.1.2","repository_url":"https://github.com/mkdocstrings/griffe-warnings-deprecated"},{"name":"jupytext","old_version":"1.19.5","new_version":"1.19.6","repository_url":"https://github.com/jupytext/jupytext"},{"name":"jupyterlite","old_version":"0.8.5","new_version":"0.8.6","repository_url":"https://github.com/jupyterlite/jupyterlite"},{"name":"markdown-pycon","old_version":"1.0.1","new_version":"1.0.2","repository_url":"https://github.com/pawamoy/markdown-pycon"},{"name":"pymdown-extensions","old_version":"12.1","new_version":"12.2","repository_url":"https://github.com/facelessuser/pymdown-extensions"},{"name":"zensical","old_version":"0.0.67","new_version":"0.0.69","repository_url":"https://github.com/zensical/zensical"},{"name":"mypy","old_version":"2.3.1","new_version":"2.4.0","repository_url":"https://github.com/python/mypy"},{"name":"ruff","old_version":"0.16.10","new_version":"0.17.0","repository_url":"https://github.com/astral-sh/ruff"},{"name":"ty","old_version":"0.0.84","new_version":"0.0.86","repository_url":"https://github.com/astral-sh/ty"},{"name":"tox","old_version":"4.64.5","new_version":"4.65.2","repository_url":"https://github.com/tox-dev/tox"},{"name":"tox-uv","old_version":"1.36.0","new_version":"1.36.1","repository_url":"https://github.com/tox-dev/tox-uv"},{"name":"ast-serialize","old_version":"0.11.1","new_version":"0.12.1","repository_url":"https://github.com/mypyc/ast_serialize"},{"name":"cachetools","old_version":"7.1.8","new_version":"7.2.1","repository_url":"https://github.com/tkem/cachetools"},{"name":"charset-normalizer","old_version":"3.5.1","new_version":"3.5.2","repository_url":"https://github.com/jawah/charset_normalizer"},{"name":"coverage","old_version":"7.16.0","new_version":"7.16.2","repository_url":"https://github.com/coveragepy/coveragepy"},{"name":"executing","old_version":"2.2.1","new_version":"2.3.0","repository_url":"https://github.com/alexmojaki/executing"},{"name":"filelock","old_version":"4.0.12","new_version":"4.1.0","repository_url":"https://github.com/tox-dev/py-filelock"},{"name":"fonttools","old_version":"4.65.0","new_version":"4.66.1","repository_url":"https://github.com/fonttools/fonttools"},{"name":"fqdn","old_version":"1.5.1","new_version":"1.6.0","repository_url":"https://github.com/ypcrts/fqdn"},{"name":"griffelib","old_version":"2.3.0","new_version":"2.3.2"},{"name":"identify","old_version":"2.6.19","new_version":"2.6.20","repository_url":"https://github.com/pre-commit/identify"},{"name":"idna","old_version":"3.19","new_version":"3.20","repository_url":"https://github.com/kjd/idna"},{"name":"iniconfig","old_version":"2.3.0","new_version":"2.3.1","repository_url":"https://github.com/pytest-dev/iniconfig"},{"name":"json5","old_version":"0.15.0","new_version":"0.17.3","repository_url":"https://github.com/dpranke/pyjson5"},{"name":"jsonpointer","old_version":"3.1.1","new_version":"3.2.0","repository_url":"https://github.com/stefankoegl/python-json-pointer"},{"name":"jupyterlite-core","old_version":"0.8.5","new_version":"0.8.6","repository_url":"https://github.com/jupyterlite/jupyterlite"},{"name":"librt","old_version":"0.15.0","new_version":"0.16.0","repository_url":"https://github.com/mypyc/librt"},{"name":"markdown","old_version":"3.10.3","new_version":"3.11","repository_url":"https://github.com/Python-Markdown/markdown"},{"name":"markupsafe","old_version":"3.0.3","new_version":"3.0.4","repository_url":"https://github.com/pallets/markupsafe"},{"name":"mkdocstrings","old_version":"1.0.6","new_version":"1.0.7","repository_url":"https://github.com/mkdocstrings/mkdocstrings"},{"name":"mkdocstrings-python","old_version":"2.0.8","new_version":"2.0.9","repository_url":"https://github.com/mkdocstrings/python"},{"name":"mpmath","old_version":"1.3.0","new_version":"1.4.1","repository_url":"https://github.com/mpmath/mpmath"},{"name":"narwhals","old_version":"2.26.0","new_version":"2.27.1","repository_url":"https://github.com/narwhals-dev/narwhals"},{"name":"nodeenv","old_version":"1.10.0","new_version":"1.11.0","repository_url":"https://github.com/ekalinin/nodeenv"},{"name":"platformdirs","old_version":"4.11.8","new_version":"4.12.4","repository_url":"https://github.com/tox-dev/platformdirs"},{"name":"pycparser","old_version":"3.0","new_version":"3.11","repository_url":"https://github.com/eliben/pycparser"},{"name":"pyparsing","old_version":"3.3.2","new_version":"3.3.3","repository_url":"https://github.com/pyparsing/pyparsing"},{"name":"pyproject-api","old_version":"1.11.0","new_version":"1.11.5","repository_url":"https://github.com/tox-dev/pyproject-api"},{"name":"python-discovery","old_version":"1.6.0","new_version":"1.6.2","repository_url":"https://github.com/tox-dev/python-discovery"},{"name":"rpds-py","old_version":"2026.6.3","new_version":"2026.9.1","repository_url":"https://github.com/crate-py/rpds"},{"name":"soupsieve","old_version":"2.9.2","new_version":"2.10","repository_url":"https://github.com/facelessuser/soupsieve"},{"name":"tomli","old_version":"2.4.1","new_version":"2.5.0","repository_url":"https://github.com/hukkin/tomli"},{"name":"tox-uv-bare","old_version":"1.36.0","new_version":"1.36.1","repository_url":"https://github.com/tox-dev/tox-uv"},{"name":"tzdata","old_version":"2026.3","new_version":"2026.5","repository_url":"https://github.com/python/tzdata"},{"name":"uv","old_version":"0.12.19","new_version":"0.13.0","repository_url":"https://github.com/astral-sh/uv"},{"name":"virtualenv","old_version":"21.14.2","new_version":"21.14.6","repository_url":"https://github.com/pypa/virtualenv"},{"name":"wcwidth","old_version":"0.8.3","new_version":"0.9.2","repository_url":"https://github.com/jquast/wcwidth"}],"path":null,"ecosystem":"pip"},"body":"Bumps the python-packages group with 47 updates in the / directory:\n\n| Package | From | To |\n| --- | --- | --- |\n| [griffe-warnings-deprecated](https://github.com/mkdocstrings/griffe-warnings-deprecated) | `1.1.1` | `1.1.2` |\n| [jupytext](https://github.com/jupytext/jupytext) | `1.19.5` | `1.19.6` |\n| [jupyterlite](https://github.com/jupyterlite/jupyterlite) | `0.8.5` | `0.8.6` |\n| [markdown-pycon](https://github.com/pawamoy/markdown-pycon) | `1.0.1` | `1.0.2` |\n| [pymdown-extensions](https://github.com/facelessuser/pymdown-extensions) | `12.1` | `12.2` |\n| [zensical](https://github.com/zensical/zensical) | `0.0.67` | `0.0.69` |\n| [mypy](https://github.com/python/mypy) | `2.3.1` | `2.4.0` |\n| [ruff](https://github.com/astral-sh/ruff) | `0.16.10` | `0.17.0` |\n| [ty](https://github.com/astral-sh/ty) | `0.0.84` | `0.0.86` |\n| [tox](https://github.com/tox-dev/tox) | `4.64.5` | `4.65.2` |\n| [tox-uv](https://github.com/tox-dev/tox-uv) | `1.36.0` | `1.36.1` |\n| [ast-serialize](https://github.com/mypyc/ast_serialize) | `0.11.1` | `0.12.1` |\n| [cachetools](https://github.com/tkem/cachetools) | `7.1.8` | `7.2.1` |\n| [charset-normalizer](https://github.com/jawah/charset_normalizer) | `3.5.1` | `3.5.2` |\n| [coverage](https://github.com/coveragepy/coveragepy) | `7.16.0` | `7.16.2` |\n| [executing](https://github.com/alexmojaki/executing) | `2.2.1` | `2.3.0` |\n| [filelock](https://github.com/tox-dev/py-filelock) | `4.0.12` | `4.1.0` |\n| [fonttools](https://github.com/fonttools/fonttools) | `4.65.0` | `4.66.1` |\n| [fqdn](https://github.com/ypcrts/fqdn) | `1.5.1` | `1.6.0` |\n| griffelib | `2.3.0` | `2.3.2` |\n| [identify](https://github.com/pre-commit/identify) | `2.6.19` | `2.6.20` |\n| [idna](https://github.com/kjd/idna) | `3.19` | `3.20` |\n| [iniconfig](https://github.com/pytest-dev/iniconfig) | `2.3.0` | `2.3.1` |\n| [json5](https://github.com/dpranke/pyjson5) | `0.15.0` | `0.17.3` |\n| [jsonpointer](https://github.com/stefankoegl/python-json-pointer) | `3.1.1` | `3.2.0` |\n| [jupyterlite-core](https://github.com/jupyterlite/jupyterlite) | `0.8.5` | `0.8.6` |\n| [librt](https://github.com/mypyc/librt) | `0.15.0` | `0.16.0` |\n| [markdown](https://github.com/Python-Markdown/markdown) | `3.10.3` | `3.11` |\n| [markupsafe](https://github.com/pallets/markupsafe) | `3.0.3` | `3.0.4` |\n| [mkdocstrings](https://github.com/mkdocstrings/mkdocstrings) | `1.0.6` | `1.0.7` |\n| [mkdocstrings-python](https://github.com/mkdocstrings/python) | `2.0.8` | `2.0.9` |\n| [mpmath](https://github.com/mpmath/mpmath) | `1.3.0` | `1.4.1` |\n| [narwhals](https://github.com/narwhals-dev/narwhals) | `2.26.0` | `2.27.1` |\n| [nodeenv](https://github.com/ekalinin/nodeenv) | `1.10.0` | `1.11.0` |\n| [platformdirs](https://github.com/tox-dev/platformdirs) | `4.11.8` | `4.12.4` |\n| [pycparser](https://github.com/eliben/pycparser) | `3.0` | `3.11` |\n| [pyparsing](https://github.com/pyparsing/pyparsing) | `3.3.2` | `3.3.3` |\n| [pyproject-api](https://github.com/tox-dev/pyproject-api) | `1.11.0` | `1.11.5` |\n| [python-discovery](https://github.com/tox-dev/python-discovery) | `1.6.0` | `1.6.2` |\n| [rpds-py](https://github.com/crate-py/rpds) | `2026.6.3` | `2026.9.1` |\n| [soupsieve](https://github.com/facelessuser/soupsieve) | `2.9.2` | `2.10` |\n| [tomli](https://github.com/hukkin/tomli) | `2.4.1` | `2.5.0` |\n| [tox-uv-bare](https://github.com/tox-dev/tox-uv) | `1.36.0` | `1.36.1` |\n| [tzdata](https://github.com/python/tzdata) | `2026.3` | `2026.5` |\n| [uv](https://github.com/astral-sh/uv) | `0.12.19` | `0.13.0` |\n| [virtualenv](https://github.com/pypa/virtualenv) | `21.14.2` | `21.14.6` |\n| [wcwidth](https://github.com/jquast/wcwidth) | `0.8.3` | `0.9.2` |\n\n\nUpdates `griffe-warnings-deprecated` from 1.1.1 to 1.1.2\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/mkdocstrings/griffe-warnings-deprecated/releases\"\u003egriffe-warnings-deprecated's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e1.1.2\u003c/h2\u003e\n\u003ch2\u003e\u003ca href=\"https://github.com/mkdocstrings/griffe-warnings-deprecated/releases/tag/1.1.2\"\u003e1.1.2\u003c/a\u003e - 2026-10-06\u003c/h2\u003e\n\u003cp\u003e\u003c!-- raw HTML omitted --\u003e\u003ca href=\"https://github.com/mkdocstrings/griffe-warnings-deprecated/compare/1.1.1...1.1.2\"\u003eCompare with 1.1.1\u003c/a\u003e\u003c!-- raw HTML omitted --\u003e\u003c/p\u003e\n\u003ch3\u003eBuild\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eDrop support for Python 3.10 (\u003ca href=\"https://github.com/mkdocstrings/griffe-warnings-deprecated/commit/2cfb851cc7828652b2e0dfc919ade2fe2f25365a\"\u003e2cfb851\u003c/a\u003e by Timothée Mazzucotelli).\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/mkdocstrings/griffe-warnings-deprecated/blob/main/CHANGELOG.md\"\u003egriffe-warnings-deprecated's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e\u003ca href=\"https://github.com/mkdocstrings/griffe-warnings-deprecated/releases/tag/1.1.2\"\u003e1.1.2\u003c/a\u003e - 2026-10-06\u003c/h2\u003e\n\u003cp\u003e\u003c!-- raw HTML omitted --\u003e\u003ca href=\"https://github.com/mkdocstrings/griffe-warnings-deprecated/compare/1.1.1...1.1.2\"\u003eCompare with 1.1.1\u003c/a\u003e\u003c!-- raw HTML omitted --\u003e\u003c/p\u003e\n\u003ch3\u003eBuild\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eDrop support for Python 3.10 (\u003ca href=\"https://github.com/mkdocstrings/griffe-warnings-deprecated/commit/2cfb851cc7828652b2e0dfc919ade2fe2f25365a\"\u003e2cfb851\u003c/a\u003e by Timothée Mazzucotelli).\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mkdocstrings/griffe-warnings-deprecated/commit/cc3a695b7c1564a58d1d47c051a0637b6a795cad\"\u003e\u003ccode\u003ecc3a695\u003c/code\u003e\u003c/a\u003e chore: Prepare release 1.1.2\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mkdocstrings/griffe-warnings-deprecated/commit/058211c5d51c09cd0778f3cb7b55d0fa007a47eb\"\u003e\u003ccode\u003e058211c\u003c/code\u003e\u003c/a\u003e chore: Template upgrade\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mkdocstrings/griffe-warnings-deprecated/commit/2cfb851cc7828652b2e0dfc919ade2fe2f25365a\"\u003e\u003ccode\u003e2cfb851\u003c/code\u003e\u003c/a\u003e build: Drop support for Python 3.10\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mkdocstrings/griffe-warnings-deprecated/commit/138f8855e5288830792aa704c6e720179167a4c7\"\u003e\u003ccode\u003e138f885\u003c/code\u003e\u003c/a\u003e chore: Update sponsors section in README (\u003ca href=\"https://redirect.github.com/mkdocstrings/griffe-warnings-deprecated/issues/10\"\u003e#10\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mkdocstrings/griffe-warnings-deprecated/commit/db084e78b22f04c4419d6b0060004c98451cb32f\"\u003e\u003ccode\u003edb084e7\u003c/code\u003e\u003c/a\u003e chore: Lint\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mkdocstrings/griffe-warnings-deprecated/commit/8003436cba1f73aa062b7ef7cb27383e50726f08\"\u003e\u003ccode\u003e8003436\u003c/code\u003e\u003c/a\u003e chore: Template upgrade\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mkdocstrings/griffe-warnings-deprecated/commit/381ffc66a92ffd2e0ce37f25dc2df61d1d503dd4\"\u003e\u003ccode\u003e381ffc6\u003c/code\u003e\u003c/a\u003e Merge branch 'main' of github.com:mkdocstrings/griffe-typing-deprecated\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mkdocstrings/griffe-warnings-deprecated/commit/c4ed8a1b28c9508b28272211507b5d4804a817f0\"\u003e\u003ccode\u003ec4ed8a1\u003c/code\u003e\u003c/a\u003e chore: Template upgrade\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mkdocstrings/griffe-warnings-deprecated/commit/f84bf29728d49e1f307e5427aa7027b426ff5a52\"\u003e\u003ccode\u003ef84bf29\u003c/code\u003e\u003c/a\u003e chore: Update sponsors section in README (\u003ca href=\"https://redirect.github.com/mkdocstrings/griffe-warnings-deprecated/issues/9\"\u003e#9\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/mkdocstrings/griffe-warnings-deprecated/compare/1.1.1...1.1.2\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `jupytext` from 1.19.5 to 1.19.6\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/jupytext/jupytext/releases\"\u003ejupytext's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003eVersion 1.19.6\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eSecurity\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eThe Quarto conversions now run in a private temporary directory, so that the output file that \u003ccode\u003equarto convert\u003c/code\u003e names after its input can no longer be pre-created as a symlink by another user of the machine. Thanks to \u003ca href=\"https://github.com/nvxbug\"\u003eNaveed\u003c/a\u003e for the PR (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1615\"\u003e#1615\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003ePaired paths from notebook \u003ccode\u003eformats\u003c/code\u003e metadata are now prevented from escaping the working tree, including when an absolute notebook path is used. Thanks to \u003ca href=\"https://github.com/nvxbug\"\u003eNaveed\u003c/a\u003e for addressing the issue (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1588\"\u003e#1588\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003eThe CLI now ignores \u003ccode\u003etrusted\u003c/code\u003e cell metadata when the notebook signature is invalid, so a \u003ccode\u003etrusted=true\u003c/code\u003e option in a\npaired text file cannot make untrusted notebook outputs trusted during \u003ccode\u003e--sync\u003c/code\u003e. Thanks to \u003ca href=\"https://github.com/nvxbug\"\u003eNaveed\u003c/a\u003e for the fix (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1617\"\u003e#1617\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003eCustom \u003ccode\u003ecell_markers\u003c/code\u003e and \u003ccode\u003eendofcell\u003c/code\u003e values in the light format are now matched literally, preventing regular-expression\ninjection, parsing errors, and excessive processing time on crafted notebooks. This also fixes writing OCaml notebooks\nwith custom cell markers. Thanks to \u003ca href=\"https://github.com/nvxbug\"\u003eNaveed\u003c/a\u003e again for the PR  (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1618\"\u003e#1618\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003eWe have merged Dependabot security updates for the JupyterLab extension and the documentation website (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1614\"\u003e#1614\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1620\"\u003e#1620\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1622\"\u003e#1622\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1624\"\u003e#1624\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1634\"\u003e#1634\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1639\"\u003e#1639\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1642\"\u003e#1642\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1643\"\u003e#1643\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1647\"\u003e#1647\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1653\"\u003e#1653\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1654\"\u003e#1654\u003c/a\u003e).\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFixed\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eMenu entries such as \u0026quot;Rename Notebook…\u0026quot; name the file type again, instead of saying \u0026quot;default\u0026quot;. Thanks to \u003ca href=\"https://github.com/krassowski\"\u003eMichał Krassowski\u003c/a\u003e for this PR (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1632\"\u003e#1632\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003eMermaid \u003ccode\u003e%%\u003c/code\u003e comments inside a markdown cell are no longer mistaken for \u003ccode\u003epy:percent\u003c/code\u003e cell markers (\u003ca href=\"https://redirect.github.com/mwouts/jupytext/issues/1533\"\u003e#1533\u003c/a\u003e).  Thanks to \u003ca href=\"https://github.com/Sanjays2402\"\u003eSanjay Santhanam\u003c/a\u003e for his PR (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1609\"\u003e#1609\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eA whitespace-only final line in a percent-format cell is now preserved when reading and round-tripping the notebook (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/issues/1599\"\u003e#1599\u003c/a\u003e). Thanks to \u003ca href=\"https://github.com/lowbyteguy\"\u003elowbyteguy\u003c/a\u003e for the PR (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1610\"\u003e#1610\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003eThe JupyterLab extension's development install script now uses the correct \u003ccode\u003ejupyter-builder\u003c/code\u003e import (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1632\"\u003e#1632\u003c/a\u003e). Thanks again to \u003ca href=\"https://github.com/krassowski\"\u003eMichał Krassowski\u003c/a\u003e for this fix.\u003c/li\u003e\n\u003cli\u003eFixed JupyterLab extension build issues related to Yarn package checksums. Thanks to \u003ca href=\"https://github.com/mahendrapaipuri\"\u003eMahendra Paipuri\u003c/a\u003e for his contributions to \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1614\"\u003e#1614\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1620\"\u003e#1620\u003c/a\u003e, and \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1621\"\u003e#1621\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003eFixed pairing on Windows when a prefix root contains subdirectories, such as \u003ccode\u003enotebooks/tutorials///ipynb\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eChanged\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eUpdated the JupyterLab extension's production dependencies (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1621\"\u003e#1621\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1641\"\u003e#1641\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1652\"\u003e#1652\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003eUpdated the documentation website's Astro, Starlight, and Sharp dependencies (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1612\"\u003e#1612\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1621\"\u003e#1621\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1625\"\u003e#1625\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1641\"\u003e#1641\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1646\"\u003e#1646\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1650\"\u003e#1650\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1652\"\u003e#1652\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003eUpdated the GitHub Actions used for CI and publishing (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1613\"\u003e#1613\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1619\"\u003e#1619\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1633\"\u003e#1633\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1640\"\u003e#1640\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1649\"\u003e#1649\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1651\"\u003e#1651\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003eUpdated Jupyter Server in the Pixi environments. Thanks again to \u003ca href=\"https://github.com/mahendrapaipuri\"\u003eMahendra Paipuri\u003c/a\u003e for this update (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1646\"\u003e#1646\u003c/a\u003e).\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eAdded\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eWe have added a development container that can be opened with VS Code’s Dev Containers extension (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1655\"\u003e#1655\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003eAdded support for the Jenner language. Thanks to \u003ca href=\"https://github.com/lwsinclair\"\u003eLawrence Sinclair\u003c/a\u003e for this contribution (\u003ca href=\"https://redirect.github.com/mwouts/jupytext/pull/1493\"\u003e#1493\u003c/a\u003e).\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/jupytext/jupytext/blob/main/CHANGELOG.md\"\u003ejupytext's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e1.19.6 (2026-10-04)\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eSecurity\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eThe Quarto conversions now run in a private temporary directory, so that the output file that \u003ccode\u003equarto convert\u003c/code\u003e names after its input can no longer be pre-created as a symlink by another user of the machine. Thanks to \u003ca href=\"https://github.com/nvxbug\"\u003eNaveed\u003c/a\u003e for the PR (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1615\"\u003e#1615\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003ePaired paths from notebook \u003ccode\u003eformats\u003c/code\u003e metadata are now prevented from escaping the working tree, including when an absolute notebook path is used. Thanks to \u003ca href=\"https://github.com/nvxbug\"\u003eNaveed\u003c/a\u003e for addressing the issue (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1588\"\u003e#1588\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003eThe CLI now ignores \u003ccode\u003etrusted\u003c/code\u003e cell metadata when the notebook signature is invalid, so a \u003ccode\u003etrusted=true\u003c/code\u003e option in a\npaired text file cannot make untrusted notebook outputs trusted during \u003ccode\u003e--sync\u003c/code\u003e. Thanks to\n\u003ca href=\"https://github.com/nvxbug\"\u003eNaveed\u003c/a\u003e for the fix (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1617\"\u003e#1617\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003eCustom \u003ccode\u003ecell_markers\u003c/code\u003e and \u003ccode\u003eendofcell\u003c/code\u003e values in the light format are now matched literally, preventing regular-expression\ninjection, parsing errors, and excessive processing time on crafted notebooks. This also fixes writing OCaml notebooks\nwith custom cell markers. Thanks to \u003ca href=\"https://github.com/nvxbug\"\u003eNaveed\u003c/a\u003e again for the PR\n(\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1618\"\u003e#1618\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003eWe have merged Dependabot security updates for the JupyterLab extension and the documentation website\n(\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1614\"\u003e#1614\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1620\"\u003e#1620\u003c/a\u003e,\n\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1622\"\u003e#1622\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1624\"\u003e#1624\u003c/a\u003e,\n\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1634\"\u003e#1634\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1639\"\u003e#1639\u003c/a\u003e,\n\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1642\"\u003e#1642\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1643\"\u003e#1643\u003c/a\u003e,\n\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1647\"\u003e#1647\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1653\"\u003e#1653\u003c/a\u003e,\n\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1654\"\u003e#1654\u003c/a\u003e).\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFixed\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eMenu entries such as \u0026quot;Rename Notebook…\u0026quot; name the file type again, instead of saying \u0026quot;default\u0026quot;. Thanks to\n\u003ca href=\"https://github.com/krassowski\"\u003eMichał Krassowski\u003c/a\u003e for this PR (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1632\"\u003e#1632\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003eMermaid \u003ccode\u003e%%\u003c/code\u003e comments inside a markdown cell are no longer mistaken for \u003ccode\u003epy:percent\u003c/code\u003e cell markers (\u003ca href=\"https://redirect.github.com/mwouts/jupytext/issues/1533\"\u003e#1533\u003c/a\u003e).  Thanks to \u003ca href=\"https://github.com/Sanjays2402\"\u003eSanjay Santhanam\u003c/a\u003e for his PR (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1609\"\u003e#1609\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eA whitespace-only final line in a percent-format cell is now preserved when reading and round-tripping the notebook\n(\u003ca href=\"https://redirect.github.com/jupytext/jupytext/issues/1599\"\u003e#1599\u003c/a\u003e). Thanks to \u003ca href=\"https://github.com/lowbyteguy\"\u003elowbyteguy\u003c/a\u003e\nfor the PR (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1610\"\u003e#1610\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003eThe JupyterLab extension's development install script now uses the correct \u003ccode\u003ejupyter-builder\u003c/code\u003e import\n(\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1632\"\u003e#1632\u003c/a\u003e). Thanks again to \u003ca href=\"https://github.com/krassowski\"\u003eMichał Krassowski\u003c/a\u003e\nfor this fix.\u003c/li\u003e\n\u003cli\u003eFixed JupyterLab extension build issues related to Yarn package checksums. Thanks to\n\u003ca href=\"https://github.com/mahendrapaipuri\"\u003eMahendra Paipuri\u003c/a\u003e for his contributions to\n\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1614\"\u003e#1614\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1620\"\u003e#1620\u003c/a\u003e,\nand \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1621\"\u003e#1621\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003eFixed pairing on Windows when a prefix root contains subdirectories, such as \u003ccode\u003enotebooks/tutorials///ipynb\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eChanged\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eUpdated the JupyterLab extension's production dependencies\n(\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1621\"\u003e#1621\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1641\"\u003e#1641\u003c/a\u003e,\n\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1652\"\u003e#1652\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003eUpdated the documentation website's Astro, Starlight, and Sharp dependencies\n(\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1612\"\u003e#1612\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1621\"\u003e#1621\u003c/a\u003e,\n\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1625\"\u003e#1625\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1641\"\u003e#1641\u003c/a\u003e,\n\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1646\"\u003e#1646\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1650\"\u003e#1650\u003c/a\u003e,\n\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1652\"\u003e#1652\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003eUpdated the GitHub Actions used for CI and publishing\n(\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1613\"\u003e#1613\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1619\"\u003e#1619\u003c/a\u003e,\n\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1633\"\u003e#1633\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1640\"\u003e#1640\u003c/a\u003e,\n\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1649\"\u003e#1649\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1651\"\u003e#1651\u003c/a\u003e).\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jupytext/jupytext/commit/9fccc3d85485e01264eb3454fae8c5ab4d093cfb\"\u003e\u003ccode\u003e9fccc3d\u003c/code\u003e\u003c/a\u003e Version 1.19.6 (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/issues/1656\"\u003e#1656\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jupytext/jupytext/commit/85c65a9b047d4393e8f7815a7da588239738865a\"\u003e\u003ccode\u003e85c65a9\u003c/code\u003e\u003c/a\u003e Add Jenner language support (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/issues/1493\"\u003e#1493\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jupytext/jupytext/commit/ca39ad2f71825484bd4d7b3299c21878d959a39a\"\u003e\u003ccode\u003eca39ad2\u003c/code\u003e\u003c/a\u003e Add development container (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/issues/1655\"\u003e#1655\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jupytext/jupytext/commit/0176ff2409af9b6c70e1556cee62403b7c388509\"\u003e\u003ccode\u003e0176ff2\u003c/code\u003e\u003c/a\u003e reject paired paths that escape the notebook directory tree (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/issues/1588\"\u003e#1588\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jupytext/jupytext/commit/1eb46537460ae668012f40ca992e96e10ce8f809\"\u003e\u003ccode\u003e1eb4653\u003c/code\u003e\u003c/a\u003e Ignore '%%' lines inside fenced blocks of py:percent markdown cells (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/issues/1609\"\u003e#1609\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jupytext/jupytext/commit/b1d7b6580ae338ea3c0ed9b938b0fac6d851f472\"\u003e\u003ccode\u003eb1d7b65\u003c/code\u003e\u003c/a\u003e build(deps): bump the jupytext-extension-security-updates group across 2 dire...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jupytext/jupytext/commit/85df69a0df63cd486403b6684cd4fd847354bdf4\"\u003e\u003ccode\u003e85df69a\u003c/code\u003e\u003c/a\u003e build(deps): bump the actions-dependencies group with 3 updates (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/issues/1651\"\u003e#1651\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jupytext/jupytext/commit/c3bb81dcc030ad7eda82b3915cf686ba9320f7af\"\u003e\u003ccode\u003ec3bb81d\u003c/code\u003e\u003c/a\u003e run quarto convert in a private temp directory (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/issues/1615\"\u003e#1615\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jupytext/jupytext/commit/9bbd9906c1ca8a1d6c44f55b2a65ec32c14b1696\"\u003e\u003ccode\u003e9bbd990\u003c/code\u003e\u003c/a\u003e build(deps): bump the jupytext-extension-security-updates group across 1 dire...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jupytext/jupytext/commit/f96ae7d2268f889dfbbd0385134d2d92e3bc6cfa\"\u003e\u003ccode\u003ef96ae7d\u003c/code\u003e\u003c/a\u003e build(deps): bump the jupytext-extension-dependencies group across 2 director...\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/jupytext/jupytext/compare/v1.19.5...v1.19.6\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `jupyterlite` from 0.8.5 to 0.8.6\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/jupyterlite/jupyterlite/releases\"\u003ejupyterlite's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev0.8.6\u003c/h2\u003e\n\u003ch2\u003e0.8.6\u003c/h2\u003e\n\u003cp\u003e(\u003ca href=\"https://github.com/jupyterlite/jupyterlite/compare/@jupyterlite/application-extension@0.8.5...bd2c02332f8b9bc3d9c91309732ad2eee578dd7d\"\u003eFull Changelog\u003c/a\u003e)\u003c/p\u003e\n\u003ch3\u003eBugs fixed\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eFix service worker stdin replies being delivered to all pending requests \u003ca href=\"https://redirect.github.com/jupyterlite/jupyterlite/pull/2077\"\u003e#2077\u003c/a\u003e (\u003ca href=\"https://github.com/jtpio\"\u003e\u003ccode\u003e@​jtpio\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eContributors to this release\u003c/h3\u003e\n\u003cp\u003eThe following people contributed discussions, new ideas, code and documentation contributions, and review.\nSee \u003ca href=\"https://github-activity.readthedocs.io/en/latest/use/#how-does-this-tool-define-contributions-in-the-reports\"\u003eour definition of contributors\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://github.com/jupyterlite/jupyterlite/graphs/contributors?from=2026-09-28\u0026amp;to=2026-10-07\u0026amp;type=c\"\u003eGitHub contributors page for this release\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/jtpio\"\u003e\u003ccode\u003e@​jtpio\u003c/code\u003e\u003c/a\u003e (\u003ca href=\"https://github.com/search?q=repo%3Ajupyterlite%2Fjupyterlite+involves%3Ajtpio+updated%3A2026-09-28..2026-10-07\u0026amp;type=Issues\"\u003eactivity\u003c/a\u003e)\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/jupyterlite/jupyterlite/blob/@jupyterlite/types@0.8.6/docs/changelog.md\"\u003ejupyterlite's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e0.8.6\u003c/h2\u003e\n\u003cp\u003e(\u003ca href=\"https://github.com/jupyterlite/jupyterlite/compare/@jupyterlite/application-extension@0.8.5...bd2c02332f8b9bc3d9c91309732ad2eee578dd7d\"\u003eFull Changelog\u003c/a\u003e)\u003c/p\u003e\n\u003ch3\u003eBugs fixed\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eFix service worker stdin replies being delivered to all pending requests \u003ca href=\"https://redirect.github.com/jupyterlite/jupyterlite/pull/2077\"\u003e#2077\u003c/a\u003e (\u003ca href=\"https://github.com/jtpio\"\u003e\u003ccode\u003e@​jtpio\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eContributors to this release\u003c/h3\u003e\n\u003cp\u003eThe following people contributed discussions, new ideas, code and documentation contributions, and review.\nSee \u003ca href=\"https://github-activity.readthedocs.io/en/latest/use/#how-does-this-tool-define-contributions-in-the-reports\"\u003eour definition of contributors\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://github.com/jupyterlite/jupyterlite/graphs/contributors?from=2026-09-28\u0026amp;to=2026-10-07\u0026amp;type=c\"\u003eGitHub contributors page for this release\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/jtpio\"\u003e\u003ccode\u003e@​jtpio\u003c/code\u003e\u003c/a\u003e (\u003ca href=\"https://github.com/search?q=repo%3Ajupyterlite%2Fjupyterlite+involves%3Ajtpio+updated%3A2026-09-28..2026-10-07\u0026amp;type=Issues\"\u003eactivity\u003c/a\u003e)\u003c/p\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jupyterlite/jupyterlite/commit/337b8a74476f8c68793e2e7bd163d471ad4466ad\"\u003e\u003ccode\u003e337b8a7\u003c/code\u003e\u003c/a\u003e Publish 0.8.6\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jupyterlite/jupyterlite/commit/bd2c02332f8b9bc3d9c91309732ad2eee578dd7d\"\u003e\u003ccode\u003ebd2c023\u003c/code\u003e\u003c/a\u003e Backport PR \u003ca href=\"https://redirect.github.com/jupyterlite/jupyterlite/issues/2077\"\u003e#2077\u003c/a\u003e: Fix service worker stdin replies being delivered to all pe...\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/jupyterlite/jupyterlite/compare/@jupyterlite/types@0.8.5...@jupyterlite/types@0.8.6\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `markdown-pycon` from 1.0.1 to 1.0.2\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pawamoy/markdown-pycon/releases\"\u003emarkdown-pycon's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e1.0.2\u003c/h2\u003e\n\u003ch2\u003e\u003ca href=\"https://github.com/pawamoy/markdown-pycon/releases/tag/1.0.2\"\u003e1.0.2\u003c/a\u003e - 2026-10-06\u003c/h2\u003e\n\u003cp\u003e\u003c!-- raw HTML omitted --\u003e\u003ca href=\"https://github.com/pawamoy/markdown-pycon/compare/1.0.1...1.0.2\"\u003eCompare with 1.0.1\u003c/a\u003e\u003c!-- raw HTML omitted --\u003e\u003c/p\u003e\n\u003ch3\u003eBuild\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eDrop support for Python 3.10 (\u003ca href=\"https://github.com/pawamoy/markdown-pycon/commit/805934803b8a1401cac64b946e5d901b2b09e3a3\"\u003e8059348\u003c/a\u003e by Timothée Mazzucotelli).\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pawamoy/markdown-pycon/blob/main/CHANGELOG.md\"\u003emarkdown-pycon's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e\u003ca href=\"https://github.com/pawamoy/markdown-pycon/releases/tag/1.0.2\"\u003e1.0.2\u003c/a\u003e - 2026-10-06\u003c/h2\u003e\n\u003cp\u003e\u003c!-- raw HTML omitted --\u003e\u003ca href=\"https://github.com/pawamoy/markdown-pycon/compare/1.0.1...1.0.2\"\u003eCompare with 1.0.1\u003c/a\u003e\u003c!-- raw HTML omitted --\u003e\u003c/p\u003e\n\u003ch3\u003eBuild\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eDrop support for Python 3.10 (\u003ca href=\"https://github.com/pawamoy/markdown-pycon/commit/805934803b8a1401cac64b946e5d901b2b09e3a3\"\u003e8059348\u003c/a\u003e by Timothée Mazzucotelli).\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pawamoy/markdown-pycon/commit/0175927609fbcdd6da7d1d4e95c470d452686b93\"\u003e\u003ccode\u003e0175927\u003c/code\u003e\u003c/a\u003e chore: Prepare release 1.0.2\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pawamoy/markdown-pycon/commit/6efbfe1378d754004469bab6b87aa54932dc017e\"\u003e\u003ccode\u003e6efbfe1\u003c/code\u003e\u003c/a\u003e chore: Template upgrade\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pawamoy/markdown-pycon/commit/805934803b8a1401cac64b946e5d901b2b09e3a3\"\u003e\u003ccode\u003e8059348\u003c/code\u003e\u003c/a\u003e build: Drop support for Python 3.10\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pawamoy/markdown-pycon/commit/aa5daa217a4e299a7fcc44ca541564367ac9036b\"\u003e\u003ccode\u003eaa5daa2\u003c/code\u003e\u003c/a\u003e chore: Lint\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pawamoy/markdown-pycon/commit/e916742421d4489518a43f53b6705aedaf37ea79\"\u003e\u003ccode\u003ee916742\u003c/code\u003e\u003c/a\u003e chore: Template upgrade\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/pawamoy/markdown-pycon/compare/1.0.1...1.0.2\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `pymdown-extensions` from 12.1 to 12.2\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/facelessuser/pymdown-extensions/releases\"\u003epymdown-extensions's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e12.2\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eNEW\u003c/strong\u003e: Add official support for Python 3.15.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eNEW\u003c/strong\u003e: Tilde, Caret: For backwards compatibility, disable CommonMark punctuation rules by default. If subscript or\nsuperscript is disabled in the respective extension, CommonMark rules will be honored again. A new \u003ccode\u003epunctuation\u003c/code\u003e\nrule has been added to force CommonMark rules. When done, people will need to be aware of punctuation when subscript\nor superscript is enabled and escape any that violates CommonMark rules.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eNEW\u003c/strong\u003e: Highlight: Highlight now allows in the \u003ccode\u003eauto_title_map\u003c/code\u003e specifying the title as a simple string or a\ndictionary containing the title and the title mode: either \u003ccode\u003etext\u003c/code\u003e or \u003ccode\u003ehtml\u003c/code\u003e, with \u003ccode\u003etext\u003c/code\u003e being the default. This\nallows a title to be specified and treated as HTML when the mode is \u003ccode\u003ehtml\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eNEW\u003c/strong\u003e: SuperFences: Add new \u003ccode\u003etitle_mode\u003c/code\u003e option for Pygments fenced blocks that allows a user to specify a title\nto be treated as HTML via \u003ccode\u003etitle_mode=\u0026quot;html\u0026quot;\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/facelessuser/pymdown-extensions/commit/a656909d439b5570f12f9069d67adf163c8506b9\"\u003e\u003ccode\u003ea656909\u003c/code\u003e\u003c/a\u003e Docs: Fix duplicate word\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/facelessuser/pymdown-extensions/commit/0b905467cca69ac91aa4a9b0e5aa75abd93d6ede\"\u003e\u003ccode\u003e0b90546\u003c/code\u003e\u003c/a\u003e Revert \u0026quot;Fix lint\u0026quot;\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/facelessuser/pymdown-extensions/commit/11fbe9f174beff658efaa05c958257e69c147aa3\"\u003e\u003ccode\u003e11fbe9f\u003c/code\u003e\u003c/a\u003e Revert \u0026quot;Drop Python 3.10 support\u0026quot;\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/facelessuser/pymdown-extensions/commit/3b5e585144686c9ceae68ded8ce4f271332d779f\"\u003e\u003ccode\u003e3b5e585\u003c/code\u003e\u003c/a\u003e Docs: Fix grammar\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/facelessuser/pymdown-extensions/commit/91ec2a842a736f7f47b84850d8ffbb43d69b6c74\"\u003e\u003ccode\u003e91ec2a8\u003c/code\u003e\u003c/a\u003e Docs: Fix default admonition/details styling\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/facelessuser/pymdown-extensions/commit/5d7efe44e03c9ff3bbd852fc7b44610210cc1ca7\"\u003e\u003ccode\u003e5d7efe4\u003c/code\u003e\u003c/a\u003e Docs: update js dependencies\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/facelessuser/pymdown-extensions/commit/195228a75fb7b739275ff3af1a6f343e51cf1bf9\"\u003e\u003ccode\u003e195228a\u003c/code\u003e\u003c/a\u003e Fix lint\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/facelessuser/pymdown-extensions/commit/ff07dc2722d1ea9c1fc780355fd39b329929570a\"\u003e\u003ccode\u003eff07dc2\u003c/code\u003e\u003c/a\u003e Drop Python 3.10 support\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/facelessuser/pymdown-extensions/commit/848c5029ada0a8c13bf725c3421ddbd2633fb1eb\"\u003e\u003ccode\u003e848c502\u003c/code\u003e\u003c/a\u003e Add title mode configuration to SuperFences and Highlight\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/facelessuser/pymdown-extensions/commit/881c052ff78a87ed02d263239a6c08e0d12f9ed4\"\u003e\u003ccode\u003e881c052\u003c/code\u003e\u003c/a\u003e Tilde/Caret punctuation rule adjustments (\u003ca href=\"https://redirect.github.com/facelessuser/pymdown-extensions/issues/2986\"\u003e#2986\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/facelessuser/pymdown-extensions/compare/12.1...12.2\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `zensical` from 0.0.67 to 0.0.69\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/zensical/zensical/releases\"\u003ezensical's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e0.0.69\u003c/h2\u003e\n\u003ch2\u003eSummary\u003c/h2\u003e\n\u003cp\u003eThis version adds MkDocs plugin replacements for \u003ccode\u003enav-weight\u003c/code\u003e and \u003ccode\u003emarkdownextradata\u003c/code\u003e, improves symlink watching, fixes minification crashes with Unicode, and preserves emojis in \u003ccode\u003ellmstxt\u003c/code\u003e exports.\u003c/p\u003e\n\u003cp\u003eThe user interface is updated to \u003ca href=\"https://github.com/zensical/ui/releases/tag/v0.0.36\"\u003ev0.0.36\u003c/a\u003e, improving navigation spacing and fixing instant navigation.\u003c/p\u003e\n\u003ch2\u003eChangelog\u003c/h2\u003e\n\u003ch3\u003eFeatures\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e2225649 \u003cstrong\u003ezensical\u003c/strong\u003e, \u003cstrong\u003ecompat\u003c/strong\u003e – support mkdocs-nav-weight plugin\u003c/li\u003e\n\u003cli\u003e8e96dd1 \u003cstrong\u003ecompat\u003c/strong\u003e – support mkdocs-markdownextradata plugin\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eBug fixes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e3f5f089 \u003cstrong\u003ezensical\u003c/strong\u003e – preserve emojis in llmstxt output (\u003ca href=\"https://redirect.github.com/zensical/zensical/issues/1019\"\u003e#1019\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e389ad14 \u003cstrong\u003eui\u003c/strong\u003e – update ui to v0.0.36\u003c/li\u003e\n\u003cli\u003eb976a85 \u003cstrong\u003ezensical\u003c/strong\u003e, \u003cstrong\u003ecompat\u003c/strong\u003e – don't panic on multi-byte characters in HTML attribute values during minification (\u003ca href=\"https://redirect.github.com/zensical/zensical/issues/1013\"\u003e#1013\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e7b22d2a \u003cstrong\u003ezensical-watch\u003c/strong\u003e, \u003cstrong\u003ecompat\u003c/strong\u003e – include all files from watched directory symlinks\u003c/li\u003e\n\u003cli\u003e4924fea \u003cstrong\u003ezensical\u003c/strong\u003e, \u003cstrong\u003ecompat\u003c/strong\u003e – handle symlinked files in watched dependencies (\u003ca href=\"https://redirect.github.com/zensical/zensical/issues/1010\"\u003e#1010\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e0.0.68\u003c/h2\u003e\n\u003ch2\u003eSummary\u003c/h2\u003e\n\u003cp\u003eThis version adds native replacements for the \u003ccode\u003eaudio\u003c/code\u003e and \u003ccode\u003evideo\u003c/code\u003e MkDocs plugins and improves compatibility with the \u003ccode\u003emacros\u003c/code\u003e plugin. The user interface is updated to \u003ca href=\"https://github.com/zensical/ui/releases/tag/v0.0.35\"\u003ev0.0.35\u003c/a\u003e, bringing instant navigation to search results, consistent skip links, and corrected accessibility labels for overlays and progress indicators.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ePython 3.11 or newer is now required.\u003c/strong\u003e Support for Python 3.10 has been removed.\u003c/p\u003e\n\u003ch2\u003eChangelog\u003c/h2\u003e\n\u003ch3\u003eFeatures\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e00fe88a \u003cstrong\u003ecompat\u003c/strong\u003e – add \u003ccode\u003eaudio\u003c/code\u003e and \u003ccode\u003evideo\u003c/code\u003e MkDocs plugin replacement\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eBug fixes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e7662853 \u003cstrong\u003eui\u003c/strong\u003e – update ui to v0.0.35\u003c/li\u003e\n\u003cli\u003eacee50c \u003cstrong\u003ezensical\u003c/strong\u003e, \u003cstrong\u003ecompat\u003c/strong\u003e – mirror \u003ccode\u003emacros\u003c/code\u003e plugin behavior more closely (\u003ca href=\"https://redirect.github.com/zensical/zensical/issues/999\"\u003e#999\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/zensical/zensical/commit/de3702c2df5257c42501163af0afbd765714824a\"\u003e\u003ccode\u003ede3702c\u003c/code\u003e\u003c/a\u003e chore: release v0.0.69\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/zensical/zensical/commit/3f5f0895abf829110e69d79aed666ba8e127974d\"\u003e\u003ccode\u003e3f5f089\u003c/code\u003e\u003c/a\u003e fix: preserve emojis in llmstxt output (\u003ca href=\"https://redirect.github.com/zensical/zensical/issues/1019\"\u003e#1019\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/zensical/zensical/commit/389ad141a22430a1c7b26952ede61ec4a2d82484\"\u003e\u003ccode\u003e389ad14\u003c/code\u003e\u003c/a\u003e fix: update ui to v0.0.36\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/zensical/zensical/commit/b976a85ae8ed628577fbb3c5b2604ab4cb3db9e2\"\u003e\u003ccode\u003eb976a85\u003c/code\u003e\u003c/a\u003e fix: don't panic on multi-byte characters in HTML attribute values during min...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/zensical/zensical/commit/7b22d2a7d6fd9e017d87143781cd86bd6a7a737f\"\u003e\u003ccode\u003e7b22d2a\u003c/code\u003e\u003c/a\u003e fix: include all files from watched directory symlinks\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/zensical/zensical/commit/222564914708c532dd189e4d5647becdd1d56648\"\u003e\u003ccode\u003e2225649\u003c/code\u003e\u003c/a\u003e feature: support mkdocs-nav-weight plugin\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/zensical/zensical/commit/4924feab39077d72c99c19a33a76fad261f9252d\"\u003e\u003ccode\u003e4924fea\u003c/code\u003e\u003c/a\u003e fix: handle symlinked files in watched dependencies (\u003ca href=\"https://redirect.github.com/zensical/zensical/issues/1010\"\u003e#1010\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/zensical/zensical/commit/8e96dd1038e2f6a86e2f4873a38b9a8b55d2d72d\"\u003e\u003ccode\u003e8e96dd1\u003c/code\u003e\u003c/a\u003e feature: support mkdocs-markdownextradata plugin\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/zensical/zensical/commit/d210186d9d3656238697c3a2ee529807d3496c2d\"\u003e\u003ccode\u003ed210186\u003c/code\u003e\u003c/a\u003e chore: release v0.0.68\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/zensical/zensical/commit/00fe88abf71a02a2c6c19f29812e5d1347c99b4a\"\u003e\u003ccode\u003e00fe88a\u003c/code\u003e\u003c/a\u003e feature: add audio and video media extension\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/zensical/zensical/compare/v0.0.67...v0.0.69\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `mypy` from 2.3.1 to 2.4.0\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/python/mypy/blob/master/CHANGELOG.md\"\u003emypy's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003eMypy Release Notes\u003c/h1\u003e\n\u003ch2\u003eNext Release\u003c/h2\u003e\n\u003ch2\u003eMypy 2.4\u003c/h2\u003e\n\u003cp\u003eWe've just uploaded mypy 2.4.0 to the Python Package Index (\u003ca href=\"https://pypi.org/project/mypy/\"\u003ePyPI\u003c/a\u003e).\nMypy is a static type checker for Python. This release includes new features, performance\nimprovements and bug fixes. You can install it as follows:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003epython3 -m pip install -U mypy\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eYou can read the full documentation for this release on \u003ca href=\"http://mypy.readthedocs.io\"\u003eRead the Docs\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003ePython 3.15 Support\u003c/h3\u003e\n\u003cp\u003eMypy 2.4 supports running on Python 3.15 and type checking most Python\n3.15 features. This includes the new builtin \u003ccode\u003esentinel\u003c/code\u003e type for\nsentinel values (PEP 661), which mypy now supports (see below for\ndetails). Lazy imports (PEP 810) and unpacking in comprehensions\n(PEP 798) are also supported. Closed TypedDicts (PEP 728) have been\nsupported since mypy 2.2, but the \u003ccode\u003eextra_items\u003c/code\u003e TypedDict argument,\nalso introduced in PEP 728, is still unsupported. Support for\n\u003ccode\u003eextra_items\u003c/code\u003e will be added in a future mypy release.\u003c/p\u003e\n\u003ch3\u003eNative Parser Enabled by Default\u003c/h3\u003e\n\u003cp\u003eMypy now uses the new native parser by default. It's based on the Ruff\nparser, and it's significantly faster than the legacy parser, which\nuses the stdlib \u003ccode\u003east\u003c/code\u003e module. The native parser also has other\nbenefits:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eYou can target newer Python versions and use recent Python syntax\neven when running mypy on an older Python version. For example, you\ncan use \u003ccode\u003e--python-version 3.15\u003c/code\u003e when running mypy on Python 3.14.\u003c/li\u003e\n\u003cli\u003eStub files can use syntax that is newer than the target Python\nversion. For example, stubs can use the PEP 695 generic class syntax\n(\u003ccode\u003eclass Box[T]: ...\u003c/code\u003e) when running on or targeting Python 3.10.\u003c/li\u003e\n\u003cli\u003eParallel type checking requires the native parser.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe legacy parser is still available through \u003ccode\u003e--no-native-parser\u003c/code\u003e, or\n\u003ccode\u003enative_parser = False\u003c/code\u003e in the config file (\u003ccode\u003enative_parser = false\u003c/code\u003e\nunder \u003ccode\u003e[tool.mypy]\u003c/code\u003e in pyproject.toml). We are planning to remove the\nlegacy parser in early 2027. If you run into a problem with the native\nparser, please report it on the\n\u003ca href=\"https://github.com/python/mypy/issues\"\u003eissue tracker\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eUnlike the legacy parser, the native parser doesn't support type\ncomments for variables defined by \u003ccode\u003efor\u003c/code\u003e and \u003ccode\u003ewith\u003c/code\u003e statements. These\ntype comments are silently ignored, and the types of the variables are\u003c/p\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/935ba8afba7ceacca0651579450c74339f343016\"\u003e\u003ccode\u003e935ba8a\u003c/code\u003e\u003c/a\u003e Bump version to 2.4.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/334a678967dc6bcda3d3f8cb82e253dd61fa2be9\"\u003e\u003ccode\u003e334a678\u003c/code\u003e\u003c/a\u003e Add link for PR 22066 in mypy 2.4 changelog (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22082\"\u003e#22082\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/fe69660bcdaa76cccb1aedbb4b9c1c7627215571\"\u003e\u003ccode\u003efe69660\u003c/code\u003e\u003c/a\u003e Finalize mypy 2.4 changelog (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22080\"\u003e#22080\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/541fd87ac53581fb3c511b277fd780ec4e869c95\"\u003e\u003ccode\u003e541fd87\u003c/code\u003e\u003c/a\u003e Various mypy 2.4 changelog updates (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22077\"\u003e#22077\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/b231182c0b2993918f74594236bda7d3ec6fcbe5\"\u003e\u003ccode\u003eb231182\u003c/code\u003e\u003c/a\u003e Update native parser docs (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22078\"\u003e#22078\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/04fe42ce217f120a4de2c1fd62b71ef77452d699\"\u003e\u003ccode\u003e04fe42c\u003c/code\u003e\u003c/a\u003e Initial Changelog for Mypy 2.4 (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22071\"\u003e#22071\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/06174941bca0e88567441ee3cb0ffaef0dd22e2c\"\u003e\u003ccode\u003e0617494\u003c/code\u003e\u003c/a\u003e Quick fix for non UTF-8 encodings with new parser (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22066\"\u003e#22066\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/b2f9b60eae5ac7cd9c6a60650b128815bb703daf\"\u003e\u003ccode\u003eb2f9b60\u003c/code\u003e\u003c/a\u003e Bump librt to 0.16.0 (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22067\"\u003e#22067\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/9d798dcb9589f9bd62e625a97d8db23ad9a678fa\"\u003e\u003ccode\u003e9d798dc\u003c/code\u003e\u003c/a\u003e Sync typeshed (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22054\"\u003e#22054\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/0861bb6450d6d3658e44dbca9cd2ba478faf3c1d\"\u003e\u003ccode\u003e0861bb6\u003c/code\u003e\u003c/a\u003e Reduce max protocol stack size to 20 (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22053\"\u003e#22053\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/python/mypy/compare/v2.3.1...v2.4.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `ruff` from 0.16.10 to 0.17.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/astral-sh/ruff/releases\"\u003eruff's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e0.17.0\u003c/h2\u003e\n\u003ch2\u003eRelease Notes\u003c/h2\u003e\n\u003cp\u003eReleased on 2026-10-09.\u003c/p\u003e\n\u003cp\u003eThe executables in our macOS and Windows release archives and \u003ccode\u003eruff\u003c/code\u003e wheels are now code-signed. macOS executables are signed with an Apple Developer ID certificate and notarized by Apple. Windows executables have timestamped Authenticode signatures from Azure Artifact Signing. This enables verification of the release publisher and binary integrity, supports publisher-based allowlisting, and should reduce security warnings and antivirus false positives.\u003c/p\u003e\n\u003ch3\u003eBreaking changes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate the default and latest Python versions for 3.15 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28792\"\u003e#28792\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eRuff now defaults to Python 3.11 instead of 3.10 when no Python version is configured through \u003ca href=\"https://docs.astral.sh/ruff/settings/#target-version\"\u003e\u003ccode\u003etarget-version\u003c/code\u003e\u003c/a\u003e or \u003ca href=\"https://docs.astral.sh/ruff/configuration/#inferring-the-python-version\"\u003e\u003ccode\u003erequires-python\u003c/code\u003e\u003c/a\u003e. When checking for syntax errors without a configured Python version, Ruff now defaults to Python 3.15 instead of 3.14.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate the default rule set (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28786\"\u003e#28786\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eSeveral of the \u003ccode\u003eflake8-datetimez\u003c/code\u003e rules (\u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-without-tzinfo/\"\u003e\u003ccode\u003eDTZ001\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-now-without-tzinfo/\"\u003e\u003ccode\u003eDTZ005\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-fromtimestamp/\"\u003e\u003ccode\u003eDTZ006\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-strptime-without-zone/\"\u003e\u003ccode\u003eDTZ007\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://docs.astral.sh/ruff/rules/call-date-today/\"\u003e\u003ccode\u003eDTZ011\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://docs.astral.sh/ruff/rules/call-date-fromtimestamp/\"\u003e\u003ccode\u003eDTZ012\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://docs.astral.sh/ruff/rules/datetime-min-max/\"\u003e\u003ccode\u003eDTZ901\u003c/code\u003e\u003c/a\u003e) are no longer enabled by default, while \u003ca href=\"https://docs.astral.sh/ruff/rules/undefined-local-with-nested-import-star-usage/\"\u003e\u003ccode\u003eundefined-local-with-nested-import-star-usage\u003c/code\u003e\u003c/a\u003e (\u003ccode\u003eF406\u003c/code\u003e), which corresponds to a syntax error, is now enabled by default.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate Rust crate quick-junit to 0.8.0 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/27295\"\u003e#27295\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eJUnit output now uses a \u003ccode\u003eskipped\u003c/code\u003e attribute instead of \u003ccode\u003edisabled\u003c/code\u003e on \u003ccode\u003e\u0026lt;testsuite\u0026gt;\u003c/code\u003e elements and includes a \u003ccode\u003eskipped\u003c/code\u003e attribute on the root \u003ccode\u003e\u0026lt;testsuites\u0026gt;\u003c/code\u003e element.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e[\u003ccode\u003eflake8-import-conventions\u003c/code\u003e] Add \u003ccode\u003edatetime as dt\u003c/code\u003e as a conventional alias (\u003ccode\u003eICN001\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28790\"\u003e#28790\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSupport Unicode dummy variable names (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28722\"\u003e#28722\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eThe default \u003ca href=\"https://docs.astral.sh/ruff/settings/#lint_dummy-variable-rgx\"\u003e\u003ccode\u003elint.dummy-variable-rgx\u003c/code\u003e\u003c/a\u003e now recognizes underscore-prefixed Unicode names, such as \u003ccode\u003e_次\u003c/code\u003e, as dummy variables.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate to Unicode 17 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/21229\"\u003e#21229\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28784\"\u003e#28784\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eRuff now uses Unicode 17 data for identifier normalization and named character escapes (\u003ccode\u003e\u0026quot;\\N{...}\u0026quot;\u003c/code\u003e).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAlways show unsafe and display-only fixes in the CLI (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/27810\"\u003e#27810\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eThe default \u003ccode\u003efull\u003c/code\u003e output format now shows unsafe fixes and suggestions requiring manual review, regardless of the \u003ca href=\"https://docs.astral.sh/ruff/settings/#unsafe-fixes\"\u003e\u003ccode\u003eunsafe-fixes\u003c/code\u003e\u003c/a\u003e setting. Actually applying unsafe fixes still requires explicit opt-in.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRemove the Python dependency from conda-forge builds (\u003ca href=\"https://redirect.github.com/conda-forge/ruff-feedstock/pull/361\"\u003econda-forge/ruff-feedstock#361\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eThe conda-forge build no longer depends on Python, now supports linux-riscv64, win-arm64, and linux-ppc64le platforms, and now includes shell completions. However, no longer depending on Python means that \u003ccode\u003epython -m ruff\u003c/code\u003e and \u003ccode\u003eimport ruff\u003c/code\u003e will no longer work. Use \u003ccode\u003eruff\u003c/code\u003e directly from \u003ccode\u003ePATH\u003c/code\u003e instead. PyPI installations and those from the standalone installer are unaffected.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRemove support for ruff-lsp (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28750\"\u003e#28750\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eSupport for \u003ccode\u003eruff-lsp\u003c/code\u003e, the legacy Python language server \u003ca href=\"https://github.com/astral-sh/ruff/releases/tag/0.9.5\"\u003edeprecated in Ruff v0.9.5\u003c/a\u003e, has been removed. The Ruff VS Code extension now always uses the native language server; \u003ccode\u003eruff.nativeServer\u003c/code\u003e is deprecated and ignored. See the \u003ca href=\"https://docs.astral.sh/ruff/editors/migration/\"\u003emigration guide\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eStabilization\u003c/h3\u003e\n\u003cp\u003eThe following rules have been stabilized and are no longer in preview:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://docs.astral.sh/ruff/rules/lazy-import-mismatch\"\u003e\u003ccode\u003elazy-import-mismatch\u003c/code\u003e\u003c/a\u003e (\u003ccode\u003eTID254\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://docs.astral.sh/ruff/rules/lazy-import-immediately-resolved\"\u003e\u003ccode\u003elazy-import-immediately-resolved\u003c/code\u003e\u003c/a\u003e (\u003ccode\u003eTID255\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://docs.astral.sh/ruff/rules/os-path-commonprefix\"\u003e\u003ccode\u003eos-path-commonprefix\u003c/code\u003e\u003c/a\u003e (\u003ccode\u003eRUF071\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md\"\u003eruff's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e0.17.0\u003c/h2\u003e\n\u003cp\u003eReleased on 2026-10-09.\u003c/p\u003e\n\u003cp\u003eThe executables in our macOS and Windows release archives and \u003ccode\u003eruff\u003c/code\u003e wheels are now code-signed.\nmacOS executables are signed with an Apple Developer ID certificate and notarized by Apple. Windows\nexecutables have timestamped Authenticode signatures from Azure Artifact Signing. This enables\nverification of the release publisher and binary integrity, supports publisher-based allowlisting,\nand should reduce security warnings and antivirus false positives.\u003c/p\u003e\n\u003ch3\u003eBreaking changes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate the default and latest Python versions for 3.15 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28792\"\u003e#28792\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eRuff now defaults to Python 3.11 instead of 3.10 when no Python version is configured through\n\u003ca href=\"https://docs.astral.sh/ruff/settings/#target-version\"\u003e\u003ccode\u003etarget-version\u003c/code\u003e\u003c/a\u003e or\n\u003ca href=\"https://docs.astral.sh/ruff/configuration/#inferring-the-python-version\"\u003e\u003ccode\u003erequires-python\u003c/code\u003e\u003c/a\u003e. When\nchecking for syntax errors without a configured Python version, Ruff now defaults to Python 3.15\ninstead of 3.14.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate the default rule set (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28786\"\u003e#28786\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eSeveral of the \u003ccode\u003eflake8-datetimez\u003c/code\u003e rules\n(\u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-without-tzinfo/\"\u003e\u003ccode\u003eDTZ001\u003c/code\u003e\u003c/a\u003e,\n\u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-now-without-tzinfo/\"\u003e\u003ccode\u003eDTZ005\u003c/code\u003e\u003c/a\u003e,\n\u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-fromtimestamp/\"\u003e\u003ccode\u003eDTZ006\u003c/code\u003e\u003c/a\u003e,\n\u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-strptime-without-zone/\"\u003e\u003ccode\u003eDTZ007\u003c/code\u003e\u003c/a\u003e,\n\u003ca href=\"https://docs.astral.sh/ruff/rules/call-date-today/\"\u003e\u003ccode\u003eDTZ011\u003c/code\u003e\u003c/a\u003e,\n\u003ca href=\"https://docs.astral.sh/ruff/rules/call-date-fromtimestamp/\"\u003e\u003ccode\u003eDTZ012\u003c/code\u003e\u003c/a\u003e, and\n\u003ca href=\"https://docs.astral.sh/ruff/rules/datetime-min-max/\"\u003e\u003ccode\u003eDTZ901\u003c/code\u003e\u003c/a\u003e) are no longer enabled by default,\nwhile \u003ca href=\"https://docs.astral.sh/ruff/rules/undefined-local-with-nested-import-star-usage/\"\u003e\u003ccode\u003eundefined-local-with-nested-import-star-usage\u003c/code\u003e\u003c/a\u003e\n(\u003ccode\u003eF406\u003c/code\u003e), which corresponds to a syntax error, is now enabled by default.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate Rust crate quick-junit to 0.8.0 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/27295\"\u003e#27295\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eJUnit output now uses a \u003ccode\u003eskipped\u003c/code\u003e attribute instead of \u003ccode\u003edisabled\u003c/code\u003e on \u003ccode\u003e\u0026lt;testsuite\u0026gt;\u003c/code\u003e elements and\nincludes a \u003ccode\u003eskipped\u003c/code\u003e attribute on the root \u003ccode\u003e\u0026lt;testsuites\u0026gt;\u003c/code\u003e element.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e[\u003ccode\u003eflake8-import-conventions\u003c/code\u003e] Add \u003ccode\u003edatetime as dt\u003c/code\u003e as a conventional alias (\u003ccode\u003eICN001\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28790\"\u003e#28790\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSupport Unicode dummy variable names (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28722\"\u003e#28722\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eThe default \u003ca href=\"https://docs.astral.sh/ruff/settings/#lint_dummy-variable-rgx\"\u003e\u003ccode\u003elint.dummy-variable-rgx\u003c/code\u003e\u003c/a\u003e\nnow recognizes underscore-prefixed Unicode names, such as \u003ccode\u003e_次\u003c/code\u003e, as dummy variables.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate to Unicode 17 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/21229\"\u003e#21229\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28784\"\u003e#28784\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eRuff now uses Unicode 17 data for identifier normalization and named character escapes (\u003ccode\u003e\u0026quot;\\N{...}\u0026quot;\u003c/code\u003e).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAlways show unsafe and display-only fixes in the CLI (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/27810\"\u003e#27810\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/5b27c1ccfaa230fb195855f5cf3404a21e3379cd\"\u003e\u003ccode\u003e5b27c1c\u003c/code\u003e\u003c/a\u003e Bump version to 0.17.0 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/29259\"\u003e#29259\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/8f362bf4cb5dbad095ac416602496705d41fc843\"\u003e\u003ccode\u003e8f362bf\u003c/code\u003e\u003c/a\u003e Integrate vendored Unicode names into Ruff\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/88a50d695c1142294bb4c780fad47d3306173885\"\u003e\u003ccode\u003e88a50d6\u003c/code\u003e\u003c/a\u003e Revert upstream Unicode loose matching\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/276832aa91f2086a6ec880884fcdd987991cddf2\"\u003e\u003ccode\u003e276832a\u003c/code\u003e\u003c/a\u003e Revert upstream Unicode alias normalization\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/26911caa2800758779965510d2f222b438abbb38\"\u003e\u003ccode\u003e26911ca\u003c/code\u003e\u003c/a\u003e Vendor unicode_names2 from upstream\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/27e3797508d1a7ad69e4900d51e38d78785aaf73\"\u003e\u003ccode\u003e27e3797\u003c/code\u003e\u003c/a\u003e [\u003ccode\u003eruff\u003c/code\u003e] Stabilize \u003ccode\u003eos-path-commonprefix\u003c/code\u003e (\u003ccode\u003eRUF071\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/28764\"\u003e#28764\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/bbb52c1267cf39aba67e54c2b5800878d23073a9\"\u003e\u003ccode\u003ebbb52c1\u003c/code\u003e\u003c/a\u003e [\u003ccode\u003eflake8-tidy-imports\u003c/code\u003e] Stabilize \u003ccode\u003elazy-import-immediately-resolved\u003c/code\u003e (`TID255...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/5aa9cbd3a49d32b24ac21fa7797ca87a330792a2\"\u003e\u003ccode\u003e5aa9cbd\u003c/code\u003e\u003c/a\u003e [\u003ccode\u003eflake8-tidy-imports\u003c/code\u003e] Stabilize \u003ccode\u003elazy-import-mismatch\u003c/code\u003e (\u003ccode\u003eTID254\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/28760\"\u003e#28760\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/dba1bc893aedfeea2064c4e8e764135f0d44dc3f\"\u003e\u003ccode\u003edba1bc8\u003c/code\u003e\u003c/a\u003e [\u003ccode\u003eflake8-import-conventions\u003c/code\u003e] Add \u003ccode\u003edatetime as dt\u003c/code\u003e as a conventional alias (`...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/ef23c9c39eb3029bab0139c3ea7ae6d95c4131e0\"\u003e\u003ccode\u003eef23c9c\u003c/code\u003e\u003c/a\u003e Update default and latest Python versions for 3.15 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/28792\"\u003e#28792\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/astral-sh/ruff/compare/0.16.10...0.17.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `ty` from 0.0.84 to 0.0.86\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/astral-sh/ty/releases\"\u003ety's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e0.0.86\u003c/h2\u003e\n\u003ch2\u003eRelease Notes\u003c/h2\u003e\n\u003cp\u003eReleased on 2026-10-09.\u003c/p\u003e\n\u003cp\u003eThe executables in our macOS and Windows release archives and \u003ccode\u003ety\u003c/code\u003e wheels are now code-signed. macOS executables are signed with an Apple Developer ID certificate and notarized by Apple. Windows executables have timestamped Authenticode signatures from Azure Artifact Signing. This enables verification of the release publisher and binary integrity, supports publisher-based allowlisting, and should reduce security warnings and antivirus false positives.\u003c/p\u003e\n\u003ch3\u003eBug fixes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eInfer empty collection branches from nonempty literals (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29131\"\u003e#29131\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eInvalidate dependency metadata when environments change (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29126\"\u003e#29126\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ePreserve final attribute restrictions on composite types (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29135\"\u003e#29135\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ePreserve recursive structure in \u003ccode\u003eAnnotated\u003c/code\u003e values (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29058\"\u003e#29058\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSpecialize inherited dataclass field converters (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29192\"\u003e#29192\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eLSP server\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eShow documentation for annotation operators on hover (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29185\"\u003e#29185\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eCore type checking\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eCheck attribute and property override types (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28556\"\u003e#28556\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eNarrow tuple unions through truthiness and type checks (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29125\"\u003e#29125\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ePreserve literal types when consuming dictionary literals (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29145\"\u003e#29145\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ePreserve non-boolean comparison results for intersections (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28045\"\u003e#28045\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ePreserve receiver specializations when calling unions of bound methods (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29015\"\u003e#29015\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eRepresent uninhabited truthiness explicitly (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28843\"\u003e#28843\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSolve validity type context through constraint sets (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28909\"\u003e#28909\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003ePerformance\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAvoid recursion guards for non-generic nominal targets (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29202\"\u003e#29202\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eCheck exact exclusions before intersection positives (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29195\"\u003e#29195\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eMemory usage improvements\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eShare constraints in retained sequent maps (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28966\"\u003e#28966\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eOther changes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eUpdate the default Python version to 3.15 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28792\"\u003e#28792\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eUpdate to Unicode 17 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/21229\"\u003e#21229\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28784\"\u003e#28784\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAlways show fixes in the CLI (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/27810\"\u003e#27810\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eContributors\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gorewilliams\"\u003e\u003ccode\u003e@​gorewilliams\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/carljm\"\u003e\u003ccode\u003e@​carljm\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/AlexWaygood\"\u003e\u003ccode\u003e@​AlexWaygood\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/ibraheemdev\"\u003e\u003ccode\u003e@​ibraheemdev\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/astral-sh/ty/blob/main/CHANGELOG.md\"\u003ety's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e0.0.86\u003c/h2\u003e\n\u003cp\u003eReleased on 2026-10-09.\u003c/p\u003e\n\u003cp\u003eThe executables in our macOS and Windows release archives and \u003ccode\u003ety\u003c/code\u003e wheels are now code-signed.\nmacOS executables are signed with an Apple Developer ID certificate and notarized by Apple. Windows\nexecutables have timestamped Authenticode signatures from Azure Artifact Signing. This enables\nverification of the release publisher and binary integrity, supports publisher-based allowlisting,\nand should reduce security warnings and antivirus false positives.\u003c/p\u003e\n\u003ch3\u003eBug fixes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eInfer empty collection branches from nonempty literals (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29131\"\u003e#29131\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eInvalidate dependency metadata when environments change (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29126\"\u003e#29126\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ePreserve final attribute restrictions on composite types (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29135\"\u003e#29135\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ePreserve recursive structure in \u003ccode\u003eAnnotated\u003c/code\u003e values (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29058\"\u003e#29058\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSpecialize inherited dataclass field converters (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29192\"\u003e#29192\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eLSP server\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eShow documentation for annotation operators on hover (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29185\"\u003e#29185\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eCore type checking\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eCheck attribute and property override types (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28556\"\u003e#28556\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eNarrow tuple unions through truthiness and type checks (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29125\"\u003e#29125\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ePreserve literal types when consuming dictionary literals (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29145\"\u003e#29145\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ePreserve non-boolean comparison results for intersections (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28045\"\u003e#28045\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ePreserve receiver specializations when calling unions of bound methods (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29015\"\u003e#29015\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eRepresent uninhabited truthiness explicitly (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28843\"\u003e#28843\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSolve validity type context through constraint sets (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28909\"\u003e#28909\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003ePerformance\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAvoid recursion guards for non-generic nominal targets (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29202\"\u003e#29202\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eCheck exact exclusions before intersection positives (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29195\"\u003e#29195\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eMemory usage improvements\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eShare constraints in retained sequent maps (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28966\"\u003e#28966\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eOther changes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eUpdate the default Python version to 3.15 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28792\"\u003e#28792\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eUpdate to Unicode 17 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/21229\"\u003e#21229\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28784\"\u003e#28784\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAlways show fixes in the CLI (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/27810\"\u003e#27810\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eContributors\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gorewilliams\"\u003e\u003ccode\u003e@​gorewilliams\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ty/commit/d5da069f4973382a75882de35f57b0ffd9386420\"\u003e\u003ccode\u003ed5da069\u003c/code\u003e\u003c/a\u003e Authenticate Docker Hub pulls (\u003ca href=\"https://redirect.github.com/astral-sh/ty/issues/4702\"\u003e#4702\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ty/commit/00606fa76854e7690fa91cd4b9e66c88994e1144\"\u003e\u003ccode\u003e00606fa\u003c/code\u003e\u003c/a\u003e Use Namespace for macOS x86-64 release builds (\u003ca href=\"https://redirect.github.com/astral-sh/ty/issues/4700\"\u003e#4700\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ty/commit/796950520db578977a6a6326680e8a32b89d4f02\"\u003e\u003ccode\u003e7969505\u003c/code\u003e\u003c/a\u003e Bump version to 0.0.86 (\u003ca href=\"https://redirect.github.com/astral-sh/ty/issues/4699\"\u003e#4699\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ty/commit/8e2fa958c296301b4b4576f19dc009daeb61e214\"\u003e\u003ccode\u003e8e2fa95\u003c/code\u003e\u003c/a\u003e Sync the Rust toolchain with the Ruff submodule (\u003ca href=\"https://redirect.github.com/astral-sh/ty/issues/4701\"\u003e#4701\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ty/commit/9602924a42d666d610a83f2b8cb9ec00edb3be7c\"\u003e\u003ccode\u003e9602924\u003c/code\u003e\u003c/a\u003e [ty] Use shared release signing actions (\u003ca href=\"https://redirect.github.com/astral-sh/ty/issues/4652\"\u003e#4652\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ty/commit/23f569b87b1ef38759022f6acde0aacc0270e8cc\"\u003e\u003ccode\u003e23f569b\u003c/code\u003e\u003c/a\u003e Document module and Python environment discovery (\u003ca href=\"https://redirect.github.com/astral-sh/ty/issues/4635\"\u003e#4635\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ty/commit/7300c73ec9a9ac2c526c204cb233653c461643d7\"\u003e\u003ccode\u003e7300c73\u003c/code\u003e\u003c/a\u003e Update prek dependencies (\u003ca href=\"https://redirect.github.com/astral-sh/ty/issues/4682\"\u003e#4682\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ty/commit/ac2d7f1141af60ce5baf813cc3127613ca85d152\"\u003e\u003ccode\u003eac2d7f1\u003c/code\u003e\u003c/a\u003e Update dependency prek to v0.5.2 (\u003ca href=\"https://redirect.github.com/astral-sh/ty/issues/4681\"\u003e#4681\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ty/commit/d7fc5ef8837c0a012a7efd187649d448532f8ff0\"\u003e\u003ccode\u003ed7fc5ef\u003c/code\u003e\u003c/a\u003e Bump version to 0.0.85 (\u003ca href=\"https://redirect.github.com/astral-sh/ty/issues/4679\"\u003e#4679\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ty/commit/bc4fd9e2af313138780598653483e5722a11f962\"\u003e\u003ccode\u003ebc4fd9e\u003c/code\u003e\u003c/a\u003e Include reproducers in daily fuzz issues (\u003ca href=\"https://redirect.github.com/astral-sh/ty/issues/4671\"\u003e#4671\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/astral-sh/ty/compare/0.0.84...0.0.86\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `tox` from 4.64.5 to 4.65.2\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/tox/releases\"\u003etox's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev4.65.2\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e🐛 fix(python): fail a dependency_groups run with no pyproject.toml to read by \u003ca href=\"https://github.com/feiiiiii5\"\u003e\u003ccode\u003e@​feiiiiii5\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/tox/pull/4142\"\u003etox-dev/tox#4142\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelo...\n\n_Description has been truncated_","html_url":"https://github.com/posita/dyce/pull/95","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/posita%2Fdyce/issues/95","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/95/packages"},{"uuid":"5898354249","node_id":"PR_kwDOM0lWjc8AAAABJBErmQ","number":321,"state":"closed","title":"build(deps): bump virtualenv from 20.36.1 to 21.7.13 in /pulumi in the uv group across 1 directory","user":"dependabot[bot]","labels":["dependencies","python:uv"],"assignees":[],"locked":false,"comments_count":2,"pull_request":true,"closed_at":"2026-10-17T12:35:52.000Z","author_association":null,"state_reason":null,"created_at":"2026-10-17T12:33:07.000Z","updated_at":"2026-10-17T12:35:54.000Z","time_to_close":165,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"build(deps)","packages":[{"name":"virtualenv","old_version":"20.36.1","new_version":"21.7.13","repository_url":"https://github.com/pypa/virtualenv"}],"path":"/pulumi in the uv group across 1 directory","ecosystem":"pip"},"body":"Bumps the uv group with 1 update in the /pulumi directory: [virtualenv](https://github.com/pypa/virtualenv).\n\nUpdates `virtualenv` from 20.36.1 to 21.7.13\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pypa/virtualenv/releases\"\u003evirtualenv's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e21.7.13\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e👷 ci: correct a stale checkout pin comment by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3254\"\u003epypa/virtualenv#3254\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🔧 chore: drop misc as a changelog fragment type by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3255\"\u003epypa/virtualenv#3255\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e👷 ci: scope the nushell apt key to its own repo by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3253\"\u003epypa/virtualenv#3253\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(activation): stop path command injection in bash and fish by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3252\"\u003epypa/virtualenv#3252\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.7.12...21.7.13\"\u003ehttps://github.com/pypa/virtualenv/compare/21.7.12...21.7.13\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e21.7.12\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e🔧 chore(changelog): drop dead CVE-2026-24049 fragment by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3249\"\u003epypa/virtualenv#3249\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(activation): escape batch quote() against injection by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3250\"\u003epypa/virtualenv#3250\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(seed): verify downloaded wheel digests by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3251\"\u003epypa/virtualenv#3251\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.7.11...21.7.12\"\u003ehttps://github.com/pypa/virtualenv/compare/21.7.11...21.7.12\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e21.7.11\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eAdd OpenSSF Scorecard workflow by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3238\"\u003epypa/virtualenv#3238\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eDocument AI-assisted contributions and licensing policy by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3239\"\u003epypa/virtualenv#3239\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e👷 ci(release): attest and sign release provenance by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3242\"\u003epypa/virtualenv#3242\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e👷 ci: harden Scorecard-scored checks in CI by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3241\"\u003epypa/virtualenv#3241\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(ci): parallelize graalpy tests, recover crashed workers by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3240\"\u003epypa/virtualenv#3240\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(ci): mark real-shell activation tests as slow by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3243\"\u003epypa/virtualenv#3243\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e👷 ci: run macOS jobs on macos-26 by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3244\"\u003epypa/virtualenv#3244\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(activation): undo a live activation before activate.bat saves values by \u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3245\"\u003epypa/virtualenv#3245\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(create): keep pyvenv.cfg values on a single line by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3247\"\u003epypa/virtualenv#3247\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🔧 chore(test): add opt-in Atheris fuzz harness by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3246\"\u003epypa/virtualenv#3246\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e📝 docs(readme): add OpenSSF Best Practices badge by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3248\"\u003epypa/virtualenv#3248\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.7.10...21.7.11\"\u003ehttps://github.com/pypa/virtualenv/compare/21.7.10...21.7.11\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e21.7.10\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e🔧 chore: check spelling with typos in pre-commit by \u003ca href=\"https://github.com/even-even\"\u003e\u003ccode\u003e@​even-even\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3235\"\u003epypa/virtualenv#3235\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(activation): keep and restore the user's TCL_LIBRARY and TK_LIBRARY by \u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3234\"\u003epypa/virtualenv#3234\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(create): skip blank and comment lines in pyvenv.cfg by \u003ca href=\"https://github.com/r3wretrhy\"\u003e\u003ccode\u003e@​r3wretrhy\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3232\"\u003epypa/virtualenv#3232\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(activation): restore PKG_CONFIG_PATH that was not set before by \u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3233\"\u003epypa/virtualenv#3233\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pypa/virtualenv/blob/main/docs/changelog.rst\"\u003evirtualenv's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003eBugfixes - 21.7.13\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eFix \u003ccode\u003eactivate\u003c/code\u003e and \u003ccode\u003eactivate.fish\u003c/code\u003e running commands embedded in the virtual environment path or in the\ninterpreter's Tcl/Tk library paths. (:issue:\u003ccode\u003e3252\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003ev21.7.12 (2026-09-18)\u003c/p\u003e\n\u003chr /\u003e\n\u003ch1\u003eBugfixes - 21.7.12\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eFix \u003ccode\u003eactivate.bat\u003c/code\u003e running arbitrary commands from a crafted \u003ccode\u003e--prompt\u003c/code\u003e, \u003ccode\u003eVIRTUALENV_PROMPT\u003c/code\u003e, or config file\nvalue. (:issue:\u003ccode\u003e3250\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eVerify a downloaded seed wheel's sha256 against PyPI before seeding it into a virtual environment, skipped when a\ncustom pip index is configured. (:issue:\u003ccode\u003e3251\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003ev21.7.11 (2026-09-17)\u003c/p\u003e\n\u003chr /\u003e\n\u003ch1\u003eBugfixes - 21.7.11\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eRunning \u003ccode\u003eactivate.bat\u003c/code\u003e again before \u003ccode\u003edeactivate\u003c/code\u003e no longer makes \u003ccode\u003edeactivate\u003c/code\u003e leave the environment's\n\u003ccode\u003ePKG_CONFIG_PATH\u003c/code\u003e, \u003ccode\u003eTCL_LIBRARY\u003c/code\u003e and \u003ccode\u003eTK_LIBRARY\u003c/code\u003e behind, or lose values the user had set before the first\nactivation - by :user:\u003ccode\u003edarrenhuai\u003c/code\u003e. (:issue:\u003ccode\u003e3245\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eWrite \u003ccode\u003epyvenv.cfg\u003c/code\u003e values on a single line, so a prompt carrying a line boundary can no longer inject configuration.\n\u003ccode\u003e--prompt\u003c/code\u003e, the \u003ccode\u003eVIRTUALENV_PROMPT\u003c/code\u003e environment variable and the config file all set the prompt, and\n\u003ccode\u003epyvenv.cfg\u003c/code\u003e has no escape syntax, so a newline, a carriage return, or any other boundary \u003ccode\u003estr.splitlines\u003c/code\u003e\nrecognizes, such as \u003ccode\u003eU+2028\u003c/code\u003e, started a new configuration line. Reading the file back picked up those lines as keys,\nand since the last value for a key wins, they replaced anything written earlier, including \u003ccode\u003ehome\u003c/code\u003e. (:issue:\u003ccode\u003e3247\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch1\u003eImproved Documentation - 21.7.11\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eDocument the policy for AI-assisted contributions and the licensing rules for dependencies. (:issue:\u003ccode\u003e3239\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch1\u003eMisc - 21.7.11\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003e:issue:\u003ccode\u003e3238\u003c/code\u003e, :issue:\u003ccode\u003e3240\u003c/code\u003e, :issue:\u003ccode\u003e3241\u003c/code\u003e, :issue:\u003ccode\u003e3242\u003c/code\u003e, :issue:\u003ccode\u003e3243\u003c/code\u003e, :issue:\u003ccode\u003e3244\u003c/code\u003e, :issue:\u003ccode\u003e3246\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003ev21.7.10 (2026-09-15)\u003c/p\u003e\n\u003chr /\u003e\n\u003ch1\u003eBugfixes - 21.7.10\u003c/h1\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/0c295ff1a5f298e8e11935e3588f59f7455c1f8f\"\u003e\u003ccode\u003e0c295ff\u003c/code\u003e\u003c/a\u003e release 21.7.13\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/4d5a105ec2a2723b8c7f4571bb68f4f71d01e3f6\"\u003e\u003ccode\u003e4d5a105\u003c/code\u003e\u003c/a\u003e 🐛 fix(activation): stop path command injection in bash and fish (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3252\"\u003e#3252\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/0525dcea21865059ffedc70054f6f982be723992\"\u003e\u003ccode\u003e0525dce\u003c/code\u003e\u003c/a\u003e 👷 ci: scope the nushell apt key to its own repo (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3253\"\u003e#3253\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/aa8323a907834e9c16fb734613ce41a6d7e27260\"\u003e\u003ccode\u003eaa8323a\u003c/code\u003e\u003c/a\u003e 🔧 chore: drop misc as a changelog fragment type (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3255\"\u003e#3255\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/a43547765e017f3a13f029e24c6e6f73882e15bc\"\u003e\u003ccode\u003ea435477\u003c/code\u003e\u003c/a\u003e 👷 ci: correct a stale checkout pin comment (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3254\"\u003e#3254\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/9666b42afc8d6103e765d77958d7bae782f5406e\"\u003e\u003ccode\u003e9666b42\u003c/code\u003e\u003c/a\u003e release 21.7.12\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/a01ed3e2f239d6ab1fce62c5c7664ccf268fff6d\"\u003e\u003ccode\u003ea01ed3e\u003c/code\u003e\u003c/a\u003e 🐛 fix(seed): verify downloaded wheel digests (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3251\"\u003e#3251\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/d721ff140ce4afdc2a9b76751e4584e25d9fbea6\"\u003e\u003ccode\u003ed721ff1\u003c/code\u003e\u003c/a\u003e 🐛 fix(activation): escape batch quote() against injection (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3250\"\u003e#3250\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/087a2ef8bd3aa15b562a3558b1068f603e50f77a\"\u003e\u003ccode\u003e087a2ef\u003c/code\u003e\u003c/a\u003e 🔧 chore(changelog): drop dead CVE-2026-24049 fragment (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3249\"\u003e#3249\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/73e352ae02bfa52ffc0e307b04f1b6a7168c4eb0\"\u003e\u003ccode\u003e73e352a\u003c/code\u003e\u003c/a\u003e release 21.7.11\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/pypa/virtualenv/compare/20.36.1...21.7.13\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=virtualenv\u0026package-manager=uv\u0026previous-version=20.36.1\u0026new-version=21.7.13)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore \u003cdependency name\u003e major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself)\n- `@dependabot ignore \u003cdependency name\u003e minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself)\n- `@dependabot ignore \u003cdependency name\u003e` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself)\n- `@dependabot unignore \u003cdependency name\u003e` will remove all of the ignore conditions of the specified dependency\n- `@dependabot unignore \u003cdependency name\u003e \u003cignore condition\u003e` will remove the ignore condition of the specified dependency and ignore conditions\nYou can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/notdodo/erfiume_bot/network/alerts).\n\n\u003c/details\u003e","html_url":"https://github.com/notdodo/erfiume_bot/pull/321","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/notdodo%2Ferfiume_bot/issues/321","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/321/packages"},{"uuid":"5892216915","node_id":"PR_kwDOTnUGzc8AAAABI8V0Aw","number":1,"state":"open","title":"chore(deps): bump the uv group across 1 directory with 17 updates","user":"dependabot[bot]","labels":["dependencies","python:uv"],"assignees":[],"locked":false,"comments_count":5,"pull_request":true,"closed_at":null,"author_association":null,"state_reason":null,"created_at":"2026-10-16T22:43:11.000Z","updated_at":"2026-10-16T22:43:23.000Z","time_to_close":null,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"chore(deps): bump","group_name":"uv","update_count":17,"packages":[{"name":"pyjwt","old_version":"2.13.0","new_version":"2.15.0","repository_url":"https://github.com/jpadilla/pyjwt"},{"name":"pypdf","old_version":"6.14.2","new_version":"6.19.0","repository_url":"https://github.com/py-pdf/pypdf"},{"name":"mcp","old_version":"1.28.1","new_version":"1.30.0","repository_url":"https://github.com/modelcontextprotocol/python-sdk"},{"name":"pymongo","old_version":"4.17.0","new_version":"4.18.2","repository_url":"https://github.com/mongodb/mongo-python-driver"},{"name":"langchain-nvidia-ai-endpoints","old_version":"1.0.4","new_version":"1.4.2","repository_url":"https://github.com/langchain-ai/langchain-nvidia"},{"name":"gitpython","old_version":"3.1.57","new_version":"3.1.62","repository_url":"https://github.com/gitpython-developers/GitPython"},{"name":"litellm","old_version":"1.93.0","new_version":"1.93.2","repository_url":"https://github.com/BerriAI/litellm"},{"name":"docling","old_version":"2.115.0","new_version":"2.132.0","repository_url":"https://github.com/docling-project/docling"},{"name":"datamodel-code-generator","old_version":"0.71.0","new_version":"0.81.0","repository_url":"https://github.com/datamodel-code-generator/datamodel-code-generator"},{"name":"langgraph-sdk","old_version":"0.4.2","new_version":"0.4.4","repository_url":"https://github.com/langchain-ai/langgraph"},{"name":"mako","old_version":"1.3.12","new_version":"1.4.2","repository_url":"https://github.com/sqlalchemy/mako"},{"name":"multidict","old_version":"6.7.1","new_version":"6.9.1","repository_url":"https://github.com/aio-libs/multidict"},{"name":"oauthlib","old_version":"3.3.1","new_version":"4.0.0","repository_url":"https://github.com/oauthlib/oauthlib"},{"name":"tornado","old_version":"6.5.7","new_version":"6.5.9","repository_url":"https://github.com/tornadoweb/tornado"},{"name":"urllib3","old_version":"2.7.0","new_version":"2.8.0","repository_url":"https://github.com/urllib3/urllib3"},{"name":"virtualenv","old_version":"21.7.0","new_version":"21.7.13","repository_url":"https://github.com/pypa/virtualenv"},{"name":"werkzeug","old_version":"3.1.8","new_version":"3.1.9","repository_url":"https://github.com/pallets/werkzeug"}],"path":null,"ecosystem":"pip"},"body":"Bumps the uv group with 17 updates in the / directory:\n\n| Package | From | To |\n| --- | --- | --- |\n| [pyjwt](https://github.com/jpadilla/pyjwt) | `2.13.0` | `2.15.0` |\n| [pypdf](https://github.com/py-pdf/pypdf) | `6.14.2` | `6.19.0` |\n| [mcp](https://github.com/modelcontextprotocol/python-sdk) | `1.28.1` | `1.30.0` |\n| [pymongo](https://github.com/mongodb/mongo-python-driver) | `4.17.0` | `4.18.2` |\n| [langchain-nvidia-ai-endpoints](https://github.com/langchain-ai/langchain-nvidia) | `1.0.4` | `1.4.2` |\n| [gitpython](https://github.com/gitpython-developers/GitPython) | `3.1.57` | `3.1.62` |\n| [litellm](https://github.com/BerriAI/litellm) | `1.93.0` | `1.93.2` |\n| [docling](https://github.com/docling-project/docling) | `2.115.0` | `2.132.0` |\n| [datamodel-code-generator](https://github.com/datamodel-code-generator/datamodel-code-generator) | `0.71.0` | `0.81.0` |\n| [langgraph-sdk](https://github.com/langchain-ai/langgraph) | `0.4.2` | `0.4.4` |\n| [mako](https://github.com/sqlalchemy/mako) | `1.3.12` | `1.4.2` |\n| [multidict](https://github.com/aio-libs/multidict) | `6.7.1` | `6.9.1` |\n| [oauthlib](https://github.com/oauthlib/oauthlib) | `3.3.1` | `4.0.0` |\n| [tornado](https://github.com/tornadoweb/tornado) | `6.5.7` | `6.5.9` |\n| [urllib3](https://github.com/urllib3/urllib3) | `2.7.0` | `2.8.0` |\n| [virtualenv](https://github.com/pypa/virtualenv) | `21.7.0` | `21.7.13` |\n| [werkzeug](https://github.com/pallets/werkzeug) | `3.1.8` | `3.1.9` |\n\n\nUpdates `pyjwt` from 2.13.0 to 2.15.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/jpadilla/pyjwt/releases\"\u003epyjwt's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e2.15.0\u003c/h2\u003e\n\u003cp\u003eSee the \u003ca href=\"https://github.com/jpadilla/pyjwt/blob/2.15.0/CHANGELOG.rst\"\u003e2.15.0 changelog\u003c/a\u003e for complete release details.\u003c/p\u003e\n\u003ch2\u003e2.14.0\u003c/h2\u003e\n\u003cp\u003eSee the \u003ca href=\"https://github.com/jpadilla/pyjwt/blob/2.14.0/CHANGELOG.rst\"\u003e2.14.0 changelog\u003c/a\u003e for the complete release details and related security advisories.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/jpadilla/pyjwt/blob/master/CHANGELOG.rst\"\u003epyjwt's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e\u003ccode\u003ev2.15.0 \u0026lt;https://github.com/jpadilla/pyjwt/compare/2.14.0...2.15.0\u0026gt;\u003c/code\u003e__\u003c/h2\u003e\n\u003cp\u003eSecurity\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e\n- Wrap recursion errors from deeply nested JWT payloads in ``DecodeError``\n  instead of exposing a raw ``RecursionError``.\n\u003cp\u003eAdded\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e\n- Support Python 3.15 by @kytta in `[#1202](https://github.com/jpadilla/pyjwt/issues/1202) \u0026amp;lt;https://github.com/jpadilla/pyjwt/pull/1202\u0026amp;gt;`__\n\nChanged\n\u003c/code\u003e\u003c/pre\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eJWKSetCache\u003c/code\u003e now stores the parsed \u003ccode\u003ePyJWKSet\u003c/code\u003e rather than the raw JWKS\npayload, so a cache hit no longer re-parses every key. \u003ccode\u003eJWKSetCache.put()\u003c/code\u003e\naccepts either form and raises \u003ccode\u003ePyJWKSetError\u003c/code\u003e for anything else. As a\nresult, \u003ccode\u003ePyJWKClient.get_jwk_set()\u003c/code\u003e returns the same \u003ccode\u003ePyJWKSet\u003c/code\u003e instance\nfor as long as it stays cached, rather than a freshly built one per call in\n\u003ccode\u003e[#1208](https://github.com/jpadilla/pyjwt/issues/1208) \u0026amp;lt;https://github.com/jpadilla/pyjwt/pull/1208\u0026amp;gt;\u003c/code\u003e__\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ePyJWKClient.fetch_data()\u003c/code\u003e now raises\n\u003ccode\u003ePyJWKClientError(\u0026amp;quot;The JWKS endpoint did not return a JSON object\u0026amp;quot;)\u003c/code\u003e when\nthe endpoint response is not a JSON object, instead of returning it for\n\u003ccode\u003eget_jwk_set()\u003c/code\u003e to reject. Callers reaching the JWKS through\n\u003ccode\u003eget_jwk_set()\u003c/code\u003e see the same error as before in\n\u003ccode\u003e[#1208](https://github.com/jpadilla/pyjwt/issues/1208) \u0026amp;lt;https://github.com/jpadilla/pyjwt/pull/1208\u0026amp;gt;\u003c/code\u003e__\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eFixed\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e\n- Return cached ``PyJWKSet`` values from ``PyJWKClient.get_jwk_set()`` instead\n  of raising ``PyJWKClientError(\u0026amp;quot;The JWKS endpoint did not return a JSON\n  object\u0026amp;quot;)``. ``JWKSetCache.put()`` documents ``PyJWKSet`` as the cached value,\n  so callers pre-populating the cache to avoid a network round-trip could not\n  read it back in `[#914](https://github.com/jpadilla/pyjwt/issues/914) \u0026amp;lt;https://github.com/jpadilla/pyjwt/issues/914\u0026amp;gt;`__ and\n  `[#1208](https://github.com/jpadilla/pyjwt/issues/1208) \u0026amp;lt;https://github.com/jpadilla/pyjwt/pull/1208\u0026amp;gt;`__\n- ``PyJWKClient.get_jwk_set()`` now caches the key set it returns, so a\n  ``fetch_data()`` override that filters or transforms the JWKS is no longer\n  undone by the next cache hit in\n  `[#1208](https://github.com/jpadilla/pyjwt/issues/1208) \u0026amp;lt;https://github.com/jpadilla/pyjwt/pull/1208\u0026amp;gt;`__\n- Raise the documented ``PyJWTError`` subclass instead of leaking a\n  ``TypeError`` when the ``exp``, ``nbf``, or ``iat`` claim decodes to a\n  non-numeric, non-string value such as a list, dict, or ``null``.\n- Reject OKP JWK private keys when their public ``x`` component does not\n  match the private ``d`` component.\n- Treat malformed JWK Set members as unusable keys rather than letting\n  ``AttributeError`` or ``TypeError`` escape ``PyJWKSet``. A member that is not\n\u0026amp;lt;/tr\u0026amp;gt;\u0026amp;lt;/table\u0026amp;gt; \n\u0026lt;/code\u0026gt;\u0026lt;/pre\u0026gt;\n\u0026lt;/blockquote\u0026gt;\n\u0026lt;p\u0026gt;... (truncated)\u0026lt;/p\u0026gt;\n\u0026lt;/details\u0026gt;\n\u0026lt;details\u0026gt;\n\u0026lt;summary\u0026gt;Commits\u0026lt;/summary\u0026gt;\n\n\u0026lt;ul\u0026gt;\n\u0026lt;li\u0026gt;\u0026lt;a href=\u0026quot;https://github.com/jpadilla/pyjwt/commit/1d41a6478e1562e68ff667fcd703356acf085f68\u0026quot;\u0026gt;\u0026lt;code\u0026gt;1d41a64\u0026lt;/code\u0026gt;\u0026lt;/a\u0026gt; chore: prepare 2.15.0 release\u0026lt;/li\u0026gt;\n\u0026lt;li\u0026gt;\u0026lt;a href=\u0026quot;https://github.com/jpadilla/pyjwt/commit/9bc06658f875b9b40091539140bbbdc4639161c3\u0026quot;\u0026gt;\u0026lt;code\u0026gt;9bc0665\u0026lt;/code\u0026gt;\u0026lt;/a\u0026gt; fix: make recursive payload tests deterministic\u0026lt;/li\u0026gt;\n\u0026lt;li\u0026gt;\u0026lt;a href=\u0026quot;https://github.com/jpadilla/pyjwt/commit/5fde08a6cf906aa7698de2d6391d88b73006b17b\u0026quot;\u0026gt;\u0026lt;code\u0026gt;5fde08a\u0026lt;/code\u0026gt;\u0026lt;/a\u0026gt; fix: normalize recursive JWT payload errors\u0026lt;/li\u0026gt;\n\u0026lt;li\u0026gt;\u0026lt;a href=\u0026quot;https://github.com/jpadilla/pyjwt/commit/171062d2d734315272a901100aa4b109f2fc3c19\u0026quot;\u0026gt;\u0026lt;code\u0026gt;171062d\u0026lt;/code\u0026gt;\u0026lt;/a\u0026gt; utils: mention bytes in force_bytes type error (\u0026lt;a href=\u0026quot;https://redirect.github.com/jpadilla/pyjwt/issues/1173\u0026quot;\u0026gt;#1173\u0026lt;/a\u0026gt;)\u0026lt;/li\u0026gt;\n\u0026lt;li\u0026gt;\u0026lt;a href=\u0026quot;https://github.com/jpadilla/pyjwt/commit/c9d4d5375bf464ef363506fed9eb6e7f33217ab6\u0026quot;\u0026gt;\u0026lt;code\u0026gt;c9d4d53\u0026lt;/code\u0026gt;\u0026lt;/a\u0026gt; docs/conf: drop duplicate 'and' from read() docstring (\u0026lt;a href=\u0026quot;https://redirect.github.com/jpadilla/pyjwt/issues/1174\u0026quot;\u0026gt;#1174\u0026lt;/a\u0026gt;)\u0026lt;/li\u0026gt;\n\u0026lt;li\u0026gt;\u0026lt;a href=\u0026quot;https://github.com/jpadilla/pyjwt/commit/2763752196113e1473b0ed7905aa6034aedfbe53\u0026quot;\u0026gt;\u0026lt;code\u0026gt;2763752\u0026lt;/code\u0026gt;\u0026lt;/a\u0026gt; Add support for Python 3.15 (\u0026lt;a href=\u0026quot;https://redirect.github.com/jpadilla/pyjwt/issues/1202\u0026quot;\u0026gt;#1202\u0026lt;/a\u0026gt;)\u0026lt;/li\u0026gt;\n\u0026lt;li\u0026gt;\u0026lt;a href=\u0026quot;https://github.com/jpadilla/pyjwt/commit/4adcd02722f5011c60079d3978dfc167b9a8eaa5\u0026quot;\u0026gt;\u0026lt;code\u0026gt;4adcd02\u0026lt;/code\u0026gt;\u0026lt;/a\u0026gt; Catch http.client.HTTPException in PyJWKClient.fetch_data (\u0026lt;a href=\u0026quot;https://redirect.github.com/jpadilla/pyjwt/issues/1201\u0026quot;\u0026gt;#1201\u0026lt;/a\u0026gt;)\u0026lt;/li\u0026gt;\n\u0026lt;li\u0026gt;\u0026lt;a href=\u0026quot;https://github.com/jpadilla/pyjwt/commit/9e501d993b4d3e7dba14bdb1722b1d993ac75097\u0026quot;\u0026gt;\u0026lt;code\u0026gt;9e501d9\u0026lt;/code\u0026gt;\u0026lt;/a\u0026gt; fix: correct docstring typo in _validate_jti (\u0026lt;a href=\u0026quot;https://redirect.github.com/jpadilla/pyjwt/issues/1179\u0026quot;\u0026gt;#1179\u0026lt;/a\u0026gt;)\u0026lt;/li\u0026gt;\n\u0026lt;li\u0026gt;\u0026lt;a href=\u0026quot;https://github.com/jpadilla/pyjwt/commit/4047c44d51950ffda15f40054508d3f17c43b1e2\u0026quot;\u0026gt;\u0026lt;code\u0026gt;4047c44\u0026lt;/code\u0026gt;\u0026lt;/a\u0026gt; docs: clarify JWK certificate member handling (\u0026lt;a href=\u0026quot;https://redirect.github.com/jpadilla/pyjwt/issues/1212\u0026quot;\u0026gt;#1212\u0026lt;/a\u0026gt;)\u0026lt;/li\u0026gt;\n\u0026lt;li\u0026gt;\u0026lt;a href=\u0026quot;https://github.com/jpadilla/pyjwt/commit/f4e2b59f543cc82d46d9d69922bba59e804216b9\u0026quot;\u0026gt;\u0026lt;code\u0026gt;f4e2b59\u0026lt;/code\u0026gt;\u0026lt;/a\u0026gt; [pre-commit.ci] pre-commit autoupdate (\u0026lt;a href=\u0026quot;https://redirect.github.com/jpadilla/pyjwt/issues/1210\u0026quot;\u0026gt;#1210\u0026lt;/a\u0026gt;)\u0026lt;/li\u0026gt;\n\u0026lt;li\u0026gt;Additional commits viewable in \u0026lt;a href=\u0026quot;https://github.com/jpadilla/pyjwt/compare/2.13.0...2.15.0\u0026quot;\u0026gt;compare view\u0026lt;/a\u0026gt;\u0026lt;/li\u0026gt;\n\u0026lt;/ul\u0026gt;\n\u0026lt;/details\u0026gt;\n\n\u0026lt;br /\u0026gt;\u003c/code\u003e\u003c/pre\u003e\n\nUpdates `pypdf` from 6.14.2 to 6.19.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/py-pdf/pypdf/releases\"\u003epypdf's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003eVersion 6.19.0, 2026-09-16\u003c/h2\u003e\n\u003ch2\u003eWhat's new\u003c/h2\u003e\n\u003ch3\u003eSecurity (SEC)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eLimit size of alphabetical page labels (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4096\"\u003e#4096\u003c/a\u003e) by \u003ca href=\"https://github.com/stefan6419846\"\u003e\u003ccode\u003e@​stefan6419846\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eDeprecations (DEP)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eReplace PdfWriter method add_js (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/3979\"\u003e#3979\u003c/a\u003e) by \u003ca href=\"https://github.com/j-t-1\"\u003e\u003ccode\u003e@​j-t-1\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003ePerformance Improvements (PI)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eMove static value out of loop body for appearance stream data (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4087\"\u003e#4087\u003c/a\u003e) by \u003ca href=\"https://github.com/stefan6419846\"\u003e\u003ccode\u003e@​stefan6419846\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eReduce number of full data lookups for attachment mapping API (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4081\"\u003e#4081\u003c/a\u003e) by \u003ca href=\"https://github.com/stefan6419846\"\u003e\u003ccode\u003e@​stefan6419846\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eBug Fixes (BUG)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eDo not copy unrelated pages when appending pages with non-terminal fields (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4078\"\u003e#4078\u003c/a\u003e) by \u003ca href=\"https://github.com/anandghegde\"\u003e\u003ccode\u003e@​anandghegde\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUse page reference for existing internal link targets (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4076\"\u003e#4076\u003c/a\u003e) by \u003ca href=\"https://github.com/r-kamei\"\u003e\u003ccode\u003e@​r-kamei\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eArabic-Indic digits are reversed during text extraction (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4077\"\u003e#4077\u003c/a\u003e) by \u003ca href=\"https://github.com/Syamjith-NK\"\u003e\u003ccode\u003e@​Syamjith-NK\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eParse a string rect for add_uri into a rectangle (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4074\"\u003e#4074\u003c/a\u003e) by \u003ca href=\"https://github.com/RavSinghChandan\"\u003e\u003ccode\u003e@​RavSinghChandan\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/py-pdf/pypdf/compare/6.18.1...6.19.0\"\u003eFull Changelog\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003eVersion 6.18.1, 2026-09-11\u003c/h2\u003e\n\u003ch2\u003eWhat's new\u003c/h2\u003e\n\u003ch3\u003eSecurity (SEC)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eFurther restrict FlateDecode recovery (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4073\"\u003e#4073\u003c/a\u003e) by \u003ca href=\"https://github.com/stefan6419846\"\u003e\u003ccode\u003e@​stefan6419846\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eLimit entry count for TrueType and Type1 font \u003ccode\u003e/Widths\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4072\"\u003e#4072\u003c/a\u003e) by \u003ca href=\"https://github.com/stefan6419846\"\u003e\u003ccode\u003e@​stefan6419846\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eLimit allowed length of tokens in parse_bfchar (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4071\"\u003e#4071\u003c/a\u003e) by \u003ca href=\"https://github.com/stefan6419846\"\u003e\u003ccode\u003e@​stefan6419846\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eBug Fixes (BUG)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eUse current text matrix for visitor_text (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4062\"\u003e#4062\u003c/a\u003e) by \u003ca href=\"https://github.com/r-kamei\"\u003e\u003ccode\u003e@​r-kamei\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRepeat the letter for /S /A and /S /a page labels past Z (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4065\"\u003e#4065\u003c/a\u003e) by \u003ca href=\"https://github.com/youdie006\"\u003e\u003ccode\u003e@​youdie006\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUse font color for FreeText default appearance (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4051\"\u003e#4051\u003c/a\u003e) by \u003ca href=\"https://github.com/Yuki9814\"\u003e\u003ccode\u003e@​Yuki9814\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eRobustness (ROB)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eFix compatibility with fonttools \u0026lt; 4.58.0 (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4050\"\u003e#4050\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4059\"\u003e#4059\u003c/a\u003e) by \u003ca href=\"https://github.com/MeggyCal\"\u003e\u003ccode\u003e@​MeggyCal\u003c/code\u003e\u003c/a\u003e and \u003ca href=\"https://github.com/stefan6419846\"\u003e\u003ccode\u003e@​stefan6419846\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eDocumentation (DOC)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eUse combined matrix in visitor examples (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4066\"\u003e#4066\u003c/a\u003e) by \u003ca href=\"https://github.com/r-kamei\"\u003e\u003ccode\u003e@​r-kamei\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/py-pdf/pypdf/compare/6.18.0...6.18.1\"\u003eFull Changelog\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003eVersion 6.18.0, 2026-09-07\u003c/h2\u003e\n\u003ch2\u003eWhat's new\u003c/h2\u003e\n\u003cp\u003ePlease note that this release requires users which previously overwrote the default limits to migrate to the new approach: \u003ca href=\"https://pypdf.readthedocs.io/en/6.18.0/user/security.html#global\"\u003eDocs\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eIn short:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eUse \u003ccode\u003eapply_configuration\u003c/code\u003e as a context manager to temporarily overwrite configuration values.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/py-pdf/pypdf/blob/main/CHANGELOG.md\"\u003epypdf's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003eVersion 6.19.0, 2026-09-16\u003c/h2\u003e\n\u003ch3\u003eSecurity (SEC)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eLimit size of alphabetical page labels (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4096\"\u003e#4096\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eDeprecations (DEP)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eReplace PdfWriter method add_js (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/3979\"\u003e#3979\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003ePerformance Improvements (PI)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eMove static value out of loop body for appearance stream data (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4087\"\u003e#4087\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eReduce number of full data lookups for attachment mapping API (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4081\"\u003e#4081\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eBug Fixes (BUG)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eDo not copy unrelated pages when appending pages with non-terminal fields (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4078\"\u003e#4078\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eUse page reference for existing internal link targets (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4076\"\u003e#4076\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eArabic-Indic digits are reversed during text extraction (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4077\"\u003e#4077\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eParse a string rect for add_uri into a rectangle (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4074\"\u003e#4074\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/py-pdf/pypdf/compare/6.18.1...6.19.0\"\u003eFull Changelog\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003eVersion 6.18.1, 2026-09-11\u003c/h2\u003e\n\u003ch3\u003eSecurity (SEC)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eFurther restrict FlateDecode recovery (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4073\"\u003e#4073\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eLimit entry count for TrueType and Type1 font \u003ccode\u003e/Widths\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4072\"\u003e#4072\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eLimit allowed length of tokens in parse_bfchar (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4071\"\u003e#4071\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eBug Fixes (BUG)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eUse current text matrix for visitor_text (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4062\"\u003e#4062\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eRepeat the letter for /S /A and /S /a page labels past Z (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4065\"\u003e#4065\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eUse font color for FreeText default appearance (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4051\"\u003e#4051\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eRobustness (ROB)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eFix compatibility with fonttools \u0026lt; 4.58.0 (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4050\"\u003e#4050\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4059\"\u003e#4059\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eDocumentation (DOC)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eUse combined matrix in visitor examples (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4066\"\u003e#4066\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/py-pdf/pypdf/compare/6.18.0...6.18.1\"\u003eFull Changelog\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003eVersion 6.18.0, 2026-09-07\u003c/h2\u003e\n\u003ch3\u003eSecurity (SEC)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eLimit allowed length of indirect object tokens (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4055\"\u003e#4055\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eDeprecations (DEP)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eRework configuration value handling (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4044\"\u003e#4044\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eNew Features (ENH)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eDraw borders and backgrounds for appearance streams and annotations (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4033\"\u003e#4033\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/py-pdf/pypdf/commit/d62cb58d3988b291b0435eddfd118c4f8f6b6a46\"\u003e\u003ccode\u003ed62cb58\u003c/code\u003e\u003c/a\u003e REL: 6.19.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/py-pdf/pypdf/commit/0d8b5a8832cde1ba308b5c27567b879b7b7eed4a\"\u003e\u003ccode\u003e0d8b5a8\u003c/code\u003e\u003c/a\u003e SEC: Limit size of alphabetical page labels (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4096\"\u003e#4096\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/py-pdf/pypdf/commit/959467a9b95be83e2dc5ae873ece5f371263ede7\"\u003e\u003ccode\u003e959467a\u003c/code\u003e\u003c/a\u003e PI: Move static value out of loop body for appearance stream data (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4087\"\u003e#4087\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/py-pdf/pypdf/commit/20822b263f063c96ad535405f5b8c4d81768950b\"\u003e\u003ccode\u003e20822b2\u003c/code\u003e\u003c/a\u003e DEV: Bump zizmorcore/zizmor-action from 0.6.3 to 0.6.4 (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4093\"\u003e#4093\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/py-pdf/pypdf/commit/25f230191b89cdcf2b4ba3d8051d52c7392831d0\"\u003e\u003ccode\u003e25f2301\u003c/code\u003e\u003c/a\u003e DEP: Replace PdfWriter method add_js (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/3979\"\u003e#3979\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/py-pdf/pypdf/commit/a92443848fda10cc2a65a7b6397fd8e1986c17d2\"\u003e\u003ccode\u003ea924438\u003c/code\u003e\u003c/a\u003e BUG: Do not copy unrelated pages when appending pages with non-terminal field...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/py-pdf/pypdf/commit/cf5cec2e49b9da8fae0d82a0f99f1bfe9eceb8ed\"\u003e\u003ccode\u003ecf5cec2\u003c/code\u003e\u003c/a\u003e BUG: Use page reference for existing internal link targets (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4076\"\u003e#4076\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/py-pdf/pypdf/commit/96d81f05ba4b3ec9ff1b3c3e52bc71a3cdd702c7\"\u003e\u003ccode\u003e96d81f0\u003c/code\u003e\u003c/a\u003e BUG: Arabic-Indic digits are reversed during text extraction (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4077\"\u003e#4077\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/py-pdf/pypdf/commit/2d219015b4cf92edcfd6d28c564295f0704fd204\"\u003e\u003ccode\u003e2d21901\u003c/code\u003e\u003c/a\u003e DEV: Fix Color class for latest mypy (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4082\"\u003e#4082\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/py-pdf/pypdf/commit/893a01002aa8e23b3a61ae4b38ab74edbc904ab9\"\u003e\u003ccode\u003e893a010\u003c/code\u003e\u003c/a\u003e MAINT: Split PdfDocCommon._flatten (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4070\"\u003e#4070\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/py-pdf/pypdf/compare/6.14.2...6.19.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `mcp` from 1.28.1 to 1.30.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/modelcontextprotocol/python-sdk/releases\"\u003emcp's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev1.30.0\u003c/h2\u003e\n\u003cp\u003eMaintenance release of the 1.x line. 2.x is the current line; 1.x docs are at \u003ca href=\"https://py.sdk.modelcontextprotocol.io/v1/\"\u003ehttps://py.sdk.modelcontextprotocol.io/v1/\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eA few defaults changed in this release. If you run a server or client on 1.x, skim these first:\u003c/p\u003e\n\u003ch2\u003eBehaviour changes\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eHTTP client redirects are only followed within the endpoint's origin\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/modelcontextprotocol/python-sdk/issues/3448\"\u003e#3448\u003c/a\u003e)\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003estreamable_http_client\u003c/code\u003e and \u003ccode\u003esse_client\u003c/code\u003e follow a redirect only if it stays on the same scheme, host and port (or upgrades \u003ccode\u003ehttp\u003c/code\u003e to \u003ccode\u003ehttps\u003c/code\u003e on the same host).\u003c/li\u003e\n\u003cli\u003eA redirect anywhere else now fails the request with \u003ccode\u003ehttpx.HTTPStatusError\u003c/code\u003e. If that other URL is the server you meant, use it as the endpoint URL.\u003c/li\u003e\n\u003cli\u003eThe \u003ccode\u003efollow_redirects\u003c/code\u003e setting on an \u003ccode\u003ehttpx.AsyncClient\u003c/code\u003e you pass in is no longer used for MCP requests, so you don't need it for the trailing-slash redirect any more.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eOAuthClientProvider\u003c/code\u003e applies the same rule to its own requests.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eIdle Streamable HTTP sessions now expire\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/modelcontextprotocol/python-sdk/issues/3426\"\u003e#3426\u003c/a\u003e)\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eA stateful session with nothing in flight for 30 minutes is closed. The client's next request gets a 404 and it has to initialize again.\u003c/li\u003e\n\u003cli\u003eClients that keep the GET stream open (the SDK's client does) are not affected.\u003c/li\u003e\n\u003cli\u003eA server also holds at most 10 000 sessions at once; beyond that, new sessions get a 503.\u003c/li\u003e\n\u003cli\u003eTo turn either off: \u003ccode\u003eFastMCP(..., session_idle_timeout=None, max_sessions=None)\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eThe OAuth client checks the authorization server's \u003ccode\u003eissuer\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/modelcontextprotocol/python-sdk/issues/3431\"\u003e#3431\u003c/a\u003e)\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eAuthorization server metadata whose \u003ccode\u003eissuer\u003c/code\u003e doesn't match the server it was fetched for is now rejected with \u003ccode\u003eOAuthFlowError: Authorization server metadata issuer mismatch\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eClient registrations are now remembered per issuer; if the server later points at a different authorization server, the client registers again.\u003c/li\u003e\n\u003cli\u003eIf protected resource metadata can't be fetched because of a 5xx/429, the flow now stops instead of falling back to the legacy endpoints.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eTwo new \u003ccode\u003eDeprecationWarning\u003c/code\u003es\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/modelcontextprotocol/python-sdk/issues/3431\"\u003e#3431\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/modelcontextprotocol/python-sdk/issues/3451\"\u003e#3451\u003c/a\u003e)\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eClientCredentialsOAuthProvider\u003c/code\u003e / \u003ccode\u003ePrivateKeyJWTOAuthProvider\u003c/code\u003e without \u003ccode\u003eissuer=\u003c/code\u003e. Pass your authorization server's issuer URL.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eAuthSettings\u003c/code\u003e with \u003ccode\u003eresource_server_url\u003c/code\u003e set but \u003ccode\u003evalidate_token_resource\u003c/code\u003e unset. Set it to \u003ccode\u003eTrue\u003c/code\u003e or \u003ccode\u003eFalse\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eBoth keep working as before in 1.x; this mostly matters if your tests turn warnings into errors.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eAuthSettings.validate_token_resource\u003c/code\u003e: only accept tokens your \u003ccode\u003eTokenVerifier\u003c/code\u003e reports as issued for this server (\u003ca href=\"https://redirect.github.com/modelcontextprotocol/python-sdk/issues/3451\"\u003e#3451\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eissuer=\u003c/code\u003e on \u003ccode\u003eClientCredentialsOAuthProvider\u003c/code\u003e and \u003ccode\u003ePrivateKeyJWTOAuthProvider\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/modelcontextprotocol/python-sdk/issues/3431\"\u003e#3431\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003esession_idle_timeout=\u003c/code\u003e and \u003ccode\u003emax_sessions=\u003c/code\u003e on \u003ccode\u003eFastMCP\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/modelcontextprotocol/python-sdk/issues/3426\"\u003e#3426\u003c/a\u003e).\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e[v1.x] Resolve tool output-schema references within the schema document only by \u003ca href=\"https://github.com/maxisbey\"\u003e\u003ccode\u003e@​maxisbey\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/modelcontextprotocol/python-sdk/pull/3396\"\u003emodelcontextprotocol/python-sdk#3396\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[v1.x] Expire idle Streamable HTTP sessions by default and cap concurrent sessions by \u003ca href=\"https://github.com/maxisbey\"\u003e\u003ccode\u003e@​maxisbey\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/modelcontextprotocol/python-sdk/pull/3426\"\u003emodelcontextprotocol/python-sdk#3426\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[v1.x] Validate the authorization server metadata issuer on every discovery path by \u003ca href=\"https://github.com/maxisbey\"\u003e\u003ccode\u003e@​maxisbey\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/modelcontextprotocol/python-sdk/pull/3431\"\u003emodelcontextprotocol/python-sdk#3431\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[v1.x] Follow redirects only within the MCP endpoint's origin by \u003ca href=\"https://github.com/maxisbey\"\u003e\u003ccode\u003e@​maxisbey\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/modelcontextprotocol/python-sdk/pull/3448\"\u003emodelcontextprotocol/python-sdk#3448\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[v1.x] Add AuthSettings.validate_token_resource to check a bearer token's resource by \u003ca href=\"https://github.com/maxisbey\"\u003e\u003ccode\u003e@​maxisbey\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/modelcontextprotocol/python-sdk/pull/3451\"\u003emodelcontextprotocol/python-sdk#3451\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/modelcontextprotocol/python-sdk/compare/v1.29.1...v1.30.0\"\u003ehttps://github.com/modelcontextprotocol/python-sdk/compare/v1.29.1...v1.30.0\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003ev1.29.1\u003c/h2\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e[v1.x] Complete the FastMCP Settings model at import time by \u003ca href=\"https://github.com/maxisbey\"\u003e\u003ccode\u003e@​maxisbey\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/modelcontextprotocol/python-sdk/pull/3352\"\u003emodelcontextprotocol/python-sdk#3352\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[v1.x] Apply the request body limit to the SSE and OAuth endpoints by \u003ca href=\"https://github.com/maxisbey\"\u003e\u003ccode\u003e@​maxisbey\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/modelcontextprotocol/python-sdk/pull/3344\"\u003emodelcontextprotocol/python-sdk#3344\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/modelcontextprotocol/python-sdk/commit/8c2fa6eabacde869d75568e33b9d466b58c2f512\"\u003e\u003ccode\u003e8c2fa6e\u003c/code\u003e\u003c/a\u003e [v1.x] Add AuthSettings.validate_token_resource to check a bearer token's res...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/modelcontextprotocol/python-sdk/commit/2106335745563b2321b8c73fef2c12903d00aa6e\"\u003e\u003ccode\u003e2106335\u003c/code\u003e\u003c/a\u003e [v1.x] Follow redirects only within the MCP endpoint's origin (\u003ca href=\"https://redirect.github.com/modelcontextprotocol/python-sdk/issues/3448\"\u003e#3448\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/modelcontextprotocol/python-sdk/commit/3eed7ce0a6aba76e8d94c4cfb9b266f41935392c\"\u003e\u003ccode\u003e3eed7ce\u003c/code\u003e\u003c/a\u003e [v1.x] Validate the authorization server metadata issuer on every discovery p...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/modelcontextprotocol/python-sdk/commit/92120b4b0f50385af096592d7cee932fc1d994e7\"\u003e\u003ccode\u003e92120b4\u003c/code\u003e\u003c/a\u003e [v1.x] Expire idle Streamable HTTP sessions by default and cap concurrent ses...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/modelcontextprotocol/python-sdk/commit/5ebdfed4060d8e5b11b8e2348f86bad4d1fb8836\"\u003e\u003ccode\u003e5ebdfed\u003c/code\u003e\u003c/a\u003e [v1.x] Resolve tool output-schema references within the schema document only ...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/modelcontextprotocol/python-sdk/commit/b22271305c59dfc7910f1493faea78cb1d396e48\"\u003e\u003ccode\u003eb222713\u003c/code\u003e\u003c/a\u003e [v1.x] Give recursive tool return types an object-rooted output schema (\u003ca href=\"https://redirect.github.com/modelcontextprotocol/python-sdk/issues/3377\"\u003e#3377\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/modelcontextprotocol/python-sdk/commit/4dc224fab201bdef2fd5a065976b7ca31420187c\"\u003e\u003ccode\u003e4dc224f\u003c/code\u003e\u003c/a\u003e [v1.x] Apply the request body limit to the SSE and OAuth endpoints (\u003ca href=\"https://redirect.github.com/modelcontextprotocol/python-sdk/issues/3344\"\u003e#3344\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/modelcontextprotocol/python-sdk/commit/ae3338f6b396378217921aeadeca10a68e273c2d\"\u003e\u003ccode\u003eae3338f\u003c/code\u003e\u003c/a\u003e [v1.x] Complete the FastMCP Settings model at import time (\u003ca href=\"https://redirect.github.com/modelcontextprotocol/python-sdk/issues/3352\"\u003e#3352\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/modelcontextprotocol/python-sdk/commit/98b7159cb89274964055d2c016e3360a551280d0\"\u003e\u003ccode\u003e98b7159\u003c/code\u003e\u003c/a\u003e [v1.x] Move the v1.x docs to /v1/ and mark v1.x as the maintenance line (\u003ca href=\"https://redirect.github.com/modelcontextprotocol/python-sdk/issues/3177\"\u003e#3177\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/modelcontextprotocol/python-sdk/commit/c0c5a9d64253ebf89a67955b2979dfa198707d67\"\u003e\u003ccode\u003ec0c5a9d\u003c/code\u003e\u003c/a\u003e [v1.x] ci: pick the docs toolchain per worktree in build-docs.sh (\u003ca href=\"https://redirect.github.com/modelcontextprotocol/python-sdk/issues/3082\"\u003e#3082\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/modelcontextprotocol/python-sdk/compare/v1.28.1...v1.30.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `pymongo` from 4.17.0 to 4.18.2\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/mongodb/mongo-python-driver/releases\"\u003epymongo's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ePyMongo 4.18.2\u003c/h2\u003e\n\u003cp\u003eCommunity notes: \u003ca href=\"https://www.mongodb.com/community/forums/t/pymongo-4-18-2-released/343732\"\u003ehttps://www.mongodb.com/community/forums/t/pymongo-4-18-2-released/343732\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://www.cve.org/CVERecord?id=CVE-2026-96749\"\u003eCVE-2026-96749\u003c/a\u003e\n\u003ca href=\"https://www.cve.org/CVERecord?id=CVE-2026-96748\"\u003eCVE-2026-96748\u003c/a\u003e\n\u003ca href=\"https://www.cve.org/CVERecord?id=CVE-2026-96747\"\u003eCVE-2026-96747\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003ePyMongo 4.18.1\u003c/h2\u003e\n\u003cp\u003eCommunity notes: \u003ca href=\"https://www.mongodb.com/community/forums/t/pymongo-4-18-1-released/343338\"\u003ehttps://www.mongodb.com/community/forums/t/pymongo-4-18-1-released/343338\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003ePyMongo 4.18.0\u003c/h2\u003e\n\u003cp\u003eCommunity notes: \u003ca href=\"https://www.mongodb.com/community/forums/t/pymongo-4-18-released/343137\"\u003ehttps://www.mongodb.com/community/forums/t/pymongo-4-18-released/343137\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/mongodb/mongo-python-driver/blob/main/doc/changelog.rst\"\u003epymongo's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003eChanges in Version 4.18.2 (2026/09/24)\u003c/h2\u003e\n\u003cp\u003eVersion 4.18.2 is a bug fix release.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eHardened the bson buffer size guard against signed integer overflow. (\u003ccode\u003eCVE-2026-96749\u003c/code\u003e_).\u003c/li\u003e\n\u003cli\u003eFixed connection string parsing to percent-decode each host individually. (\u003ccode\u003eCVE-2026-96748\u003c/code\u003e_).\u003c/li\u003e\n\u003cli\u003eClient-side field level encryption now rejects a KMS endpoint ending in \u003ccode\u003e.sock\u003c/code\u003e. (\u003ccode\u003eCVE-2026-96747\u003c/code\u003e_).\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e.. _CVE-2026-96749: \u003ca href=\"https://www.cve.org/CVERecord?id=CVE-2026-96749\"\u003ehttps://www.cve.org/CVERecord?id=CVE-2026-96749\u003c/a\u003e\n.. _CVE-2026-96748: \u003ca href=\"https://www.cve.org/CVERecord?id=CVE-2026-96748\"\u003ehttps://www.cve.org/CVERecord?id=CVE-2026-96748\u003c/a\u003e\n.. _CVE-2026-96747: \u003ca href=\"https://www.cve.org/CVERecord?id=CVE-2026-96747\"\u003ehttps://www.cve.org/CVERecord?id=CVE-2026-96747\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eIssues Resolved\n...............\u003c/p\u003e\n\u003cp\u003eSee the \u003ccode\u003ePyMongo 4.18.2 release notes in JIRA\u003c/code\u003e_ for the list of resolved issues\nin this release.\u003c/p\u003e\n\u003cp\u003e.. _PyMongo 4.18.2 release notes in JIRA: \u003ca href=\"https://jira.mongodb.org/secure/ReleaseNote.jspa?projectId=10004\u0026amp;version=52896\"\u003ehttps://jira.mongodb.org/secure/ReleaseNote.jspa?projectId=10004\u0026amp;version=52896\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003eChanges in Version 4.18.1 (2026/09/10)\u003c/h2\u003e\n\u003cp\u003eVersion 4.18.1 is a bug fix release.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eUse an exact match for the file ID in GridFS delete methods\n(\u003ccode\u003eCVE-2026-88029\u003c/code\u003e_).\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e.. _CVE-2026-88029: \u003ca href=\"https://www.cve.org/CVERecord?id=CVE-2026-88029\"\u003ehttps://www.cve.org/CVERecord?id=CVE-2026-88029\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003eChanges in Version 4.18.0 (2026/09/03)\u003c/h2\u003e\n\u003cp\u003ePyMongo 4.18 brings a number of changes including:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eAdded \u003ccode\u003esrvAllowedHostsSuffix\u003c/code\u003e as a URI option and keyword argument to\n:class:\u003ccode\u003e~pymongo.synchronous.mongo_client.MongoClient\u003c/code\u003e and\n:class:\u003ccode\u003e~pymongo.asynchronous.mongo_client.AsyncMongoClient\u003c/code\u003e. When connecting\nvia \u003ccode\u003emongodb+srv://\u003c/code\u003e, this option overrides the default requirement that\nSRV-returned hosts share the same parent domain as the seed hostname,\nallowing hosts under a different domain suffix to be accepted. The suffix must\nnot be a public suffix (per the \u003ccode\u003ePublic Suffix List \u0026lt;https://publicsuffix.org/list/\u0026gt;\u003c/code\u003e_). See the\n:class:\u003ccode\u003e~pymongo.synchronous.mongo_client.MongoClient\u003c/code\u003e and\n:class:\u003ccode\u003e~pymongo.asynchronous.mongo_client.AsyncMongoClient\u003c/code\u003e documentation for\nsecurity considerations.\u003c/li\u003e\n\u003cli\u003eDropped support for MongoDB 4.2.\u003c/li\u003e\n\u003cli\u003eAdded support for MongoDB 9.0.\u003c/li\u003e\n\u003cli\u003ePyPy support is deprecated and will be removed in a future release.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mongodb/mongo-python-driver/commit/640dd2383a1a2fb1a10e5222d50ebc0b22a61bd7\"\u003e\u003ccode\u003e640dd23\u003c/code\u003e\u003c/a\u003e Prep 4.18.2 release (\u003ca href=\"https://redirect.github.com/mongodb/mongo-python-driver/issues/3066\"\u003e#3066\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mongodb/mongo-python-driver/commit/6a0ec650ee7942e24e9aa0848937d66e792f1834\"\u003e\u003ccode\u003e6a0ec65\u003c/code\u003e\u003c/a\u003e Update changelog for CVE-2026-88029 reference (\u003ca href=\"https://redirect.github.com/mongodb/mongo-python-driver/issues/3049\"\u003e#3049\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mongodb/mongo-python-driver/commit/44be553d2a55394596d2d47a6bafca9f7ced9809\"\u003e\u003ccode\u003e44be553\u003c/code\u003e\u003c/a\u003e BUMP 4.18.2.dev0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mongodb/mongo-python-driver/commit/127d140440715f2897ccf74d35fec47a32e34af8\"\u003e\u003ccode\u003e127d140\u003c/code\u003e\u003c/a\u003e PYTHON-6085 Prep for 4.18.1 release (\u003ca href=\"https://redirect.github.com/mongodb/mongo-python-driver/issues/3047\"\u003e#3047\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mongodb/mongo-python-driver/commit/fa676586ba4b399168a4d1d41c30dc2166cc44fd\"\u003e\u003ccode\u003efa67658\u003c/code\u003e\u003c/a\u003e PYTHON-5994 Use exact match for file ID in GridFS delete methods (\u003ca href=\"https://redirect.github.com/mongodb/mongo-python-driver/issues/3046\"\u003e#3046\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mongodb/mongo-python-driver/commit/1011e57e7f95b14d3c398f3225dcc130b8469a12\"\u003e\u003ccode\u003e1011e57\u003c/code\u003e\u003c/a\u003e Prep branch v4.18\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mongodb/mongo-python-driver/commit/4dd73032d98146fd97bedfb8434bff2f458bc26f\"\u003e\u003ccode\u003e4dd7303\u003c/code\u003e\u003c/a\u003e PYTHON-6076 Request workflows permission in create-release-branch (\u003ca href=\"https://redirect.github.com/mongodb/mongo-python-driver/issues/3039\"\u003e#3039\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mongodb/mongo-python-driver/commit/e66da83c219e82497da46c968a542ed7e792e240\"\u003e\u003ccode\u003ee66da83\u003c/code\u003e\u003c/a\u003e PYTHON-5956 Use shared python/setup action for CI setup (\u003ca href=\"https://redirect.github.com/mongodb/mongo-python-driver/issues/2990\"\u003e#2990\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mongodb/mongo-python-driver/commit/22a2ec8af10a4ef697518392f55fbb3baddd335b\"\u003e\u003ccode\u003e22a2ec8\u003c/code\u003e\u003c/a\u003e PYTHON-6021 Move _write_concern_for_cmd into BaseObject (\u003ca href=\"https://redirect.github.com/mongodb/mongo-python-driver/issues/3036\"\u003e#3036\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mongodb/mongo-python-driver/commit/2a4a0047c8a769c36ea3463489234485b34dd08b\"\u003e\u003ccode\u003e2a4a004\u003c/code\u003e\u003c/a\u003e PYTHON-5874 Fix test_fork.py failures on Python 3.15 due to fork() Deprecatio...\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/mongodb/mongo-python-driver/compare/4.17.0...4.18.2\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `langchain-nvidia-ai-endpoints` from 1.0.4 to 1.4.2\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/langchain-ai/langchain-nvidia/releases\"\u003elangchain-nvidia-ai-endpoints's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003eRelease - langchain-nvidia-ai-endpoints==1.4.2\u003c/h2\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003echore(deps): bump aiohttp from 3.13.4 to 3.14.0 in /libs/ai-endpoints in the pip group across 1 directory by \u003ca href=\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/316\"\u003elangchain-ai/langchain-nvidia#316\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat(ai-endpoints): add version metadata to NVIDIA models by \u003ca href=\"https://github.com/mdrxy\"\u003e\u003ccode\u003e@​mdrxy\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/318\"\u003elangchain-ai/langchain-nvidia#318\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): bump aiohttp from 3.14.0 to 3.14.1 in /libs/ai-endpoints in the pip group across 1 directory by \u003ca href=\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/319\"\u003elangchain-ai/langchain-nvidia#319\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix ChatNVIDIA timeout being treated as a model parameter by \u003ca href=\"https://github.com/0Sh1khar\"\u003e\u003ccode\u003e@​0Sh1khar\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/317\"\u003elangchain-ai/langchain-nvidia#317\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore: pin aiohttp below 3.14 for vcrpy compatibility by \u003ca href=\"https://github.com/jiayin-nvidia\"\u003e\u003ccode\u003e@​jiayin-nvidia\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/320\"\u003elangchain-ai/langchain-nvidia#320\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix: use inactivity timeouts for async streaming by \u003ca href=\"https://github.com/jiayin-nvidia\"\u003e\u003ccode\u003e@​jiayin-nvidia\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/323\"\u003elangchain-ai/langchain-nvidia#323\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRelease/1.4.2 by \u003ca href=\"https://github.com/soumilinandi\"\u003e\u003ccode\u003e@​soumilinandi\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/324\"\u003elangchain-ai/langchain-nvidia#324\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/0Sh1khar\"\u003e\u003ccode\u003e@​0Sh1khar\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/317\"\u003elangchain-ai/langchain-nvidia#317\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/langchain-ai/langchain-nvidia/compare/libs/ai-endpoints/v1.4.1...libs/ai-endpoints/v1.4.2\"\u003ehttps://github.com/langchain-ai/langchain-nvidia/compare/libs/ai-endpoints/v1.4.1...libs/ai-endpoints/v1.4.2\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003eRelease - langchain-nvidia-ai-endpoints==1.4.1\u003c/h2\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eadd tool support for qwen3.5-122b-a10b by \u003ca href=\"https://github.com/vidushig-nv\"\u003e\u003ccode\u003e@​vidushig-nv\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/312\"\u003elangchain-ai/langchain-nvidia#312\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eKeep ChatNVIDIA verify_ssl out of payload by \u003ca href=\"https://github.com/freshyjmp\"\u003e\u003ccode\u003e@​freshyjmp\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/314\"\u003elangchain-ai/langchain-nvidia#314\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ebumping version for release by \u003ca href=\"https://github.com/soumilinandi\"\u003e\u003ccode\u003e@​soumilinandi\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/315\"\u003elangchain-ai/langchain-nvidia#315\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/freshyjmp\"\u003e\u003ccode\u003e@​freshyjmp\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/314\"\u003elangchain-ai/langchain-nvidia#314\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/langchain-ai/langchain-nvidia/compare/libs/ai-endpoints/v1.4.0...libs/ai-endpoints/v1.4.1\"\u003ehttps://github.com/langchain-ai/langchain-nvidia/compare/libs/ai-endpoints/v1.4.0...libs/ai-endpoints/v1.4.1\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003eRelease - langchain-nvidia-ai-endpoints==1.4.0\u003c/h2\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003echore(deps): bump the pip group across 3 directories with 2 updates by \u003ca href=\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/302\"\u003elangchain-ai/langchain-nvidia#302\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(ai-endpoints): report per-invocation model in traces by \u003ca href=\"https://github.com/mdrxy\"\u003e\u003ccode\u003e@​mdrxy\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/305\"\u003elangchain-ai/langchain-nvidia#305\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): bump the pip group across 3 directories with 1 update by \u003ca href=\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/304\"\u003elangchain-ai/langchain-nvidia#304\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix Feature/nvidia retriever support for RAG v2.6.0 by \u003ca href=\"https://github.com/shubhadeepd\"\u003e\u003ccode\u003e@​shubhadeepd\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/306\"\u003elangchain-ai/langchain-nvidia#306\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): bump the pip group across 3 directories with 1 update by \u003ca href=\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/308\"\u003elangchain-ai/langchain-nvidia#308\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003erelease: langchain-nvidia-ai-endpoints 1.4.0 by \u003ca href=\"https://github.com/jiayin-nvidia\"\u003e\u003ccode\u003e@​jiayin-nvidia\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/309\"\u003elangchain-ai/langchain-nvidia#309\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/langchain-ai/langchain-nvidia/compare/libs/ai-endpoints/v1.3.0...libs/ai-endpoints/v1.4.0\"\u003ehttps://github.com/langchain-ai/langchain-nvidia/compare/libs/ai-endpoints/v1.3.0...libs/ai-endpoints/v1.4.0\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003eRelease - langchain-nvidia-ai-endpoints==1.3.0\u003c/h2\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003echore(deps): bump the pip group across 2 directories with 1 update by \u003ca href=\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/277\"\u003elangchain-ai/langchain-nvidia#277\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): bump the pip group across 2 directories with 1 update by \u003ca href=\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/279\"\u003elangchain-ai/langchain-nvidia#279\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix 3 Dependabot security alerts (Pygments, orjson, requests) by \u003ca href=\"https://github.com/jkennedyvz\"\u003e\u003ccode\u003e@​jkennedyvz\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/280\"\u003elangchain-ai/langchain-nvidia#280\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): bump aiohttp from 3.13.3 to 3.13.4 in /libs/ai-endpoints in the pip group across 1 directory by \u003ca href=\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/281\"\u003elangchain-ai/langchain-nvidia#281\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix: Deduplicate models from /v1/models API response by \u003ca href=\"https://github.com/bbednarski9\"\u003e\u003ccode\u003e@​bbednarski9\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/282\"\u003elangchain-ai/langchain-nvidia#282\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): bump the pip group across 2 directories with 1 update by \u003ca href=\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/283\"\u003elangchain-ai/langchain-nvidia#283\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eadding glm models by \u003ca href=\"https://github.com/soumilinandi\"\u003e\u003ccode\u003e@​soumilinandi\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/276\"\u003elangchain-ai/langchain-nvidia#276\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eqwen/qwen3.5-122b-a10b\u003c/code\u003e and \u003ccode\u003emistralai/mistral-small-4-119b-2603\u003c/code\u003e by \u003ca href=\"https://github.com/jiayin-nvidia\"\u003e\u003ccode\u003e@​jiayin-nvidia\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/285\"\u003elangchain-ai/langchain-nvidia#285\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix: xfail unsupported thinking-mode case on self-hosted NIM by \u003ca href=\"https://github.com/jiayin-nvidia\"\u003e\u003ccode\u003e@​jiayin-nvidia\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/286\"\u003elangchain-ai/langchain-nvidia#286\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): bump the pip group across 3 directories with 2 updates by \u003ca href=\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/287\"\u003elangchain-ai/langchain-nvidia#287\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langchain-nvidia/commit/984db834e83461f93520b88b7377c26bb895574c\"\u003e\u003ccode\u003e984db83\u003c/code\u003e\u003c/a\u003e Release/1.4.2 (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/issues/324\"\u003e#324\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langchain-nvidia/commit/648e3fb16c73e5e79986ef2e48802db101d583ee\"\u003e\u003ccode\u003e648e3fb\u003c/code\u003e\u003c/a\u003e fix: use inactivity timeouts for async streaming (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/issues/323\"\u003e#323\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langchain-nvidia/commit/b483c7cad07dd9d5fd0fee2668238c4a08825d86\"\u003e\u003ccode\u003eb483c7c\u003c/code\u003e\u003c/a\u003e Merge commit from fork\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langchain-nvidia/commit/7ebc4cb23a756cd54931b6deb8c6f0450f32ff02\"\u003e\u003ccode\u003e7ebc4cb\u003c/code\u003e\u003c/a\u003e chore: pin aiohttp below 3.14 for vcrpy compatibility (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/issues/320\"\u003e#320\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langchain-nvidia/commit/5ad40e077b33beb29849313625056518facc9200\"\u003e\u003ccode\u003e5ad40e0\u003c/code\u003e\u003c/a\u003e Fix ChatNVIDIA timeout being treated as a model parameter (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/issues/317\"\u003e#317\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langchain-nvidia/commit/875325c3cd3c61a59f80243eb4efee17287e2e32\"\u003e\u003ccode\u003e875325c\u003c/code\u003e\u003c/a\u003e chore(deps): bump aiohttp from 3.14.0 to 3.14.1 in /libs/ai-endpoints in the ...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langchain-nvidia/commit/8a0588d97f06a91204ee466a4a68baa0dc5ccb7e\"\u003e\u003ccode\u003e8a0588d\u003c/code\u003e\u003c/a\u003e feat(ai-endpoints): add version metadata to NVIDIA models (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/issues/318\"\u003e#318\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langchain-nvidia/commit/7a56ac888f9eab2af44c16885d572f981d2534cf\"\u003e\u003ccode\u003e7a56ac8\u003c/code\u003e\u003c/a\u003e chore(deps): bump aiohttp from 3.13.4 to 3.14.0 in /libs/ai-endpoints in the ...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langchain-nvidia/commit/bba3386a02dcf4b94276ebfeab3643de639162e4\"\u003e\u003ccode\u003ebba3386\u003c/code\u003e\u003c/a\u003e bumping version for release (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/issues/315\"\u003e#315\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langchain-nvidia/commit/8bcea30e7dcbd7e5eaa3abf5caf7b3676d380298\"\u003e\u003ccode\u003e8bcea30\u003c/code\u003e\u003c/a\u003e Keep ChatNVIDIA verify_ssl out of payload (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/issues/314\"\u003e#314\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/langchain-ai/langchain-nvidia/compare/libs/ai-endpoints/v1.0.4...libs/ai-endpoints/v1.4.2\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `gitpython` from 3.1.57 to 3.1.62\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/gitpython-developers/GitPython/releases\"\u003egitpython's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e3.1.62\u003c/h2\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eprepare next release by \u003ca href=\"https://github.com/Byron\"\u003e\u003ccode\u003e@​Byron\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/gitpython-developers/GitPython/pull/2222\"\u003egitpython-developers/GitPython#2222\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eKeep bare-repository worktrees non-bare by \u003ca href=\"https://github.com/Byron\"\u003e\u003ccode\u003e@​Byron\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/gitpython-developers/GitPython/pull/2224\"\u003egitpython-developers/GitPython#2224\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eReject unsafe submodule checkout paths by \u003ca href=\"https://github.com/Byron\"\u003e\u003ccode\u003e@​Byron\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/gitpython-developers/GitPython/pull/2225\"\u003egitpython-developers/GitPython#2225\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ebuild(deps): bump \u003ca href=\"https://github.com/astral-sh/ruff-pre-commit\"\u003ehttps://github.com/astral-sh/ruff-pre-commit\u003c/a\u003e from v0.16.0 to 0.16.5 in the pre-commit group by \u003ca href=\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/gitpython-developers/GitPython/pull/2226\"\u003egitpython-developers/GitPython#2226\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix: join backslash line continuations when reading config values by \u003ca href=\"https://github.com/nkbeast\"\u003e\u003ccode\u003e@​nkbeast\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/gitpython-developers/GitPython/pull/2227\"\u003egitpython-developers/GitPython#2227\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/nkbeast\"\u003e\u003ccode\u003e@​nkbeast\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/gitpython-developers/GitPython/pull/2227\"\u003egitpython-developers/GitPython#2227\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/gitpython-developers/GitPython/compare/3.1.61...3.1.62\"\u003ehttps://github.com/gitpython-developers/GitPython/compare/3.1.61...3.1.62\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e3.1.61\u003c/h2\u003e\n\u003cp\u003eFix accidental removal of exploitable regex in \u003ccode\u003eActor\u003c/code\u003e by bringing it back, and deprecating it.\u003c/p\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eFix repository discovery precedence by \u003ca href=\"https://github.com/Byron\"\u003e\u003ccode\u003e@​Byron\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/gitpython-developers/GitPython/pull/2218\"\u003egitpython-developers/GitPython#2218\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix: wait for git daemon to listen before connecting by \u003ca href=\"https://github.com/Vogtinator\"\u003e\u003ccode\u003e@​Vogtinator\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/gitpython-developers/GitPython/pull/2219\"\u003egitpython-developers/GitPython#2219\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix: restore Actor.name_email_regex by \u003ca href=\"https://github.com/Byron\"\u003e\u003ccode\u003e@​Byron\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/gitpython-developers/GitPython/pull/2221\"\u003egitpython-developers/GitPython#2221\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/Vogtinator\"\u003e\u003ccode\u003e@​Vogtinator\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/gitpython-developers/GitPython/pull/2219\"\u003egitpython-developers/GitPython#2219\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/gitpython-developers/GitPython/compare/3.1.60...3.1.61\"\u003ehttps://github.com/gitpython-developers/GitPython/compare/3.1.60...3.1.61\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e3.1.60 Security\u003c/h2\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eprepare changelog prior to release by \u003ca href=\"https://github.com/Byron\"\u003e\u003ccode\u003e@​Byron\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/gitpython-developers/GitPython/pull/2212\"\u003egitpython-developers/GitPython#2212\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ePreserve Git config escape semantics by \u003ca href=\"https://github.com/Byron\"\u003e\u003ccode\u003e@​Byron\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/gitpython-developers/GitPython/pull/2213\"\u003egitpython-developers/GitPython#2213\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eHarden diff path and actor identity parsing by \u003ca href=\"https://github.com/Byron\"\u003e\u003ccode\u003e@​Byron\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/gitpython-developers/GitPython/pull/2215\"\u003egitpython-developers/GitPython#2215\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRequire explicit opt-in for filesystem diffs by \u003ca href=\"https://github.com/Byron\"\u003e\u003ccode\u003e@​Byron\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/gitpython-developers/GitPython/pull/2217\"\u003egitpython-developers/GitPython#2217\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/gitpython-developers/GitPython/compare/3.1.59...3.1.60\"\u003ehttps://github.com/gitpython-developers/GitPython/compare/3.1.59...3.1.60\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e3.1.59 - Security\u003c/h2\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eprepare changelog for upcoming release by \u003ca href=\"https://github.com/Byron\"\u003e\u003ccode\u003e@​Byron\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/gitpython-developers/GitPython/pull/2207\"\u003egitpython-developers/GitPython#2207\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBlock file-reading Git options by \u003ca href=\"https://github.com/Byron\"\u003e\u003ccode\u003e@​Byron\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/gitpython-developers/GitPython/pull/2208\"\u003egitpython-developers/GitPython#2208\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eindex: write blobs via git hash-object, not gitdb's odb.store by \u003ca href=\"https://github.com/caroescm\"\u003e\u003ccode\u003e@​caroescm\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/gitpython-developers/GitPython/pull/2209\"\u003egitpython-developers/GitPython#2209\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBlock separate git directories during clone by \u003ca href=\"https://github.com/Byron\"\u003e\u003ccode\u003e@​Byron\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/gitpython-developers/GitPython/pull/2210\"\u003egitpython-developers/GitPython#2210\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix: harden config parsing boundaries by \u003ca href=\"https://github.com/Byron\"\u003e\u003ccode\u003e@​Byron\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/gitpython-developers/GitPython/pull/2211\"\u003egitpython-developers/GitPython#2211\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003erepo.index.add()\u003c/code\u003e now respects worktree filters  \u003ca href=\"https://redirect.github.com/gitpython-developers/GitPython/pull/2209\"\u003egitpython-developers/GitPython#2209\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/gitpython-developers/GitPython/compare/3.1.58...3.1.59\"\u003ehttps://github.com/gitpython-developers/GitPython/compare/3.1.58...3.1.59\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e3.1.58 - Security and Fixes\u003c/h2\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003etest: allow Python startup before timeout by \u003ca href=\"https://github.com/Byron\"\u003e\u003ccode\u003e@​Byron\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/gitpython-developers/GitPython/pull/2195\"\u003egitpython-developers/GitPython#2195\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/gitpython-developers/GitPython/blob/main/doc/source/changes.rst\"\u003egitpython's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e3.1.62\u003c/h1\u003e\n\u003cp\u003eSecurity fixes for\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gitpython-developers/GitPython/security/advisories/GHSA-59cr-6r3x-644w\"\u003ehttps://github.com/gitpython-developers/GitPython/security/advisories/GHSA-59cr-6r3x-644w\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eIf you can, also try and provide feedback on the upcoming v4 branch\n\u003ca href=\"https://redirect.github.com/gitpython-developers/GitPython/pull/2274\"\u003egitpython-developers/GitPython#2274\u003c/a\u003e - patches welcome.\u003c/p\u003e\n\u003cp\u003eSee the following for all changes.\n\u003ca href=\"https://github.com/gitpython-developers/GitPython/releases/tag/3.1.62\"\u003ehttps://github.com/gitpython-developers/GitPython/releases/tag/3.1.62\u003c/a\u003e\u003c/p\u003e\n\u003ch1\u003e3.1.61\u003c/h1\u003e\n\u003cp\u003eA fixup release to avoid accidental removal of public class regex on Actor.\nIt's now deprecated instead.\u003c/p\u003e\n\u003cp\u003eIf you can, also try and provide feedback on the upcoming v4 branch\n\u003ca href=\"https://redirect.github.com/gitpython-developers/GitPython/pull/2274\"\u003egitpython-developers/GitPython#2274\u003c/a\u003e - patches welcome.\u003c/p\u003e\n\u003cp\u003eSee the following for all changes.\n\u003ca href=\"https://github.com/gitpython-developers/GitPython/releases/tag/3.1.61\"\u003ehttps://github.com/gitpython-developers/GitPython/releases/tag/3.1.61\u003c/a\u003e\u003c/p\u003e\n\u003ch1\u003e3.1.60\u003c/h1\u003e\n\u003cp\u003eSecurity fixes for\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gitpython-developers/GitPython/security/advisories/GHSA-g5vv-9gxw-82hx\"\u003ehttps://github.com/gitpython-developers/GitPython/security/advisories/GHSA-g5vv-9gxw-82hx\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gitpython-developers/GitPython/security/advisories/GHSA-whh4-5q6c-9v3x\"\u003ehttps://github.com/gitpython-developers/GitPython/security/advisories/GHSA-whh4-5q6c-9v3x\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gitpython-developers/GitPython/security/advisories/GHSA-239g-whfq-7xj9\"\u003ehttps://github.com/gitpython-developers/GitPython/security/advisories/GHSA-239g-whfq-7xj9\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eIf you can, also try and provide feedback on the upcoming v4 branch\n\u003ca href=\"https://redirect.github.com/gitpython-developers/GitPython/pull/2274\"\u003egitpython-developers/GitPython#2274\u003c/a\u003e - patches welcome.\u003c/p\u003e\n\u003cp\u003eSee the following for all changes.\n\u003ca href=\"https://github.com/gitpython-developers/GitPython/releases/tag/3.1.60\"\u003ehttps://github.com/gitpython-developers/GitPython/releases/tag/3.1.60\u003c/a\u003e\u003c/p\u003e\n\u003ch1\u003e3.1.59\u003c/h1\u003e\n\u003cp\u003eSecurity fixes for\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gitpython-developers/GitPython/security/advisories/GHSA-5xxx-qhh7-9287\"\u003ehttps://github.com/gitpython-developers/GitPython/security/advisories/GHSA-5xxx-qhh7-9287\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gitpython-developers/GitPython/security/advisories/GHSA-3wxw-xv34-2frg\"\u003ehttps://github.com/gitpython-developers/GitPython/security/advisories/GHSA-3wxw-xv34-2frg\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gitpython-developers/GitPython/security/advisories/GHSA-8mcc-hrx5-hvxc\"\u003ehttps://github.com/gitpython-developers/GitPython/security/advisories/GHSA-8mcc-hrx5-hvxc\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gitpython-developers/GitPython/security/advisories/GHSA-284h-m62q-gf8w\"\u003ehttps://github.com/gitpython-developers/GitPython/security/advisories/GHSA-284h-m62q-gf8w\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gitpython-developers/GitPython/security/advisories/GHSA-7833-fr7j-v32q\"\u003ehttps://github.com/gitpython-developers/GitPython/security/advisories/GHSA-7833-fr7j-v32q\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gitpython-developers/GitPython/commit/1ed0ebc2f2e74d979cdc367a4864a7731fdcc093\"\u003e\u003ccode\u003e1ed0ebc\u003c/code\u003e\u003c/a\u003e Reject submodule checkout paths outside the repository\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gitpython-developers/GitPython/commit/5346d1b587a790bac4dc4f100a28fae9db0fd7c8\"\u003e\u003ccode\u003e5346d1b\u003c/code\u003e\u003c/a\u003e prepare next release\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gitpython-developers/GitPython/commit/c7cf4d13b1ed0a2e70f2a1f3c6b4fc6c2652cf0b\"\u003e\u003ccode\u003ec7cf4d1\u003c/code\u003e\u003c/a\u003e fix: prefer \u003ccode\u003e.git\u003c/code\u003e during repository discovery\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gitpython-developers/GitPython/commit/09f2cf383a992d1af697364569e9f384748c1bd8\"\u003e\u003ccode\u003e09f2cf3\u003c/code\u003e\u003c/a\u003e fix: require opt-in for no-index diffs\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gitpython-developers/GitPython/commit/751473a5f3221d6f989291cbebcc404353fd3ba8\"\u003e\u003ccode\u003e751473a\u003c/code\u003e\u003c/a\u003e fix: parse actor identities without regular expressions\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gitpython-developers/GitPython/commit/66340d77aab9a7468f4aed3681d4ef1e3c0ec931\"\u003e\u003ccode\u003e66340d7\u003c/code\u003e\u003c/a\u003e prepare changelog prior to release\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gitpython-developers/GitPython/commit/ce9d8e8d150e06ae2e2cc2efa229071cd3048a93\"\u003e\u003ccode\u003ece9d8e8\u003c/code\u003e\u003c/a\u003e prepare next release\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gitpython-developers/GitPython/commit/30be45d786e95023e23c616fec5cbabca861b44c\"\u003e\u003ccode\u003e30be45d\u003c/code\u003e\u003c/a\u003e prepare changelog for upcoming release\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/gitpython-developers/GitPython/compare/3.1.57...3.1.62\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `litellm` from 1.93.0 to 1.93.2\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/BerriAI/litellm/releases\"\u003elitellm's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev1.93.2\u003c/h2\u003e\n\u003ch2\u003eVerify Docker Image Signature\u003c/h2\u003e\n\u003cp\u003eAll LiteLLM Docker images are signed with \u003ca href=\"https://docs.sigstore.dev/cosign/overview/\"\u003ecosign\u003c/a\u003e. Every release is signed with the same key introduced in \u003ca href=\"https://github.com/BerriAI/litellm/commit/0112e53046018d726492c814b3644b7d376029d0\"\u003ecommit \u003ccode\u003e0112e53\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eVerify using the pinned commit hash (recommended):\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eA commit hash is cryptographically immutable, so this is the strongest way to ensure you are using the original signing key:\u003c/p\u003e\n\u003cpre lang=\"bash\"\u003e\u003ccode\u003ecosign verify \\\n  --key https://raw.githubusercontent.com/BerriAI/litellm/0112e53046018d726492c814b3644b7d376029d0/cosign.pub \\\n  ghcr.io/berriai/litellm:v1.93.2\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cstrong\u003eVerify using the release tag (convenience):\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eTags are protected in this repository and resolve to the same key. This option is easier to read but relies on tag protection rules:\u003c/p\u003e\n\u003cpre lang=\"bash\"\u003e\u003ccode\u003ecosign verify \\\n  --key https://raw.githubusercontent.com/BerriAI/litellm/v1.93.2/cosign.pub \\\n  ghcr.io/berriai/litellm:v1.93.2\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eExpected output:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eThe following checks were performed on each of these signatures:\n  - The cosign claims were validated\n  - The signatures were verified against the specified public key\n\u003c/code\u003e\u003c/pre\u003e\n\u003chr /\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003echore(release): backport proxy request-handling fixes and refresh runtime deps for 1.93.2 by \u003ca href=\"https://github.com/yuneng-berri\"\u003e\u003ccode\u003e@​yuneng-berri\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/BerriAI/litellm/pull/36318\"\u003eBerriAI/litellm#36318\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/BerriAI/litellm/compare/v1.93.1...v1.93.2\"\u003ehttps://github.com/BerriAI/litellm/compare/v1.93.1...v1.93.2\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003ev1.93.1\u003c/h2\u003e\n\u003ch2\u003eVerify Docker Image Signature\u003c/h2\u003e\n\u003cp\u003eAll LiteLLM Docker images are signed with \u003ca href=\"https://docs.sigstore.dev/cosign/overview/\"\u003ecosign\u003c/a\u003e. Every release is signed with the same key introduced in \u003ca href=\"https://github.com/BerriAI/litellm/commit/0112e53046018d726492c814b3644b7d376029d0\"\u003ecommit \u003ccode\u003e0112e53\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eVerify using the pinned commit hash (recommended):\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eA commit hash is cryptographically immutable, so this is the strongest way to ensure you are using the original signing key:\u003c/p\u003e\n\u003cpre lang=\"bash\"\u003e\u003ccode\u003e\u0026lt;/tr\u0026gt;\u0026lt;/table\u0026gt; \n\u003c/code\u003e\u003c/pre\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/BerriAI/litellm/commit/cd1bd0f4b8af865f8d05fbd938392fdd4703babc\"\u003e\u003ccode\u003ecd1bd0f\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/BerriAI/litellm/issues/36318\"\u003e#36318\u003c/a\u003e from BerriAI/litellm_backport_1_93_x_bp-193x-0808sec2\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/BerriAI/litellm/commit/d7a85d9904f16ce937cb61e600a6544fd7c3256b\"\u003e\u003ccode\u003ed7a85d9\u003c/code\u003e\u003c/a\u003e bump: version 1.93.1 → 1.93.2\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/BerriAI/litellm/commit/c5113d4e5b388d1b696f2397a8ced5a0823c7b31\"\u003e\u003ccode\u003ec5113d4\u003c/code\u003e\u003c/a\u003e chore(deps): bump h2 to 4.4.1\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/BerriAI/litellm/commit/7bd1a3bb08ddfc92053b22219ed01d3ffb32f054\"\u003e\u003ccode\u003e7bd1a3b\u003c/code\u003e\u003c/a\u003e chore(deps): bump gitpython to 3.1.58\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/BerriAI/litellm/commit/8c5d90bb021fa76943a0cc5adc20dba92f3ddaa1\"\u003e\u003ccode\u003e8c5d90b\u003c/code\u003e\u003c/a\u003e chore(deps): upgrade cryptography to 50.0.0 (\u003ca href=\"https://redirect.github.com/BerriAI/litellm/issues/35803\"\u003e#35803\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/BerriAI/litellm/commit/a4fa48f0cf4b483ab49577d5414d3c52d8886abe\"\u003e\u003ccode\u003ea4fa48f\u003c/code\u003e\u003c/a\u003e fix(deps): raise aiohttp floor to 3.14.2 to clear pooled-connection timeouts\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/BerriAI/litellm/commit/1bb9f5d0eea673ca716cc87ae2bdd1670d94b5f2\"\u003e\u003ccode\u003e1bb9f5d\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/BerriAI/litellm/issues/36011\"\u003e#36011\u003c/a\u003e from BerriAI/litellm_maint_batch_2026_07\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/BerriAI/litellm/commit/29be951c770bbcff790aecfb156f03a60dfb08a2\"\u003e\u003ccode\u003e29be951\u003c/code\u003e\u003c/a\u003e chore(proxy): clean up request parameter validation and provider destination ...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/BerriAI/litellm/commit/fc69949d74de4eb364b58ab531ec151a2f266f8f\"\u003e\u003ccode\u003efc69949\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/BerriAI/litellm/issues/34670\"\u003e#34670\u003c/a\u003e from BerriAI/litellm_/stable-backport-1-93-x-d8c02a\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/BerriAI/litellm/commit/e7be74a0b7bbdae20c0c146e2aefdd1973467a71\"\u003e\u003ccode\u003ee7be74a\u003c/code\u003e\u003c/a\u003e chore: refresh uv.lock for 1.93.1\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/BerriAI/litellm/compare/v1.93.0...v1.93.2\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `docling` from 2.115.0 to 2.132.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/docling-project/docling/releases\"\u003edocling's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev2.132.0\u003c/h2\u003e\n\u003ch3\u003eFeature\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003epdf, reading-order:\u003c/strong\u003e Updating the reading-order algoirthm (\u003ca href=\"https://redirect.github.com/docling-project/docling/issues/4276\"\u003e#4276\u003c/a\u003e) (\u003ca href=\"https://github.com/docling-project/docling/commit/42de1e20fe2783c0c30c5b3c0f9c60ab5eef9e16\"\u003e\u003ccode\u003e42de1e2\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eFix\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003ePreserve fidelity when mapping external VLM output (Chandra, dots, MinerU) (\u003ca href=\"https://redirect.github.com/docling-project/docling/issues/4470\"\u003e#4470\u003c/a\u003e) (\u003ca href=\"https://github.com/docling-project/docling/commit/20ba84719e1c9e29f7ddfb731eca7ad00488180d\"\u003e\u003ccode\u003e20ba847\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ecsv:\u003c/strong\u003e Validate first-line dialect before accepting a sniff (\u003ca href=\"https://redirect.github.com/docling-project/docling/issues/4453\"\u003e#4453\u003c/a\u003e) (\u003ca href=\"https://github.com/docling-project/docling/commit/d6f03078ad364108df3e7e82e8f0dcc3fd7f39ea\"\u003e\u003ccode\u003ed6f0307\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003edocx:\u003c/strong\u003e Exclude '\u0026lt;w:bCs\u0026gt;' from bold detection (\u003ca href=\"https://redirect.github.com/docling-project/docling/issues/4366\"\u003e#4366\u003c/a\u003e) (\u003ca href=\"https://github.com/docling-project/docling/commit/bf836f244d92dc001d68230a44a4afa23926df17\"\u003e\u003ccode\u003ebf836f2\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eimage:\u003c/strong\u003e Recognize .gif files as images (\u003ca href=\"https://redirect.github.com/docling-project/docling/issues/4326\"\u003e#4326\u003c/a\u003e) (\u003ca href=\"...\n\n_Description has been truncated_","html_url":"https://github.com/TW199501/langflow/pull/1","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/TW199501%2Flangflow/issues/1","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/1/packages"},{"uuid":"5887062298","node_id":"PR_kwDOTAduXc8AAAABI4O91Q","number":122,"state":"closed","title":"chore(deps)(deps): bump the minor-and-patch group across 1 directory with 39 updates","user":"dependabot[bot]","labels":[],"assignees":[],"locked":false,"comments_count":3,"pull_request":true,"closed_at":"2026-10-17T11:11:30.000Z","author_association":null,"state_reason":null,"created_at":"2026-10-16T15:48:47.000Z","updated_at":"2026-10-17T11:11:33.000Z","time_to_close":69763,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"chore(deps)(deps): bump","group_name":"minor-and-patch","update_count":39,"packages":[{"name":"fastapi","old_version":"0.138.1","new_version":"0.143.0","repository_url":"https://github.com/fastapi/fastapi"},{"name":"langgraph","old_version":"1.2.6","new_version":"1.2.15","repository_url":"https://github.com/langchain-ai/langgraph"},{"name":"langgraph-checkpoint-sqlite","old_version":"3.1.1","new_version":"3.1.2","repository_url":"https://github.com/langchain-ai/langgraph"},{"name":"pydantic","old_version":"2.13.4","new_version":"2.14.1","repository_url":"https://github.com/pydantic/pydantic"},{"name":"langchain-core","old_version":"1.4.8","new_version":"1.6.10","repository_url":"https://github.com/langchain-ai/langchain"},{"name":"langfuse","old_version":"4.12.0","new_version":"4.17.0","repository_url":"https://github.com/langfuse/langfuse"},{"name":"packaging","old_version":"26.2","new_version":"26.3","repository_url":"https://github.com/pypa/packaging"},{"name":"textual","old_version":"8.2.7","new_version":"8.2.8","repository_url":"https://github.com/Textualize/textual"},{"name":"trafilatura","old_version":"2.1.0","new_version":"2.3.1","repository_url":"https://github.com/adbar/trafilatura"},{"name":"markdown","old_version":"3.10.2","new_version":"3.11","repository_url":"https://github.com/Python-Markdown/markdown"},{"name":"pygments","old_version":"2.20.0","new_version":"2.21.0","repository_url":"https://github.com/pygments/pygments"},{"name":"tzdata","old_version":"2026.2","new_version":"2026.5","repository_url":"https://github.com/python/tzdata"},{"name":"click","old_version":"8.4.2","new_version":"8.5.0","repository_url":"https://github.com/pallets/click"},{"name":"python-dotenv","old_version":"1.2.2","new_version":"1.2.4","repository_url":"https://github.com/theskumar/python-dotenv"},{"name":"python-bidi","old_version":"0.6.10","new_version":"0.6.11","repository_url":"https://github.com/MeirKriheli/python-bidi"},{"name":"reportlab","old_version":"5.0.0","new_version":"5.0.1"},{"name":"pypdf","old_version":"6.19.0","new_version":"6.20.1","repository_url":"https://github.com/py-pdf/pypdf"},{"name":"langgraph-sdk","old_version":"0.4.6","new_version":"0.4.7","repository_url":"https://github.com/langchain-ai/langgraph"},{"name":"pytest-mock","old_version":"3.15.1","new_version":"3.16.0","repository_url":"https://github.com/pytest-dev/pytest-mock"},{"name":"ruff","old_version":"0.15.20","new_version":"0.17.0","repository_url":"https://github.com/astral-sh/ruff"},{"name":"mypy","old_version":"2.1.0","new_version":"2.4.0","repository_url":"https://github.com/python/mypy"},{"name":"locust","old_version":"2.45.0","new_version":"2.46.7","repository_url":"https://github.com/locustio/locust"},{"name":"pre-commit","old_version":"4.6.2","new_version":"4.7.0","repository_url":"https://github.com/pre-commit/pre-commit"},{"name":"virtualenv","old_version":"21.14.3","new_version":"21.14.7","repository_url":"https://github.com/pypa/virtualenv"},{"name":"sqlglot","old_version":"30.21.0","new_version":"30.22.0","repository_url":"https://github.com/tobymao/sqlglot"},{"name":"fakeredis","old_version":"2.36.2","new_version":"2.39.0","repository_url":"https://github.com/cunla/fakeredis-py"},{"name":"pywebpush","old_version":"2.4.0","new_version":"2.5.0","repository_url":"https://github.com/web-push-libs/pywebpush"},{"name":"aiohttp","old_version":"3.14.3","new_version":"3.14.5","repository_url":"https://github.com/aio-libs/aiohttp"},{"name":"transformers","old_version":"5.12.1","new_version":"5.19.0","repository_url":"https://github.com/huggingface/transformers"},{"name":"prometheus-client","old_version":"0.25.0","new_version":"0.26.0","repository_url":"https://github.com/prometheus/client_python"},{"name":"playwright","old_version":"1.61.0","new_version":"1.63.0","repository_url":"https://github.com/microsoft/playwright-python"},{"name":"langgraph-checkpoint-postgres","old_version":"3.1.2","new_version":"3.1.3","repository_url":"https://github.com/langchain-ai/langgraph"},{"name":"onnxruntime","old_version":"1.27.0","new_version":"1.31.0","repository_url":"https://github.com/microsoft/onnxruntime"},{"name":"pypdfium2","old_version":"5.12.1","new_version":"5.14.0","repository_url":"https://github.com/pypdfium2-team/pypdfium2"},{"name":"docling","old_version":"2.123.0","new_version":"2.138.0","repository_url":"https://github.com/docling-project/docling"},{"name":"e2b-code-interpreter","old_version":"2.9.2","new_version":"2.11.0","repository_url":"https://github.com/e2b-dev/e2b"},{"name":"temporalio","old_version":"1.32.0","new_version":"1.34.0","repository_url":"https://github.com/temporalio/sdk-python"},{"name":"pymysql","old_version":"1.2.0","new_version":"1.2.3","repository_url":"https://github.com/PyMySQL/PyMySQL"},{"name":"pymongo","old_version":"4.17.0","new_version":"4.18.3","repository_url":"https://github.com/mongodb/mongo-python-driver"}],"path":null,"ecosystem":"pip"},"body":"Bumps the minor-and-patch group with 39 updates in the / directory:\n\n| Package | From | To |\n| --- | --- | --- |\n| [fastapi](https://github.com/fastapi/fastapi) | `0.138.1` | `0.143.0` |\n| [langgraph](https://github.com/langchain-ai/langgraph) | `1.2.6` | `1.2.15` |\n| [langgraph-checkpoint-sqlite](https://github.com/langchain-ai/langgraph) | `3.1.1` | `3.1.2` |\n| [pydantic](https://github.com/pydantic/pydantic) | `2.13.4` | `2.14.1` |\n| [langchain-core](https://github.com/langchain-ai/langchain) | `1.4.8` | `1.6.10` |\n| [langfuse](https://github.com/langfuse/langfuse) | `4.12.0` | `4.17.0` |\n| [packaging](https://github.com/pypa/packaging) | `26.2` | `26.3` |\n| [textual](https://github.com/Textualize/textual) | `8.2.7` | `8.2.8` |\n| [trafilatura](https://github.com/adbar/trafilatura) | `2.1.0` | `2.3.1` |\n| [markdown](https://github.com/Python-Markdown/markdown) | `3.10.2` | `3.11` |\n| [pygments](https://github.com/pygments/pygments) | `2.20.0` | `2.21.0` |\n| [tzdata](https://github.com/python/tzdata) | `2026.2` | `2026.5` |\n| [click](https://github.com/pallets/click) | `8.4.2` | `8.5.0` |\n| [python-dotenv](https://github.com/theskumar/python-dotenv) | `1.2.2` | `1.2.4` |\n| [python-bidi](https://github.com/MeirKriheli/python-bidi) | `0.6.10` | `0.6.11` |\n| [reportlab](https://www.reportlab.com/) | `5.0.0` | `5.0.1` |\n| [pypdf](https://github.com/py-pdf/pypdf) | `6.19.0` | `6.20.1` |\n| [langgraph-sdk](https://github.com/langchain-ai/langgraph) | `0.4.6` | `0.4.7` |\n| [pytest-mock](https://github.com/pytest-dev/pytest-mock) | `3.15.1` | `3.16.0` |\n| [ruff](https://github.com/astral-sh/ruff) | `0.15.20` | `0.17.0` |\n| [mypy](https://github.com/python/mypy) | `2.1.0` | `2.4.0` |\n| [locust](https://github.com/locustio/locust) | `2.45.0` | `2.46.7` |\n| [pre-commit](https://github.com/pre-commit/pre-commit) | `4.6.2` | `4.7.0` |\n| [virtualenv](https://github.com/pypa/virtualenv) | `21.14.3` | `21.14.7` |\n| [sqlglot](https://github.com/tobymao/sqlglot) | `30.21.0` | `30.22.0` |\n| [fakeredis](https://github.com/cunla/fakeredis-py) | `2.36.2` | `2.39.0` |\n| [pywebpush](https://github.com/web-push-libs/pywebpush) | `2.4.0` | `2.5.0` |\n| [aiohttp](https://github.com/aio-libs/aiohttp) | `3.14.3` | `3.14.5` |\n| [transformers](https://github.com/huggingface/transformers) | `5.12.1` | `5.19.0` |\n| [prometheus-client](https://github.com/prometheus/client_python) | `0.25.0` | `0.26.0` |\n| [playwright](https://github.com/microsoft/playwright-python) | `1.61.0` | `1.63.0` |\n| [langgraph-checkpoint-postgres](https://github.com/langchain-ai/langgraph) | `3.1.2` | `3.1.3` |\n| [onnxruntime](https://github.com/microsoft/onnxruntime) | `1.27.0` | `1.31.0` |\n| [pypdfium2](https://github.com/pypdfium2-team/pypdfium2) | `5.12.1` | `5.14.0` |\n| [docling](https://github.com/docling-project/docling) | `2.123.0` | `2.138.0` |\n| [e2b-code-interpreter](https://github.com/e2b-dev/e2b) | `2.9.2` | `2.11.0` |\n| [temporalio](https://github.com/temporalio/sdk-python) | `1.32.0` | `1.34.0` |\n| [pymysql](https://github.com/PyMySQL/PyMySQL) | `1.2.0` | `1.2.3` |\n| [pymongo](https://github.com/mongodb/mongo-python-driver) | `4.17.0` | `4.18.3` |\n\n\nUpdates `fastapi` from 0.138.1 to 0.143.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/fastapi/fastapi/releases\"\u003efastapi's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e0.143.0\u003c/h2\u003e\n\u003cp\u003eAutomatic OpenTelemetry exporter setup is now opt-in. If you rely on FastAPI to configure exporters from \u003ccode\u003eOTEL_*\u003c/code\u003e environment variables, set \u003ccode\u003eFASTAPI_OTEL_AUTO_CONFIGURE=true\u003c/code\u003e or use \u003ccode\u003eFastAPI(telemetry={\u0026quot;auto_configure\u0026quot;: True})\u003c/code\u003e to retain the previous behavior.\u003c/p\u003e\n\u003cp\u003eApplications that configure their own providers and exporters require no changes. FastAPI Cloud enables automatic setup for you.\u003c/p\u003e\n\u003ch3\u003eBreaking Changes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e💥 Require opt-in for automatic OpenTelemetry exporter setup. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16476\"\u003e#16476\u003c/a\u003e by \u003ca href=\"https://github.com/tiangolo\"\u003e\u003ccode\u003e@​tiangolo\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e0.142.4\u003c/h2\u003e\n\u003ch3\u003eFixes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e🐛 Isolate FastAPI telemetry for excluded requests. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16470\"\u003e#16470\u003c/a\u003e by \u003ca href=\"https://github.com/tiangolo\"\u003e\u003ccode\u003e@​tiangolo\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e0.142.3\u003c/h2\u003e\n\u003ch3\u003eFixes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e🐛 Cache OpenTelemetry tracers to preserve warning deduplication. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16468\"\u003e#16468\u003c/a\u003e by \u003ca href=\"https://github.com/tiangolo\"\u003e\u003ccode\u003e@​tiangolo\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eDocs\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e📝 Remove HTML title from newsletter to avoid the tooltip. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16461\"\u003e#16461\u003c/a\u003e by \u003ca href=\"https://github.com/tiangolo\"\u003e\u003ccode\u003e@​tiangolo\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e📝 Embed the FastAPI and friends newsletter signup form. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16459\"\u003e#16459\u003c/a\u003e by \u003ca href=\"https://github.com/tiangolo\"\u003e\u003ccode\u003e@​tiangolo\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e📝 Update skill, use Asyncer for blocking code in threads. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16420\"\u003e#16420\u003c/a\u003e by \u003ca href=\"https://github.com/tiangolo\"\u003e\u003ccode\u003e@​tiangolo\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eTranslations\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e🌐 Update translations for fr (add-missing). PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16436\"\u003e#16436\u003c/a\u003e by \u003ca href=\"https://github.com/apps/pr-submit\"\u003e\u003ccode\u003e@​pr-submit[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🌐 Update translations for hi (add-missing). PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16435\"\u003e#16435\u003c/a\u003e by \u003ca href=\"https://github.com/apps/pr-submit\"\u003e\u003ccode\u003e@​pr-submit[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🌐 Update translations for tr (add-missing). PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16434\"\u003e#16434\u003c/a\u003e by \u003ca href=\"https://github.com/apps/pr-submit\"\u003e\u003ccode\u003e@​pr-submit[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🌐 Update translations for zh (add-missing). PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16433\"\u003e#16433\u003c/a\u003e by \u003ca href=\"https://github.com/apps/pr-submit\"\u003e\u003ccode\u003e@​pr-submit[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🌐 Update translations for zh-hant (add-missing). PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16432\"\u003e#16432\u003c/a\u003e by \u003ca href=\"https://github.com/apps/pr-submit\"\u003e\u003ccode\u003e@​pr-submit[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🌐 Update translations for pt (add-missing). PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16431\"\u003e#16431\u003c/a\u003e by \u003ca href=\"https://github.com/apps/pr-submit\"\u003e\u003ccode\u003e@​pr-submit[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🌐 Update translations for de (add-missing). PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16430\"\u003e#16430\u003c/a\u003e by \u003ca href=\"https://github.com/apps/pr-submit\"\u003e\u003ccode\u003e@​pr-submit[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🌐 Update translations for uk (add-missing). PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16429\"\u003e#16429\u003c/a\u003e by \u003ca href=\"https://github.com/apps/pr-submit\"\u003e\u003ccode\u003e@​pr-submit[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🌐 Update translations for ja (add-missing). PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16428\"\u003e#16428\u003c/a\u003e by \u003ca href=\"https://github.com/apps/pr-submit\"\u003e\u003ccode\u003e@​pr-submit[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🌐 Update translations for ko (add-missing). PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16425\"\u003e#16425\u003c/a\u003e by \u003ca href=\"https://github.com/apps/pr-submit\"\u003e\u003ccode\u003e@​pr-submit[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🌐 Update translations for es (add-missing). PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16426\"\u003e#16426\u003c/a\u003e by \u003ca href=\"https://github.com/apps/pr-submit\"\u003e\u003ccode\u003e@​pr-submit[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🌐 Update translations for ru (add-missing). PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16427\"\u003e#16427\u003c/a\u003e by \u003ca href=\"https://github.com/apps/pr-submit\"\u003e\u003ccode\u003e@​pr-submit[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🌐 Update Russian LLM-prompt. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16449\"\u003e#16449\u003c/a\u003e by \u003ca href=\"https://github.com/YuriiMotov\"\u003e\u003ccode\u003e@​YuriiMotov\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eInternal\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e👷 Fix deprecated command in \u003ccode\u003ebump-pre-commit-hooks\u003c/code\u003e workflow. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16463\"\u003e#16463\u003c/a\u003e by \u003ca href=\"https://github.com/YuriiMotov\"\u003e\u003ccode\u003e@​YuriiMotov\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🔧 Update sponsors: remove Render. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16457\"\u003e#16457\u003c/a\u003e by \u003ca href=\"https://github.com/tiangolo\"\u003e\u003ccode\u003e@​tiangolo\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🔨 Use \u003ccode\u003egpt-6-astra\u003c/code\u003e model for translations. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16453\"\u003e#16453\u003c/a\u003e by \u003ca href=\"https://github.com/YuriiMotov\"\u003e\u003ccode\u003e@​YuriiMotov\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e⬆ Bump the python-packages group across 1 directory with 14 updates. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16447\"\u003e#16447\u003c/a\u003e by \u003ca href=\"https://github.com/apps/dependabot\"\u003e\u003ccode\u003e@​dependabot[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e⬆ Bump starlette from 1.6.0 to 1.7.0. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16440\"\u003e#16440\u003c/a\u003e by \u003ca href=\"https://github.com/apps/dependabot\"\u003e\u003ccode\u003e@​dependabot[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e⬆ Bump pyjwt from 2.13.0 to 2.15.0. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16423\"\u003e#16423\u003c/a\u003e by \u003ca href=\"https://github.com/apps/dependabot\"\u003e\u003ccode\u003e@​dependabot[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e⬆ Bump gitpython from 3.1.60 to 3.1.62. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16444\"\u003e#16444\u003c/a\u003e by \u003ca href=\"https://github.com/apps/dependabot\"\u003e\u003ccode\u003e@​dependabot[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fastapi/fastapi/commit/f5c6e9b4f9cadc1bf0f9a1fd672e621206b63007\"\u003e\u003ccode\u003ef5c6e9b\u003c/code\u003e\u003c/a\u003e 🔖 Release version 0.143.0 (\u003ca href=\"https://redirect.github.com/fastapi/fastapi/issues/16477\"\u003e#16477\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fastapi/fastapi/commit/182c8b8c83a0c3f19b61e31e092570af7d4e637b\"\u003e\u003ccode\u003e182c8b8\u003c/code\u003e\u003c/a\u003e 📝 Update release notes\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fastapi/fastapi/commit/af889e400baeb33c1594c84618a806c9c6a7f7ff\"\u003e\u003ccode\u003eaf889e4\u003c/code\u003e\u003c/a\u003e 💥 Require opt-in for automatic OpenTelemetry exporter setup (\u003ca href=\"https://redirect.github.com/fastapi/fastapi/issues/16476\"\u003e#16476\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fastapi/fastapi/commit/9269f17524e7990c39a9a1708db532810ceffc06\"\u003e\u003ccode\u003e9269f17\u003c/code\u003e\u003c/a\u003e 🔖 Release version 0.142.4 (\u003ca href=\"https://redirect.github.com/fastapi/fastapi/issues/16471\"\u003e#16471\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fastapi/fastapi/commit/78ede017de7ef596b91be036aa31ba331cf77bb6\"\u003e\u003ccode\u003e78ede01\u003c/code\u003e\u003c/a\u003e 📝 Update release notes\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fastapi/fastapi/commit/4e31a07bafd08f247f39ab1e9144ba2a62395757\"\u003e\u003ccode\u003e4e31a07\u003c/code\u003e\u003c/a\u003e 🐛 Isolate FastAPI telemetry for excluded requests (\u003ca href=\"https://redirect.github.com/fastapi/fastapi/issues/16470\"\u003e#16470\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fastapi/fastapi/commit/cb8dabcd4a7b44e180d7c258377ae4b0abf99bff\"\u003e\u003ccode\u003ecb8dabc\u003c/code\u003e\u003c/a\u003e 🔖 Release version 0.142.3 (\u003ca href=\"https://redirect.github.com/fastapi/fastapi/issues/16469\"\u003e#16469\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fastapi/fastapi/commit/787dc561d524349a6eadca365d4f2844d66b1b9d\"\u003e\u003ccode\u003e787dc56\u003c/code\u003e\u003c/a\u003e 📝 Update release notes\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fastapi/fastapi/commit/6eae2f3456c889ad791de38dd45c14e17de775d3\"\u003e\u003ccode\u003e6eae2f3\u003c/code\u003e\u003c/a\u003e 🐛 Cache OpenTelemetry tracers to preserve warning deduplication (\u003ca href=\"https://redirect.github.com/fastapi/fastapi/issues/16468\"\u003e#16468\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fastapi/fastapi/commit/94918c1d40afb27065c64d523219ed2ad9822f76\"\u003e\u003ccode\u003e94918c1\u003c/code\u003e\u003c/a\u003e 📝 Update release notes\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/fastapi/fastapi/compare/0.138.1...0.143.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `langgraph` from 1.2.6 to 1.2.15\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/langchain-ai/langgraph/releases\"\u003elanggraph's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003elanggraph==1.2.15\u003c/h2\u003e\n\u003cp\u003eChanges since 1.2.14\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003erelease(langgraph): 1.2.15 (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9283\"\u003e#9283\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(langgraph): give every message written to a messages DeltaChannel an id (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9275\"\u003e#9275\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(langgraph): save a cached node's writes like a node that ran (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9259\"\u003e#9259\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(langgraph): stop at an interrupt_before breakpoint when a drain is requested before it (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9281\"\u003e#9281\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(langgraph): keep an exit run from a checkpoint the thread moved past out of its newer branch (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9269\"\u003e#9269\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(langgraph): store an update_state input's writes on the checkpoint it updates (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9258\"\u003e#9258\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(langgraph): read a run's DeltaChannel input back only on its own checkpoints (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9260\"\u003e#9260\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(langgraph): snapshot a DeltaChannel that an update_state Overwrite resets (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9263\"\u003e#9263\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(langgraph): keep a fork's DeltaChannel snapshot from starting nodes that never ran (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9264\"\u003e#9264\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(langgraph): don't save a checkpoint past a failed DeltaChannel write (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9235\"\u003e#9235\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(langgraph,prebuilt): stop ToolNode from swallowing invalid resume values (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9232\"\u003e#9232\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(langgraph): never store exit-mode delta writes under the null task id (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9229\"\u003e#9229\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(langgraph): stop astream_events dropping control/interrupts on v1/v2 (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9219\"\u003e#9219\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003echore(deps): bump notebook from 7.5.7 to 7.6.3 in /libs/langgraph (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9206\"\u003e#9206\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(langgraph): give each bulk_update_state update its own task id (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9128\"\u003e#9128\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(langgraph): replay a resumed exit-mode run's delta writes in live order (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9114\"\u003e#9114\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix: order delta channel replay by task path (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/8544\"\u003e#8544\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003elanggraph==1.2.14\u003c/h2\u003e\n\u003cp\u003eChanges since 1.2.13\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003erelease(langgraph): 1.2.14 (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9215\"\u003e#9215\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003elanggraph==1.2.13\u003c/h2\u003e\n\u003cp\u003eChanges since 1.2.12\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003efix(langgraph): fork before replaying an update checkpoint the thread moved past (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9170\"\u003e#9170\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(langgraph): keep an update_state on an older checkpoint out of its other branches (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9165\"\u003e#9165\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(langgraph): keep DeltaChannel counters on every update_state path (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9142\"\u003e#9142\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003erelease(langgraph): 1.2.13 (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9205\"\u003e#9205\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(langgraph): don't walk history for a DeltaChannel that was never written (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9141\"\u003e#9141\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(langgraph): don't replay an abandoned branch into a DeltaChannel fork (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/8548\"\u003e#8548\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003echore(deps): bump notebook from 7.5.6 to 7.5.7 in /libs/langgraph (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9168\"\u003e#9168\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(langgraph): hydrate subgraph delta channels with the caller-resolved saver (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/8538\"\u003e#8538\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(langgraph): stop reporting answered interrupts in get_state (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9103\"\u003e#9103\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003echore(deps-dev): bump the minor-and-patch group across 1 directory with 5 updates (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9155\"\u003e#9155\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003echore(deps-dev): bump the minor-and-patch group in /libs/checkpoint-conformance with 2 updates (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9145\"\u003e#9145\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003echore(deps): bump the minor-and-patch group in /libs/sdk-py with 5 updates (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9149\"\u003e#9149\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003echore(deps): bump tornado from 6.5.8 to 6.5.9 in /libs/langgraph (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9160\"\u003e#9160\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003echore(deps-dev): bump types-requests from 2.33.0.20260712 to 2.33.0.20260906 in /libs/langgraph (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9156\"\u003e#9156\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003echore(deps): bump pyjwt from 2.15.0 to 2.15.1 in /libs/langgraph (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9140\"\u003e#9140\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003echore(deps): bump urllib3 from 2.7.0 to 2.8.0 in /libs/langgraph (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9138\"\u003e#9138\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003echore(deps): bump pyjwt from 2.14.0 to 2.15.0 in /libs/langgraph (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9139\"\u003e#9139\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003echore(deps): bump pyjwt from 2.13.0 to 2.14.0 in /libs/langgraph (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9126\"\u003e#9126\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003elanggraph==1.2.12\u003c/h2\u003e\n\u003cp\u003eChanges since 1.2.11\u003c/p\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langgraph/commit/08a345637fb2bd499f69c90056a22c478a468817\"\u003e\u003ccode\u003e08a3456\u003c/code\u003e\u003c/a\u003e release(langgraph): 1.2.15 (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9283\"\u003e#9283\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langgraph/commit/b7d053b256157ac6b8e8ff5a0783f8a446a9c89e\"\u003e\u003ccode\u003eb7d053b\u003c/code\u003e\u003c/a\u003e fix(langgraph): give every message written to a messages DeltaChannel an id (...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langgraph/commit/395c145c047aaf962a4f599582bbc8d717bd9fa1\"\u003e\u003ccode\u003e395c145\u003c/code\u003e\u003c/a\u003e fix(langgraph): save a cached node's writes like a node that ran (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9259\"\u003e#9259\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langgraph/commit/10f1fabb3b2f2d550b8133fba1217391c27694c4\"\u003e\u003ccode\u003e10f1fab\u003c/code\u003e\u003c/a\u003e fix(langgraph): stop at an interrupt_before breakpoint when a drain is reques...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langgraph/commit/799c2f04fd3a56186e24e9fb8bbf3568e543cfbe\"\u003e\u003ccode\u003e799c2f0\u003c/code\u003e\u003c/a\u003e fix(langgraph): keep an exit run from a checkpoint the thread moved past out ...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langgraph/commit/b4991f1ba36a2449ab59c38ab71828ee865bff84\"\u003e\u003ccode\u003eb4991f1\u003c/code\u003e\u003c/a\u003e fix(langgraph): store an update_state input's writes on the checkpoint it upd...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langgraph/commit/6aa0afba682b0308fbcace31f66fb532978d4dca\"\u003e\u003ccode\u003e6aa0afb\u003c/code\u003e\u003c/a\u003e fix(checkpoint): default InMemorySaver delta history to the latest checkpoint...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langgraph/commit/12aeb0fddb5e835a5745a10a72358c2de37a66a6\"\u003e\u003ccode\u003e12aeb0f\u003c/code\u003e\u003c/a\u003e fix(langgraph): read a run's DeltaChannel input back only on its own checkpoi...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langgraph/commit/d05236f8050c28d38449f81e25382d5991a29223\"\u003e\u003ccode\u003ed05236f\u003c/code\u003e\u003c/a\u003e fix(langgraph): snapshot a DeltaChannel that an update_state Overwrite resets...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langgraph/commit/9d92f33cca143926c563deb87ce377397883cd92\"\u003e\u003ccode\u003e9d92f33\u003c/code\u003e\u003c/a\u003e fix(langgraph): keep a fork's DeltaChannel snapshot from starting nodes that ...\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/langchain-ai/langgraph/compare/1.2.6...1.2.15\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `langgraph-checkpoint-sqlite` from 3.1.1 to 3.1.2\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/langchain-ai/langgraph/releases\"\u003elanggraph-checkpoint-sqlite's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003elanggraph-checkpoint-postgres==3.1.2\u003c/h2\u003e\n\u003cp\u003eChanges since checkpointpostgres==3.1.1\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003erelease(checkpoint-postgres): 3.1.2 (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/8565\"\u003e#8565\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003erelease(checkpoint): 4.2.0 (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/8563\"\u003e#8563\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003etest(checkpoint-postgres,checkpoint-sqlite): run the conformance suite (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/8537\"\u003e#8537\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(checkpoint-postgres): find plain-value seeds when walking delta history (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/8535\"\u003e#8535\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003echore: enable RUF100 and clear unused noqa directives (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/8546\"\u003e#8546\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003echore(checkpoint-postgres,checkpoint-sqlite): enable PLC0415 lint rule (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/8540\"\u003e#8540\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003echore(deps): bump the minor-and-patch group in /libs/checkpoint-postgres with 5 updates (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/8497\"\u003e#8497\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003elanggraph-checkpoint-sqlite==3.1.2\u003c/h2\u003e\n\u003cp\u003eChanges since checkpointsqlite==3.1.1\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003erelease(checkpoint-sqlite): 3.1.2 (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9288\"\u003e#9288\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(checkpoint-postgres,checkpoint-sqlite): treat an empty checkpoint_id as the latest in delta history (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9262\"\u003e#9262\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(checkpoint,checkpoint-postgres,checkpoint-sqlite): validate namespace labels before store dispatch (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9217\"\u003e#9217\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix: order delta channel replay by task path (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/8544\"\u003e#8544\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003echore(deps-dev): bump the minor-and-patch group in /libs/checkpoint-sqlite with 3 updates (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9146\"\u003e#9146\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003echore(deps): bump urllib3 from 2.7.0 to 2.8.0 in /libs/checkpoint-sqlite (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9135\"\u003e#9135\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(checkpoint-sqlite): walk delta ancestors by parent pointer (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/8557\"\u003e#8557\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003echore(deps): bump anyio from 4.12.1 to 4.14.2 in /libs/checkpoint-sqlite (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/8993\"\u003e#8993\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003echore(deps-dev): bump the minor-and-patch group in /libs/checkpoint-sqlite with 2 updates (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/8772\"\u003e#8772\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(checkpoint): widen \u003ccode\u003eStore\u003c/code\u003e \u003ccode\u003eput\u003c/code\u003e value type to \u003ccode\u003eMapping[str, Any]\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/8617\"\u003e#8617\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003erelease(checkpoint): 4.2.0 (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/8563\"\u003e#8563\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003etest(checkpoint-postgres,checkpoint-sqlite): run the conformance suite (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/8537\"\u003e#8537\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003echore: enable RUF100 and clear unused noqa directives (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/8546\"\u003e#8546\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003echore(checkpoint-postgres,checkpoint-sqlite): enable PLC0415 lint rule (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/8540\"\u003e#8540\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003echore(deps): bump the minor-and-patch group in /libs/checkpoint-sqlite with 4 updates (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/8494\"\u003e#8494\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langgraph/commit/1074714c260486900d9bec9b5dd48e13883dd5df\"\u003e\u003ccode\u003e1074714\u003c/code\u003e\u003c/a\u003e release(checkpoint-sqlite): 3.1.2 (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9288\"\u003e#9288\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langgraph/commit/740461ed50f89f867b0c3a1e46fa6d2a4e339cf4\"\u003e\u003ccode\u003e740461e\u003c/code\u003e\u003c/a\u003e release(sdk-py): 0.4.7 (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9289\"\u003e#9289\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langgraph/commit/08a345637fb2bd499f69c90056a22c478a468817\"\u003e\u003ccode\u003e08a3456\u003c/code\u003e\u003c/a\u003e release(langgraph): 1.2.15 (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9283\"\u003e#9283\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langgraph/commit/b7d053b256157ac6b8e8ff5a0783f8a446a9c89e\"\u003e\u003ccode\u003eb7d053b\u003c/code\u003e\u003c/a\u003e fix(langgraph): give every message written to a messages DeltaChannel an id (...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langgraph/commit/395c145c047aaf962a4f599582bbc8d717bd9fa1\"\u003e\u003ccode\u003e395c145\u003c/code\u003e\u003c/a\u003e fix(langgraph): save a cached node's writes like a node that ran (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9259\"\u003e#9259\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langgraph/commit/10f1fabb3b2f2d550b8133fba1217391c27694c4\"\u003e\u003ccode\u003e10f1fab\u003c/code\u003e\u003c/a\u003e fix(langgraph): stop at an interrupt_before breakpoint when a drain is reques...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langgraph/commit/799c2f04fd3a56186e24e9fb8bbf3568e543cfbe\"\u003e\u003ccode\u003e799c2f0\u003c/code\u003e\u003c/a\u003e fix(langgraph): keep an exit run from a checkpoint the thread moved past out ...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langgraph/commit/b4991f1ba36a2449ab59c38ab71828ee865bff84\"\u003e\u003ccode\u003eb4991f1\u003c/code\u003e\u003c/a\u003e fix(langgraph): store an update_state input's writes on the checkpoint it upd...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langgraph/commit/6aa0afba682b0308fbcace31f66fb532978d4dca\"\u003e\u003ccode\u003e6aa0afb\u003c/code\u003e\u003c/a\u003e fix(checkpoint): default InMemorySaver delta history to the latest checkpoint...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langgraph/commit/12aeb0fddb5e835a5745a10a72358c2de37a66a6\"\u003e\u003ccode\u003e12aeb0f\u003c/code\u003e\u003c/a\u003e fix(langgraph): read a run's DeltaChannel input back only on its own checkpoi...\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/langchain-ai/langgraph/compare/checkpointsqlite==3.1.1...checkpointsqlite==3.1.2\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `pydantic` from 2.13.4 to 2.14.1\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pydantic/pydantic/releases\"\u003epydantic's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev2.14.1 2026-10-11\u003c/h2\u003e\n\u003ch3\u003eWhat's Changed\u003c/h3\u003e\n\u003ch4\u003ePerformance\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eAvoid Python tuple allocation during model fields validation by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13955\"\u003e#13955\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAvoid unnecessary extra dict allocation in model validation by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13956\"\u003e#13956\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4\u003eFixes\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eFix \u003ccode\u003earguments-v3\u003c/code\u003e schema with variadic keywords by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13954\"\u003e#13954\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix \u003ccode\u003eTypeError\u003c/code\u003e on \u003ccode\u003eForwardRef\u003c/code\u003e on Python 3.10.0 by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13964\"\u003e#13964\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eclosed\u003c/code\u003e and \u003ccode\u003eextra_items\u003c/code\u003e via inheritance in \u003ccode\u003eTypedDict\u003c/code\u003e by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13967\"\u003e#13967\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eEnforce the \u003ccode\u003emax_digits\u003c/code\u003e whole-digits limit in the Python \u003ccode\u003eDecimal\u003c/code\u003e validator by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13972\"\u003e#13972\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eReject out-of-range int inputs for \u003ccode\u003etimedelta\u003c/code\u003e by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13973\"\u003e#13973\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eSupport named tuples in \u003ccode\u003eSequence\u003c/code\u003e validation by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13978\"\u003e#13978\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pydantic/pydantic/compare/v2.14.0...v2.14.1\"\u003ehttps://github.com/pydantic/pydantic/compare/v2.14.0...v2.14.1\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003ev2.14.0 2026-10-08\u003c/h2\u003e\n\u003ch3\u003eWhat's Changed\u003c/h3\u003e\n\u003cp\u003eThe highlights of the v2.14 release are available in the \u003ca href=\"https://pydantic.dev/articles/pydantic-v2-14-release\"\u003eblog post\u003c/a\u003e.\nSeveral minor changes (considered non-breaking changes according to our \u003ca href=\"https://pydantic.dev/docs/validation/2.14/get-started/version-policy/#pydantic-v2\"\u003eversioning policy\u003c/a\u003e) are also included in this release. Make sure to look into them before upgrading.\u003c/p\u003e\n\u003cp\u003eThis release drops support for Python 3.9 and adds support for Python 3.15.\u003c/p\u003e\n\u003ch4\u003eNew Features\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eAdd support for \u003ccode\u003emultiple_of\u003c/code\u003e constraint in \u003ccode\u003efraction\u003c/code\u003e and \u003ccode\u003etimedelta\u003c/code\u003e core schemas by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13873\"\u003e#13873\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003e__namespace__\u003c/code\u003e parameter to \u003ccode\u003ecreate_model()\u003c/code\u003e by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13895\"\u003e#13895\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4\u003eChanges\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eAdd an \u003ccode\u003eordered-dict\u003c/code\u003e core schema by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13796\"\u003e#13796\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdd a \u003ccode\u003ecounter\u003c/code\u003e core schema by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13824\"\u003e#13824\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eDo not mutate \u003ccode\u003emodel_config\u003c/code\u003e attribute by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13825\"\u003e#13825\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eReject newlines in \u003ccode\u003eNameEmail\u003c/code\u003e validation by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13897\"\u003e#13897\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4\u003eFixes\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eCall enum constructors in both validation modes by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13792\"\u003e#13792\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix documentation examples not raising and remove unused \u003ccode\u003estring_sub_type\u003c/code\u003e unused error code by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13821\"\u003e#13821\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eCatch \u003ccode\u003eOverflowError\u003c/code\u003e during \u003ccode\u003eByteSize\u003c/code\u003e validation by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13850\"\u003e#13850\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRequire \u003ccode\u003emultiple_of\u003c/code\u003e constraints to be positive by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13862\"\u003e#13862\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAlways pop field name and model type stacks during schema generation by \u003ca href=\"https://github.com/saquibjawedbit\"\u003e\u003ccode\u003e@​saquibjawedbit\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13859\"\u003e#13859\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eHandle \u003ccode\u003eTypeError\u003c/code\u003e gracefully during docstring extraction by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13874\"\u003e#13874\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix config propagation of stdlib dataclasses and \u003ccode\u003eTypedDict\u003c/code\u003es in JSON Schema by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13891\"\u003e#13891\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eDon't apply \u003ccode\u003eser_json_timedelta\u003c/code\u003e to all datetime types in serialization inference by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13892\"\u003e#13892\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eEncode JSON Schema defaults with a consistent configuration by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13893\"\u003e#13893\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pydantic/pydantic/blob/main/HISTORY.md\"\u003epydantic's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003ev2.14.0 (2026-10-08)\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/pydantic/pydantic/releases/tag/v2.14.0\"\u003eGitHub release\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eWhat's Changed\u003c/h3\u003e\n\u003cp\u003eThe highlights of the v2.14 release are available in the \u003ca href=\"https://pydantic.dev/articles/pydantic-v2-14-release\"\u003eblog post\u003c/a\u003e.\nSeveral minor changes (considered non-breaking changes according to our \u003ca href=\"https://pydantic.dev/docs/validation/2.14/get-started/version-policy/#pydantic-v2\"\u003eversioning policy\u003c/a\u003e)\nare also included in this release. Make sure to look into them before upgrading.\u003c/p\u003e\n\u003cp\u003eThis release drops support for Python 3.9 and adds support for Python 3.15.\u003c/p\u003e\n\u003ch4\u003eNew Features\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eAdd support for \u003ccode\u003emultiple_of\u003c/code\u003e constraint in \u003ccode\u003efraction\u003c/code\u003e and \u003ccode\u003etimedelta\u003c/code\u003e core schemas by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13873\"\u003e#13873\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003e__namespace__\u003c/code\u003e parameter to \u003ccode\u003ecreate_model()\u003c/code\u003e by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13895\"\u003e#13895\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4\u003eChanges\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eAdd an \u003ccode\u003eordered-dict\u003c/code\u003e core schema by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13796\"\u003e#13796\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdd a \u003ccode\u003ecounter\u003c/code\u003e core schema by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13824\"\u003e#13824\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eDo not mutate \u003ccode\u003emodel_config\u003c/code\u003e attribute by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13825\"\u003e#13825\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eReject newlines in \u003ccode\u003eNameEmail\u003c/code\u003e validation by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13897\"\u003e#13897\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4\u003eFixes\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eCall enum constructors in both validation modes by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13792\"\u003e#13792\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix documentation examples not raising and remove unused \u003ccode\u003estring_sub_type\u003c/code\u003e unused error code by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13821\"\u003e#13821\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eCatch \u003ccode\u003eOverflowError\u003c/code\u003e during \u003ccode\u003eByteSize\u003c/code\u003e validation by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13850\"\u003e#13850\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRequire \u003ccode\u003emultiple_of\u003c/code\u003e constraints to be positive by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13862\"\u003e#13862\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAlways pop field name and model type stacks during schema generation by \u003ca href=\"https://github.com/saquibjawedbit\"\u003e\u003ccode\u003e@​saquibjawedbit\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13859\"\u003e#13859\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eHandle \u003ccode\u003eTypeError\u003c/code\u003e gracefully during docstring extraction by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13874\"\u003e#13874\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix config propagation of stdlib dataclasses and \u003ccode\u003eTypedDict\u003c/code\u003es in JSON Schema by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13891\"\u003e#13891\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eDon't apply \u003ccode\u003eser_json_timedelta\u003c/code\u003e to all datetime types in serialization inference by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13892\"\u003e#13892\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eEncode JSON Schema defaults with a consistent configuration by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13893\"\u003e#13893\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ePropagate \u003ccode\u003einit\u003c/code\u003e and \u003ccode\u003ekw_only=False\u003c/code\u003e from \u003ccode\u003eField()\u003c/code\u003e to stdlib dataclass fields by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13898\"\u003e#13898\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRespect propagated extra config in the JSON Schema of stdlib dataclasses by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13899\"\u003e#13899\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eHandle OS errors during \u003ccode\u003eZoneInfo\u003c/code\u003e validation by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13912\"\u003e#13912\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eHandle exceptions during \u003ccode\u003eDecimal\u003c/code\u003e validation by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13940\"\u003e#13940\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRebuild incomplete types during serialization inference by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13922\"\u003e#13922\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eReject large exponents in \u003ccode\u003eFraction\u003c/code\u003e validation by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13944\"\u003e#13944\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAvoid validating URL prefix multiple times in multi host URLs by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13945\"\u003e#13945\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eNew Contributors\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/saquibjawedbit\"\u003e\u003ccode\u003e@​saquibjawedbit\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13859\"\u003e#13859\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pydantic/pydantic/commit/b2212c787fb5c73386dc770681ec49cd09da8e73\"\u003e\u003ccode\u003eb2212c7\u003c/code\u003e\u003c/a\u003e Prepare release v2.14.1\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pydantic/pydantic/commit/968fb2b6eed196a3f17ca9a3aa4697b518614531\"\u003e\u003ccode\u003e968fb2b\u003c/code\u003e\u003c/a\u003e Fix docs conversion table\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pydantic/pydantic/commit/6adc8b3f6146cabf290bdefd51c87486dd659091\"\u003e\u003ccode\u003e6adc8b3\u003c/code\u003e\u003c/a\u003e Support named tuples in \u003ccode\u003eSequence\u003c/code\u003e validation\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pydantic/pydantic/commit/7637fbc31c91f86870c3b34d220d5b7fd62c54db\"\u003e\u003ccode\u003e7637fbc\u003c/code\u003e\u003c/a\u003e Reject out-of-range int inputs for \u003ccode\u003etimedelta\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pydantic/pydantic/commit/dfdbfcb5fa6cf0ae291cb8aebc5bf2153670fe9c\"\u003e\u003ccode\u003edfdbfcb\u003c/code\u003e\u003c/a\u003e Enforce the \u003ccode\u003emax_digits\u003c/code\u003e whole-digits limit in the Python \u003ccode\u003eDecimal\u003c/code\u003e validator\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pydantic/pydantic/commit/e2456d3161d0969b917fc769b2e06b7e076cb886\"\u003e\u003ccode\u003ee2456d3\u003c/code\u003e\u003c/a\u003e Support \u003ccode\u003eclosed\u003c/code\u003e and \u003ccode\u003eextra_items\u003c/code\u003e via inheritance in \u003ccode\u003eTypedDict\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pydantic/pydantic/commit/317655dfe022ebfc818c8e8e744b671fe53d8c3f\"\u003e\u003ccode\u003e317655d\u003c/code\u003e\u003c/a\u003e Harden CI security\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pydantic/pydantic/commit/3ba1dd48939542a04748a9bcfd3248496fa0bcc5\"\u003e\u003ccode\u003e3ba1dd4\u003c/code\u003e\u003c/a\u003e Fix \u003ccode\u003eTypeError\u003c/code\u003e on \u003ccode\u003eForwardRef\u003c/code\u003e on Python 3.10.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pydantic/pydantic/commit/43681abc488119808fcdae2f60cadd5520ceed26\"\u003e\u003ccode\u003e43681ab\u003c/code\u003e\u003c/a\u003e Bump \u003ccode\u003esamuelcolvin/check-python-version\u003c/code\u003e action to v5.1\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pydantic/pydantic/commit/d6bc53a8559d93814009eb2043db133a90f7f921\"\u003e\u003ccode\u003ed6bc53a\u003c/code\u003e\u003c/a\u003e Avoid unnecessary extra dict allocation in model validation\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/pydantic/pydantic/compare/v2.13.4...v2.14.1\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `langchain-core` from 1.4.8 to 1.6.10\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/langchain-ai/langchain/releases\"\u003elangchain-core's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003elangchain-core==1.6.10\u003c/h2\u003e\n\u003cp\u003eChanges since langchain-core==1.6.9\u003c/p\u003e\n\u003cp\u003erelease(core): 1.6.10 (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/41220\"\u003e#41220\u003c/a\u003e)\nfeat(core,anthropic,openai): declare mid-conversation support in model profiles (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/41180\"\u003e#41180\u003c/a\u003e)\u003c/p\u003e\n\u003ch2\u003elangchain-core==1.6.9\u003c/h2\u003e\n\u003cp\u003eChanges since langchain-core==1.6.8\u003c/p\u003e\n\u003cp\u003erelease(core): 1.6.9 (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/41160\"\u003e#41160\u003c/a\u003e)\nfeat(core): accept a callable in with_retry (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/41158\"\u003e#41158\u003c/a\u003e)\u003c/p\u003e\n\u003ch2\u003elangchain-core==1.6.8\u003c/h2\u003e\n\u003cp\u003eChanges since langchain-core==1.6.7\u003c/p\u003e\n\u003cp\u003erelease(core): 1.6.8 (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/41153\"\u003e#41153\u003c/a\u003e)\nfix(core): harden scoped and compatible IPv6 SSRF checks (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/41151\"\u003e#41151\u003c/a\u003e)\u003c/p\u003e\n\u003ch2\u003elangchain-core==1.6.7\u003c/h2\u003e\n\u003cp\u003eChanges since langchain-core==1.6.6\u003c/p\u003e\n\u003cp\u003erelease(core): 1.6.7 (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/41087\"\u003e#41087\u003c/a\u003e)\nfix(core): include openai redacted_content in v1 output for bedrock converse (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/41086\"\u003e#41086\u003c/a\u003e)\nfix(core): python 3.14 hardening around \u003ccode\u003einspect.signature\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/41059\"\u003e#41059\u003c/a\u003e)\nchore(deps): bump notebook from 7.5.7 to 7.6.3 in /libs/core (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/41057\"\u003e#41057\u003c/a\u003e)\nchore(deps): bump notebook from 7.5.6 to 7.5.7 in /libs/core (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/40992\"\u003e#40992\u003c/a\u003e)\nchore(deps): bump urllib3 from 2.7.0 to 2.8.0 in /libs/core (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/40972\"\u003e#40972\u003c/a\u003e)\nchore(deps): bump tornado from 6.5.8 to 6.5.9 in /libs/core (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/40970\"\u003e#40970\u003c/a\u003e)\u003c/p\u003e\n\u003ch2\u003elangchain-core==1.6.6\u003c/h2\u003e\n\u003cp\u003eChanges since langchain-core==1.6.5\u003c/p\u003e\n\u003cp\u003erelease(core): 1.6.6 (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/40906\"\u003e#40906\u003c/a\u003e)\nfix(anthropic): support Claude Sonnet 5.5 compatibility (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/40882\"\u003e#40882\u003c/a\u003e)\ndocs(core): fix docstring examples that don't run as copied (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/40815\"\u003e#40815\u003c/a\u003e)\u003c/p\u003e\n\u003ch2\u003elangchain-core==1.6.5\u003c/h2\u003e\n\u003cp\u003eChanges since langchain-core==1.6.4\u003c/p\u003e\n\u003cp\u003erelease(core): 1.6.5 (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/40816\"\u003e#40816\u003c/a\u003e)\nfix(core): abbreviate long tool IDs in XML buffer strings (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/40792\"\u003e#40792\u003c/a\u003e)\u003c/p\u003e\n\u003ch2\u003elangchain-core==1.6.4\u003c/h2\u003e\n\u003cp\u003eChanges since langchain-core==1.6.3\u003c/p\u003e\n\u003cp\u003erelease(core): 1.6.4 (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/40718\"\u003e#40718\u003c/a\u003e)\nchore(core): deprecate chat message history (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/40711\"\u003e#40711\u003c/a\u003e)\nchore(deps): bump anyio from 4.12.0 to 4.14.2 in /libs/core (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/40634\"\u003e#40634\u003c/a\u003e)\nchore(deps): bump soupsieve from 2.8.4 to 2.9 in /libs/core (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/40574\"\u003e#40574\u003c/a\u003e)\u003c/p\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langchain/commit/fddca066031a2122b3562485bd9c961a46978a1e\"\u003e\u003ccode\u003efddca06\u003c/code\u003e\u003c/a\u003e release(core): 1.6.10 (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/41220\"\u003e#41220\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langchain/commit/e4b143729ffb3c6307376909d3aa9921b360c1f5\"\u003e\u003ccode\u003ee4b1437\u003c/code\u003e\u003c/a\u003e chore(model-profiles): refresh model profile data (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/41145\"\u003e#41145\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langchain/commit/b060a7466482ed5dac5fa1ef12e3ad21cccce385\"\u003e\u003ccode\u003eb060a74\u003c/code\u003e\u003c/a\u003e feat(core,anthropic,openai): declare mid-conversation support in model profil...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langchain/commit/34489d61433cbf5044a630de2e7797e361672900\"\u003e\u003ccode\u003e34489d6\u003c/code\u003e\u003c/a\u003e release(langchain): 1.4.4 (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/41163\"\u003e#41163\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langchain/commit/e7ca68b92062312221d7768a9d731a2d4942416b\"\u003e\u003ccode\u003ee7ca68b\u003c/code\u003e\u003c/a\u003e fix(langchain): (SummarizationMiddleware) retry summary step on context overf...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langchain/commit/fc7dc7757a46ebb444be1ead0efdeab5ca7ad8ce\"\u003e\u003ccode\u003efc7dc77\u003c/code\u003e\u003c/a\u003e release(core): 1.6.9 (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/41160\"\u003e#41160\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langchain/commit/a055e836fd4ff75bfc2fe4adda33d06f0d625a63\"\u003e\u003ccode\u003ea055e83\u003c/code\u003e\u003c/a\u003e feat(core): accept a callable in with_retry (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/41158\"\u003e#41158\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langchain/commit/2baf2f33c72cf027383a0b123e9be5077eb483d5\"\u003e\u003ccode\u003e2baf2f3\u003c/code\u003e\u003c/a\u003e release(openai): 1.7.0 (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/41154\"\u003e#41154\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langchain/commit/4acca6482ca3fefca9cfa2f961bbd8819eaa23ae\"\u003e\u003ccode\u003e4acca64\u003c/code\u003e\u003c/a\u003e release(core): 1.6.8 (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/41153\"\u003e#41153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langchain/commit/b53209be4c01f17217ac0a00ef679f493dde23b3\"\u003e\u003ccode\u003eb53209b\u003c/code\u003e\u003c/a\u003e feat(openai): support decisions api (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/41125\"\u003e#41125\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/langchain-ai/langchain/compare/langchain-core==1.4.8...langchain-core==1.6.10\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `langfuse` from 4.12.0 to 4.17.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/langfuse/langfuse/releases\"\u003elangfuse's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev4.17.0\u003c/h2\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003ch3\u003eFeatures\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003efeat(evals): new evaluation UX by \u003ca href=\"https://github.com/wochinge\"\u003e\u003ccode\u003e@​wochinge\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/15906\"\u003elangfuse/langfuse#15906\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat(annotation-queues): create queues from trace table by \u003ca href=\"https://github.com/bezbac\"\u003e\u003ccode\u003e@​bezbac\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16355\"\u003elangfuse/langfuse#16355\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat(modern-session): display arbitrary metadata by \u003ca href=\"https://github.com/nimarb\"\u003e\u003ccode\u003e@​nimarb\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16063\"\u003elangfuse/langfuse#16063\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat(billing): CHB project events to event bus by \u003ca href=\"https://github.com/Steffen911\"\u003e\u003ccode\u003e@​Steffen911\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/15461\"\u003elangfuse/langfuse#15461\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat(v4-migration): show the migration UI by default on dual write mode by \u003ca href=\"https://github.com/Steffen911\"\u003e\u003ccode\u003e@​Steffen911\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16316\"\u003elangfuse/langfuse#16316\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat(web): make markdown render character limit configurable at container runtime by \u003ca href=\"https://github.com/DavidTraina\"\u003e\u003ccode\u003e@​DavidTraina\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16166\"\u003elangfuse/langfuse#16166\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat(in-app-agent): emit sandbox lifecycle metrics for MicroVMs by \u003ca href=\"https://github.com/LysanderKie\"\u003e\u003ccode\u003e@​LysanderKie\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16394\"\u003elangfuse/langfuse#16394\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat(annotation-queues): create queues from events table by \u003ca href=\"https://github.com/bezbac\"\u003e\u003ccode\u003e@​bezbac\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16427\"\u003elangfuse/langfuse#16427\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat(in-app-agent): cache stable Bedrock prefixes across turns by \u003ca href=\"https://github.com/LysanderKie\"\u003e\u003ccode\u003e@​LysanderKie\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16459\"\u003elangfuse/langfuse#16459\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat(evals): show and filter evaluator models by \u003ca href=\"https://github.com/wochinge\"\u003e\u003ccode\u003e@​wochinge\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16466\"\u003elangfuse/langfuse#16466\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat(in-app-agent): Add Anthropic Messages as a supported model provider for Langfuse Assistant (OSS) by \u003ca href=\"https://github.com/LysanderKie\"\u003e\u003ccode\u003e@​LysanderKie\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16385\"\u003elangfuse/langfuse#16385\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat(onboarding): Ask to enable AI features during onboarding by \u003ca href=\"https://github.com/bezbac\"\u003e\u003ccode\u003e@​bezbac\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16389\"\u003elangfuse/langfuse#16389\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eFixes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003efix(in-app-agent): explain failed background runs without leaking internals by \u003ca href=\"https://github.com/LysanderKie\"\u003e\u003ccode\u003e@​LysanderKie\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16387\"\u003elangfuse/langfuse#16387\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(in-app-agent): refuse to delete user project keys during MCP cleanup by \u003ca href=\"https://github.com/LysanderKie\"\u003e\u003ccode\u003e@​LysanderKie\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16393\"\u003elangfuse/langfuse#16393\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(structure): restore the sensor's import graph and re-snapshot the baseline by \u003ca href=\"https://github.com/nkabardin\"\u003e\u003ccode\u003e@​nkabardin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16390\"\u003elangfuse/langfuse#16390\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(in-app-agent): mark loop errors on the APM span after ACK by \u003ca href=\"https://github.com/LysanderKie\"\u003e\u003ccode\u003e@​LysanderKie\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16404\"\u003elangfuse/langfuse#16404\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(assistant): preserve model prompts in traces by \u003ca href=\"https://github.com/bezbac\"\u003e\u003ccode\u003e@​bezbac\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16407\"\u003elangfuse/langfuse#16407\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix: remove score chart style prop overrides by \u003ca href=\"https://github.com/wochinge\"\u003e\u003ccode\u003e@​wochinge\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16403\"\u003elangfuse/langfuse#16403\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(modern-session): format tokens with thousands by \u003ca href=\"https://github.com/nimarb\"\u003e\u003ccode\u003e@​nimarb\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16423\"\u003elangfuse/langfuse#16423\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(web): drop stale-version toast in favor of the update banner by \u003ca href=\"https://github.com/nkabardin\"\u003e\u003ccode\u003e@​nkabardin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16422\"\u003elangfuse/langfuse#16422\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(trace): stop the timeline describing its own geometry by \u003ca href=\"https://github.com/nkabardin\"\u003e\u003ccode\u003e@​nkabardin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16419\"\u003elangfuse/langfuse#16419\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(monitors): bound the monitor scheduler's claim query and fix redis instrumentation by \u003ca href=\"https://github.com/marksalpeter\"\u003e\u003ccode\u003e@​marksalpeter\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16213\"\u003elangfuse/langfuse#16213\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(in-app-agent): rewrite step-limit wrap-up so Bedrock never sees assistant prefill by \u003ca href=\"https://github.com/LysanderKie\"\u003e\u003ccode\u003e@​LysanderKie\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16424\"\u003elangfuse/langfuse#16424\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(evals): link code evaluators to their scores by \u003ca href=\"https://github.com/wochinge\"\u003e\u003ccode\u003e@​wochinge\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16438\"\u003elangfuse/langfuse#16438\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(scores): support evaluator metadata filters by \u003ca href=\"https://github.com/wochinge\"\u003e\u003ccode\u003e@​wochinge\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16439\"\u003elangfuse/langfuse#16439\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(api): keep migrated evaluation rules manageable by \u003ca href=\"https://github.com/wochinge\"\u003e\u003ccode\u003e@​wochinge\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16449\"\u003elangfuse/langfuse#16449\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(annotation-queues): Don't reset trace expansion state between traces by \u003ca href=\"https://github.com/bezbac\"\u003e\u003ccode\u003e@​bezbac\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16417\"\u003elangfuse/langfuse#16417\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix: sidestep 500 on NextAuth HTML routes when callback URL is invalid  by \u003ca href=\"https://github.com/sumerman\"\u003e\u003ccode\u003e@​sumerman\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16461\"\u003elangfuse/langfuse#16461\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(evals): stop validating rule mappings when updating an evaluator by \u003ca href=\"https://github.com/cursor\"\u003e\u003ccode\u003e@​cursor\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16460\"\u003elangfuse/langfuse#16460\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(evals): activate disabled rules on evaluator attach by \u003ca href=\"https://github.com/wochinge\"\u003e\u003ccode\u003e@​wochinge\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16465\"\u003elangfuse/langfuse#16465\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(mcp): Use matches observation filters by \u003ca href=\"https://github.com/bezbac\"\u003e\u003ccode\u003e@​bezbac\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16410\"\u003elangfuse/langfuse#16410\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eChores\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003erefactor(web): Convert some components to the dialog / popover controller pattern by \u003ca href=\"https://github.com/bezbac\"\u003e\u003ccode\u003e@​bezbac\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/15893\"\u003elangfuse/langfuse#15893\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eci(assistant): publish sandbox MicroVM image to the preview account by \u003ca href=\"https://github.com/LysanderKie\"\u003e\u003ccode\u003e@​LysanderKie\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16386\"\u003elangfuse/langfuse#16386\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(assistant): remove beta label by \u003ca href=\"https://github.com/nimarb\"\u003e\u003ccode\u003e@​nimarb\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16388\"\u003elangfuse/langfuse#16388\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(pricing): add flex and fast prices by \u003ca href=\"https://github.com/langfuse-bot\"\u003e\u003ccode\u003e@​langfuse-bot\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16335\"\u003elangfuse/langfuse#16335\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003erefactor(web): Clean up \u003ccode\u003eLocalIsoDate\u003c/code\u003e by \u003ca href=\"https://github.com/bezbac\"\u003e\u003ccode\u003e@​bezbac\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16400\"\u003elangfuse/langfuse#16400\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003erefactor(web): Extract \u003ccode\u003eSearchInput\u003c/code\u003e component with dropdown by \u003ca href=\"https://github.com/bezbac\"\u003e\u003ccode\u003e@​bezbac\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16406\"\u003elangfuse/langfuse#16406\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore: disable prod-jp from cloud deployments by \u003ca href=\"https://github.com/hassiebp\"\u003e\u003ccode\u003e@​hassiebp\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16415\"\u003elangfuse/langfuse#16415\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003erefactor(web): Lint \u0026amp; merge duplicate imports by \u003ca href=\"https://github.com/bezbac\"\u003e\u003ccode\u003e@​bezbac\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16413\"\u003elangfuse/langfuse#16413\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore: Add design system code owner by \u003ca href=\"https://github.com/bezbac\"\u003e\u003ccode\u003e@​bezbac\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16420\"\u003elangfuse/langfuse#16420\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(assistant): medium thinking with opus by \u003ca href=\"https://github.com/nimarb\"\u003e\u003ccode\u003e@​nimarb\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16421\"\u003elangfuse/langfuse#16421\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003edocs(seeder): show \u003ccode\u003esupportsV4\u003c/code\u003e marker in \u003ccode\u003elist\u003c/code\u003e subcommand text output by \u003ca href=\"https://github.com/Harsh23Kashyap\"\u003e\u003ccode\u003e@​Harsh23Kashyap\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16430\"\u003elangfuse/langfuse#16430\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langfuse/langfuse/commit/7b481ce546645cf96aea27b27cd34c187e7e4fe7\"\u003e\u003ccode\u003e7b481ce\u003c/code\u003e\u003c/a\u003e chore: release v4.17.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langfuse/langfuse/commit/014a2d9ff132ed3b7bdb8a28cf4da4df2b34b6c0\"\u003e\u003ccode\u003e014a2d9\u003c/code\u003e\u003c/a\u003e feat(in-app-agent): Add Anthropic Messages as a supported model provider for ...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langfuse/langfuse/commit/7d62bce084f2a7a3f5a7521cd4f1a3bdcbc4ec3d\"\u003e\u003ccode\u003e7d62bce\u003c/code\u003e\u003c/a\u003e feat(evals): show and filter evaluator models (\u003ca href=\"https://redirect.github.com/langfuse/langfuse/issues/16466\"\u003e#16466\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langfuse/langfuse/commit/9f6c433ccbf4cd72fcc797bac8762515def24bd9\"\u003e\u003ccode\u003e9f6c433\u003c/code\u003e\u003c/a\u003e fix(mcp): Use matches observation filters (\u003ca href=\"https://redirect.github.com/langfuse/langfuse/issues/16410\"\u003e#16410\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langfuse/langfuse/commit/81b1e751ae1930461a430224f77adc3bee6b2985\"\u003e\u003ccode\u003e81b1e75\u003c/code\u003e\u003c/a\u003e fix(evals): activate disabled rules on evaluator attach (\u003ca href=\"https://redirect.github.com/langfuse/langfuse/issues/16465\"\u003e#16465\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langfuse/langfuse/commit/37582971f037df670f3ab29a9be27ddad9a2ae60\"\u003e\u003ccode\u003e3758297\u003c/code\u003e\u003c/a\u003e test: stabilize evaluator and SSRF integration coverage (\u003ca href=\"https://redirect.github.com/langfuse/langfuse/issues/16468\"\u003e#16468\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langfuse/langfuse/commit/cb823daddc00ad9630009cdac88b6e8d7ce1b4b0\"\u003e\u003ccode\u003ecb823da\u003c/code\u003e\u003c/a\u003e fix(evals): stop validating rule mappings when updating an evaluator (\u003ca href=\"https://redirect.github.com/langfuse/langfuse/issues/16460\"\u003e#16460\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langfuse/langfuse/commit/e9b6cbfe3297658ca4511f881d9c5a0b9a48335b\"\u003e\u003ccode\u003ee9b6cbf\u003c/code\u003e\u003c/a\u003e feat(onboarding): Ask to enable AI features during onboarding (\u003ca href=\"https://redirect.github.com/langfuse/langfuse/issues/16389\"\u003e#16389\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langfuse/langfuse/commit/8f5fff8d3da6618f24ff79e32d585a6341c09bd3\"\u003e\u003ccode\u003e8f5fff8\u003c/code\u003e\u003c/a\u003e fix: sidestep 500 on NextAuth HTML routes when callback URL is invalid  (\u003ca href=\"https://redirect.github.com/langfuse/langfuse/issues/16461\"\u003e#16461\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langfuse/langfuse/commit/ce7c979ba8f629c9c03ec41d62bd3a0d6c224d5e\"\u003e\u003ccode\u003ece7c979\u003c/code\u003e\u003c/a\u003e feat(in-app-agent): cache stable Bedrock prefixes across turns (\u003ca href=\"https://redirect.github.com/langfuse/langfuse/issues/16459\"\u003e#16459\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/langfuse/langfuse/compare/v4.12.0...v4.17.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `packaging` from 26.2 to 26.3\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pypa/packaging/releases\"\u003epackaging's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e26.3\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003ch3\u003eFeatures\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAdd a public \u003ccode\u003eVersionRange\u003c/code\u003e API and \u003ccode\u003eSpecifierSet.to_range()\u003c/code\u003e, representing the versions a specifier set accepts as an interval set that supports intersection, union, difference, complement, set relations, membership tests, and filtering. \u003ccode\u003eVersionRange.to_specifier_set()\u003c/code\u003e converts a range back to a \u003ccode\u003eSpecifierSet\u003c/code\u003e where a PEP 440 form exists. (\u003ca href=\"https://redirect.github.com/pypa/packaging/pull/1267\"\u003e#1267\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/pypa/packaging/pull/1270\"\u003e#1270\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/pypa/packaging/pull/1298\"\u003e#1298\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ePEP 808: accept \u003ccode\u003eMetadata-Version: 2.6\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/pypa/packaging/pull/1194\"\u003e#1194\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd a \u003ccode\u003elimit\u003c/code\u003e argument to \u003ccode\u003eparse_tag()\u003c/code\u003e for compressed tag sets. (\u003ca href=\"https://redirect.github.com/pypa/packaging/issues/1220\"\u003e#1220\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd a \u003ccode\u003eprefer_sdist_predicate\u003c/code\u003e argument to \u003ccode\u003ePylock.select()\u003c/code\u003e to prefer source distributions over wheels for selected packages. (\u003ca href=\"https://redirect.github.com/pypa/packaging/pull/1334\"\u003e#1334\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003epure_python_tags()\u003c/code\u003e to generate the pure-Python tags for a Python version without touching the running platform. (\u003ca href=\"https://redirect.github.com/pypa/packaging/pull/1346\"\u003e#1346\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eSpecifierSet.is_subset()\u003c/code\u003e, \u003ccode\u003eSpecifierSet.is_superset()\u003c/code\u003e, and \u003ccode\u003eSpecifierSet.is_disjoint()\u003c/code\u003e, which compare the versions two specifier sets accept. (\u003ca href=\"https://redirect.github.com/pypa/packaging/pull/1313\"\u003e#1313\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eBehavior adaptations\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eDrop support for Python 3.8; packaging now requires Python 3.9 or later. (\u003ca href=\"https://redirect.github.com/pypa/packaging/pull/1157\"\u003e#1157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ePrefer native \u003ccode\u003elinux_*\u003c/code\u003e platform tags over \u003ccode\u003emanylinux\u003c/code\u003e and \u003ccode\u003emusllinux\u003c/code\u003e tags on Linux. (\u003ca href=\"https://redirect.github.com/pypa/packaging/issues/160\"\u003e#160\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eFixes for versions and specifiers\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eRaise \u003ccode\u003eInvalidVersion\u003c/code\u003e instead of \u003ccode\u003eTypeError\u003c/code\u003e when \u003ccode\u003eVersion\u003c/code\u003e is given a non-string. (\u003ca href=\"https://redirect.github.com/pypa/packaging/pull/1319\"\u003e#1319\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eRaise \u003ccode\u003eInvalidVersion\u003c/code\u003e for non-string pre-release letters passed to \u003ccode\u003eVersion.from_parts\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/pypa/packaging/pull/1241\"\u003e#1241\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix an \u003ccode\u003eAttributeError\u003c/code\u003e when hashing internally trimmed versions. (\u003ca href=\"https://redirect.github.com/pypa/packaging/pull/1242\"\u003e#1242\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix \u003ccode\u003eSpecifierSet.is_unsatisfiable\u003c/code\u003e for post-release boundary intersections. (\u003ca href=\"https://redirect.github.com/pypa/packaging/pull/1257\"\u003e#1257\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eFixes for requirements and markers\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eMake \u003ccode\u003eRequirement.__hash__\u003c/code\u003e consistent with \u003ccode\u003e__eq__\u003c/code\u003e for trailing-zero-equivalent specifiers (e.g. \u003ccode\u003efoo==1.0.0\u003c/code\u003e and \u003ccode\u003efoo==1.0.0.0\u003c/code\u003e), so equal requirements hash equal and deduplicate in sets and dicts. (\u003ca href=\"https://redirect.github.com/pypa/packaging/pull/1232\"\u003e#1232\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eNormalize requested extra names before comparing or hashing requirements. (\u003ca href=\"https://redirect.github.com/pypa/packaging/issues/644\"\u003e#644\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ePreserve a \u003ccode\u003eRequirement\u003c/cod...\n\n_Description has been truncated_","html_url":"https://github.com/Mubder/kazma/pull/122","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/Mubder%2Fkazma/issues/122","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/122/packages"},{"uuid":"5882671784","node_id":"PR_kwDOSWKloM8AAAABI0to5A","number":125,"state":"open","title":"chore(deps): bump the pip-minor-patch group across 1 directory with 23 updates","user":"dependabot[bot]","labels":[],"assignees":[],"locked":false,"comments_count":3,"pull_request":true,"closed_at":null,"author_association":null,"state_reason":null,"created_at":"2026-10-16T10:36:48.000Z","updated_at":"2026-10-16T10:38:00.000Z","time_to_close":null,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"chore(deps): bump","group_name":"pip-minor-patch","update_count":23,"packages":[{"name":"ruff","old_version":"0.16.4","new_version":"0.17.0","repository_url":"https://github.com/astral-sh/ruff"},{"name":"ast-serialize","old_version":"0.11.2","new_version":"0.13.0","repository_url":"https://github.com/mypyc/ast_serialize"},{"name":"cachetools","old_version":"7.2.0","new_version":"7.2.1","repository_url":"https://github.com/tkem/cachetools"},{"name":"coverage","old_version":"7.16.1","new_version":"7.16.2","repository_url":"https://github.com/coveragepy/coveragepy"},{"name":"fonttools","old_version":"4.64.0","new_version":"4.65.0","repository_url":"https://github.com/fonttools/fonttools"},{"name":"hypothesis","old_version":"6.168.0","new_version":"6.168.5","repository_url":"https://github.com/HypothesisWorks/hypothesis"},{"name":"identify","old_version":"2.6.19","new_version":"2.6.20","repository_url":"https://github.com/pre-commit/identify"},{"name":"iniconfig","old_version":"2.3.0","new_version":"2.3.1","repository_url":"https://github.com/pytest-dev/iniconfig"},{"name":"librt","old_version":"0.15.0","new_version":"0.16.0","repository_url":"https://github.com/mypyc/librt"},{"name":"matplotlib","old_version":"3.10.0","new_version":"3.10.9","repository_url":"https://github.com/matplotlib/matplotlib"},{"name":"mypy","old_version":"2.3.1","new_version":"2.4.0","repository_url":"https://github.com/python/mypy"},{"name":"nodeenv","old_version":"1.10.0","new_version":"1.11.0","repository_url":"https://github.com/ekalinin/nodeenv"},{"name":"numpy","old_version":"2.1.3","new_version":"2.2.6","repository_url":"https://github.com/numpy/numpy"},{"name":"platformdirs","old_version":"4.11.7","new_version":"4.12.4","repository_url":"https://github.com/tox-dev/platformdirs"},{"name":"pyparsing","old_version":"3.3.2","new_version":"3.3.3","repository_url":"https://github.com/pyparsing/pyparsing"},{"name":"pyproject-api","old_version":"1.11.2","new_version":"1.11.4","repository_url":"https://github.com/tox-dev/pyproject-api"},{"name":"python-discovery","old_version":"1.6.1","new_version":"1.6.2","repository_url":"https://github.com/tox-dev/python-discovery"},{"name":"scikit-learn","old_version":"1.6.1","new_version":"1.7.2","repository_url":"https://github.com/scikit-learn/scikit-learn"},{"name":"threadpoolctl","old_version":"3.6.0","new_version":"3.7.0","repository_url":"https://github.com/joblib/threadpoolctl"},{"name":"tomli","old_version":"2.4.1","new_version":"2.5.0","repository_url":"https://github.com/hukkin/tomli"},{"name":"tox","old_version":"4.63.0","new_version":"4.65.0","repository_url":"https://github.com/tox-dev/tox"},{"name":"tzdata","old_version":"2026.3","new_version":"2026.5","repository_url":"https://github.com/python/tzdata"},{"name":"virtualenv","old_version":"21.9.1","new_version":"21.14.7","repository_url":"https://github.com/pypa/virtualenv"}],"path":null,"ecosystem":"pip"},"body":"Bumps the pip-minor-patch group with 23 updates in the / directory:\n\n| Package | From | To |\n| --- | --- | --- |\n| [ruff](https://github.com/astral-sh/ruff) | `0.16.4` | `0.17.0` |\n| [ast-serialize](https://github.com/mypyc/ast_serialize) | `0.11.2` | `0.13.0` |\n| [cachetools](https://github.com/tkem/cachetools) | `7.2.0` | `7.2.1` |\n| [coverage](https://github.com/coveragepy/coveragepy) | `7.16.1` | `7.16.2` |\n| [fonttools](https://github.com/fonttools/fonttools) | `4.64.0` | `4.65.0` |\n| [hypothesis](https://github.com/HypothesisWorks/hypothesis) | `6.168.0` | `6.168.5` |\n| [identify](https://github.com/pre-commit/identify) | `2.6.19` | `2.6.20` |\n| [iniconfig](https://github.com/pytest-dev/iniconfig) | `2.3.0` | `2.3.1` |\n| [librt](https://github.com/mypyc/librt) | `0.15.0` | `0.16.0` |\n| [matplotlib](https://github.com/matplotlib/matplotlib) | `3.10.0` | `3.10.9` |\n| [mypy](https://github.com/python/mypy) | `2.3.1` | `2.4.0` |\n| [nodeenv](https://github.com/ekalinin/nodeenv) | `1.10.0` | `1.11.0` |\n| [numpy](https://github.com/numpy/numpy) | `2.1.3` | `2.2.6` |\n| [platformdirs](https://github.com/tox-dev/platformdirs) | `4.11.7` | `4.12.4` |\n| [pyparsing](https://github.com/pyparsing/pyparsing) | `3.3.2` | `3.3.3` |\n| [pyproject-api](https://github.com/tox-dev/pyproject-api) | `1.11.2` | `1.11.4` |\n| [python-discovery](https://github.com/tox-dev/python-discovery) | `1.6.1` | `1.6.2` |\n| [scikit-learn](https://github.com/scikit-learn/scikit-learn) | `1.6.1` | `1.7.2` |\n| [threadpoolctl](https://github.com/joblib/threadpoolctl) | `3.6.0` | `3.7.0` |\n| [tomli](https://github.com/hukkin/tomli) | `2.4.1` | `2.5.0` |\n| [tox](https://github.com/tox-dev/tox) | `4.63.0` | `4.65.0` |\n| [tzdata](https://github.com/python/tzdata) | `2026.3` | `2026.5` |\n| [virtualenv](https://github.com/pypa/virtualenv) | `21.9.1` | `21.14.7` |\n\n\nUpdates `ruff` from 0.16.4 to 0.17.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/astral-sh/ruff/releases\"\u003eruff's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e0.17.0\u003c/h2\u003e\n\u003ch2\u003eRelease Notes\u003c/h2\u003e\n\u003cp\u003eReleased on 2026-10-09.\u003c/p\u003e\n\u003cp\u003eThe executables in our macOS and Windows release archives and \u003ccode\u003eruff\u003c/code\u003e wheels are now code-signed. macOS executables are signed with an Apple Developer ID certificate and notarized by Apple. Windows executables have timestamped Authenticode signatures from Azure Artifact Signing. This enables verification of the release publisher and binary integrity, supports publisher-based allowlisting, and should reduce security warnings and antivirus false positives.\u003c/p\u003e\n\u003ch3\u003eBreaking changes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate the default and latest Python versions for 3.15 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28792\"\u003e#28792\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eRuff now defaults to Python 3.11 instead of 3.10 when no Python version is configured through \u003ca href=\"https://docs.astral.sh/ruff/settings/#target-version\"\u003e\u003ccode\u003etarget-version\u003c/code\u003e\u003c/a\u003e or \u003ca href=\"https://docs.astral.sh/ruff/configuration/#inferring-the-python-version\"\u003e\u003ccode\u003erequires-python\u003c/code\u003e\u003c/a\u003e. When checking for syntax errors without a configured Python version, Ruff now defaults to Python 3.15 instead of 3.14.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate the default rule set (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28786\"\u003e#28786\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eSeveral of the \u003ccode\u003eflake8-datetimez\u003c/code\u003e rules (\u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-without-tzinfo/\"\u003e\u003ccode\u003eDTZ001\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-now-without-tzinfo/\"\u003e\u003ccode\u003eDTZ005\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-fromtimestamp/\"\u003e\u003ccode\u003eDTZ006\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-strptime-without-zone/\"\u003e\u003ccode\u003eDTZ007\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://docs.astral.sh/ruff/rules/call-date-today/\"\u003e\u003ccode\u003eDTZ011\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://docs.astral.sh/ruff/rules/call-date-fromtimestamp/\"\u003e\u003ccode\u003eDTZ012\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://docs.astral.sh/ruff/rules/datetime-min-max/\"\u003e\u003ccode\u003eDTZ901\u003c/code\u003e\u003c/a\u003e) are no longer enabled by default, while \u003ca href=\"https://docs.astral.sh/ruff/rules/undefined-local-with-nested-import-star-usage/\"\u003e\u003ccode\u003eundefined-local-with-nested-import-star-usage\u003c/code\u003e\u003c/a\u003e (\u003ccode\u003eF406\u003c/code\u003e), which corresponds to a syntax error, is now enabled by default.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate Rust crate quick-junit to 0.8.0 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/27295\"\u003e#27295\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eJUnit output now uses a \u003ccode\u003eskipped\u003c/code\u003e attribute instead of \u003ccode\u003edisabled\u003c/code\u003e on \u003ccode\u003e\u0026lt;testsuite\u0026gt;\u003c/code\u003e elements and includes a \u003ccode\u003eskipped\u003c/code\u003e attribute on the root \u003ccode\u003e\u0026lt;testsuites\u0026gt;\u003c/code\u003e element.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e[\u003ccode\u003eflake8-import-conventions\u003c/code\u003e] Add \u003ccode\u003edatetime as dt\u003c/code\u003e as a conventional alias (\u003ccode\u003eICN001\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28790\"\u003e#28790\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSupport Unicode dummy variable names (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28722\"\u003e#28722\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eThe default \u003ca href=\"https://docs.astral.sh/ruff/settings/#lint_dummy-variable-rgx\"\u003e\u003ccode\u003elint.dummy-variable-rgx\u003c/code\u003e\u003c/a\u003e now recognizes underscore-prefixed Unicode names, such as \u003ccode\u003e_次\u003c/code\u003e, as dummy variables.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate to Unicode 17 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/21229\"\u003e#21229\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28784\"\u003e#28784\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eRuff now uses Unicode 17 data for identifier normalization and named character escapes (\u003ccode\u003e\u0026quot;\\N{...}\u0026quot;\u003c/code\u003e).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAlways show unsafe and display-only fixes in the CLI (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/27810\"\u003e#27810\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eThe default \u003ccode\u003efull\u003c/code\u003e output format now shows unsafe fixes and suggestions requiring manual review, regardless of the \u003ca href=\"https://docs.astral.sh/ruff/settings/#unsafe-fixes\"\u003e\u003ccode\u003eunsafe-fixes\u003c/code\u003e\u003c/a\u003e setting. Actually applying unsafe fixes still requires explicit opt-in.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRemove the Python dependency from conda-forge builds (\u003ca href=\"https://redirect.github.com/conda-forge/ruff-feedstock/pull/361\"\u003econda-forge/ruff-feedstock#361\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eThe conda-forge build no longer depends on Python, now supports linux-riscv64, win-arm64, and linux-ppc64le platforms, and now includes shell completions. However, no longer depending on Python means that \u003ccode\u003epython -m ruff\u003c/code\u003e and \u003ccode\u003eimport ruff\u003c/code\u003e will no longer work. Use \u003ccode\u003eruff\u003c/code\u003e directly from \u003ccode\u003ePATH\u003c/code\u003e instead. PyPI installations and those from the standalone installer are unaffected.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRemove support for ruff-lsp (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28750\"\u003e#28750\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eSupport for \u003ccode\u003eruff-lsp\u003c/code\u003e, the legacy Python language server \u003ca href=\"https://github.com/astral-sh/ruff/releases/tag/0.9.5\"\u003edeprecated in Ruff v0.9.5\u003c/a\u003e, has been removed. The Ruff VS Code extension now always uses the native language server; \u003ccode\u003eruff.nativeServer\u003c/code\u003e is deprecated and ignored. See the \u003ca href=\"https://docs.astral.sh/ruff/editors/migration/\"\u003emigration guide\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eStabilization\u003c/h3\u003e\n\u003cp\u003eThe following rules have been stabilized and are no longer in preview:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://docs.astral.sh/ruff/rules/lazy-import-mismatch\"\u003e\u003ccode\u003elazy-import-mismatch\u003c/code\u003e\u003c/a\u003e (\u003ccode\u003eTID254\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://docs.astral.sh/ruff/rules/lazy-import-immediately-resolved\"\u003e\u003ccode\u003elazy-import-immediately-resolved\u003c/code\u003e\u003c/a\u003e (\u003ccode\u003eTID255\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://docs.astral.sh/ruff/rules/os-path-commonprefix\"\u003e\u003ccode\u003eos-path-commonprefix\u003c/code\u003e\u003c/a\u003e (\u003ccode\u003eRUF071\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md\"\u003eruff's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e0.17.0\u003c/h2\u003e\n\u003cp\u003eReleased on 2026-10-09.\u003c/p\u003e\n\u003cp\u003eThe executables in our macOS and Windows release archives and \u003ccode\u003eruff\u003c/code\u003e wheels are now code-signed.\nmacOS executables are signed with an Apple Developer ID certificate and notarized by Apple. Windows\nexecutables have timestamped Authenticode signatures from Azure Artifact Signing. This enables\nverification of the release publisher and binary integrity, supports publisher-based allowlisting,\nand should reduce security warnings and antivirus false positives.\u003c/p\u003e\n\u003ch3\u003eBreaking changes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate the default and latest Python versions for 3.15 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28792\"\u003e#28792\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eRuff now defaults to Python 3.11 instead of 3.10 when no Python version is configured through\n\u003ca href=\"https://docs.astral.sh/ruff/settings/#target-version\"\u003e\u003ccode\u003etarget-version\u003c/code\u003e\u003c/a\u003e or\n\u003ca href=\"https://docs.astral.sh/ruff/configuration/#inferring-the-python-version\"\u003e\u003ccode\u003erequires-python\u003c/code\u003e\u003c/a\u003e. When\nchecking for syntax errors without a configured Python version, Ruff now defaults to Python 3.15\ninstead of 3.14.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate the default rule set (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28786\"\u003e#28786\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eSeveral of the \u003ccode\u003eflake8-datetimez\u003c/code\u003e rules\n(\u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-without-tzinfo/\"\u003e\u003ccode\u003eDTZ001\u003c/code\u003e\u003c/a\u003e,\n\u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-now-without-tzinfo/\"\u003e\u003ccode\u003eDTZ005\u003c/code\u003e\u003c/a\u003e,\n\u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-fromtimestamp/\"\u003e\u003ccode\u003eDTZ006\u003c/code\u003e\u003c/a\u003e,\n\u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-strptime-without-zone/\"\u003e\u003ccode\u003eDTZ007\u003c/code\u003e\u003c/a\u003e,\n\u003ca href=\"https://docs.astral.sh/ruff/rules/call-date-today/\"\u003e\u003ccode\u003eDTZ011\u003c/code\u003e\u003c/a\u003e,\n\u003ca href=\"https://docs.astral.sh/ruff/rules/call-date-fromtimestamp/\"\u003e\u003ccode\u003eDTZ012\u003c/code\u003e\u003c/a\u003e, and\n\u003ca href=\"https://docs.astral.sh/ruff/rules/datetime-min-max/\"\u003e\u003ccode\u003eDTZ901\u003c/code\u003e\u003c/a\u003e) are no longer enabled by default,\nwhile \u003ca href=\"https://docs.astral.sh/ruff/rules/undefined-local-with-nested-import-star-usage/\"\u003e\u003ccode\u003eundefined-local-with-nested-import-star-usage\u003c/code\u003e\u003c/a\u003e\n(\u003ccode\u003eF406\u003c/code\u003e), which corresponds to a syntax error, is now enabled by default.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate Rust crate quick-junit to 0.8.0 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/27295\"\u003e#27295\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eJUnit output now uses a \u003ccode\u003eskipped\u003c/code\u003e attribute instead of \u003ccode\u003edisabled\u003c/code\u003e on \u003ccode\u003e\u0026lt;testsuite\u0026gt;\u003c/code\u003e elements and\nincludes a \u003ccode\u003eskipped\u003c/code\u003e attribute on the root \u003ccode\u003e\u0026lt;testsuites\u0026gt;\u003c/code\u003e element.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e[\u003ccode\u003eflake8-import-conventions\u003c/code\u003e] Add \u003ccode\u003edatetime as dt\u003c/code\u003e as a conventional alias (\u003ccode\u003eICN001\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28790\"\u003e#28790\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSupport Unicode dummy variable names (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28722\"\u003e#28722\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eThe default \u003ca href=\"https://docs.astral.sh/ruff/settings/#lint_dummy-variable-rgx\"\u003e\u003ccode\u003elint.dummy-variable-rgx\u003c/code\u003e\u003c/a\u003e\nnow recognizes underscore-prefixed Unicode names, such as \u003ccode\u003e_次\u003c/code\u003e, as dummy variables.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate to Unicode 17 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/21229\"\u003e#21229\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28784\"\u003e#28784\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eRuff now uses Unicode 17 data for identifier normalization and named character escapes (\u003ccode\u003e\u0026quot;\\N{...}\u0026quot;\u003c/code\u003e).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAlways show unsafe and display-only fixes in the CLI (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/27810\"\u003e#27810\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/5b27c1ccfaa230fb195855f5cf3404a21e3379cd\"\u003e\u003ccode\u003e5b27c1c\u003c/code\u003e\u003c/a\u003e Bump version to 0.17.0 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/29259\"\u003e#29259\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/8f362bf4cb5dbad095ac416602496705d41fc843\"\u003e\u003ccode\u003e8f362bf\u003c/code\u003e\u003c/a\u003e Integrate vendored Unicode names into Ruff\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/88a50d695c1142294bb4c780fad47d3306173885\"\u003e\u003ccode\u003e88a50d6\u003c/code\u003e\u003c/a\u003e Revert upstream Unicode loose matching\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/276832aa91f2086a6ec880884fcdd987991cddf2\"\u003e\u003ccode\u003e276832a\u003c/code\u003e\u003c/a\u003e Revert upstream Unicode alias normalization\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/26911caa2800758779965510d2f222b438abbb38\"\u003e\u003ccode\u003e26911ca\u003c/code\u003e\u003c/a\u003e Vendor unicode_names2 from upstream\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/27e3797508d1a7ad69e4900d51e38d78785aaf73\"\u003e\u003ccode\u003e27e3797\u003c/code\u003e\u003c/a\u003e [\u003ccode\u003eruff\u003c/code\u003e] Stabilize \u003ccode\u003eos-path-commonprefix\u003c/code\u003e (\u003ccode\u003eRUF071\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/28764\"\u003e#28764\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/bbb52c1267cf39aba67e54c2b5800878d23073a9\"\u003e\u003ccode\u003ebbb52c1\u003c/code\u003e\u003c/a\u003e [\u003ccode\u003eflake8-tidy-imports\u003c/code\u003e] Stabilize \u003ccode\u003elazy-import-immediately-resolved\u003c/code\u003e (`TID255...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/5aa9cbd3a49d32b24ac21fa7797ca87a330792a2\"\u003e\u003ccode\u003e5aa9cbd\u003c/code\u003e\u003c/a\u003e [\u003ccode\u003eflake8-tidy-imports\u003c/code\u003e] Stabilize \u003ccode\u003elazy-import-mismatch\u003c/code\u003e (\u003ccode\u003eTID254\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/28760\"\u003e#28760\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/dba1bc893aedfeea2064c4e8e764135f0d44dc3f\"\u003e\u003ccode\u003edba1bc8\u003c/code\u003e\u003c/a\u003e [\u003ccode\u003eflake8-import-conventions\u003c/code\u003e] Add \u003ccode\u003edatetime as dt\u003c/code\u003e as a conventional alias (`...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/ef23c9c39eb3029bab0139c3ea7ae6d95c4131e0\"\u003e\u003ccode\u003eef23c9c\u003c/code\u003e\u003c/a\u003e Update default and latest Python versions for 3.15 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/28792\"\u003e#28792\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/astral-sh/ruff/compare/0.16.4...0.17.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `ast-serialize` from 0.11.2 to 0.13.0\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mypyc/ast_serialize/commit/42628bd687c583025775f4c404235f73d43ca875\"\u003e\u003ccode\u003e42628bd\u003c/code\u003e\u003c/a\u003e Bump version to 0.13.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mypyc/ast_serialize/commit/67659a0bd5f46d6a91e4db907b06a71fdb659e76\"\u003e\u003ccode\u003e67659a0\u003c/code\u003e\u003c/a\u003e Straighten type comment parsing (\u003ca href=\"https://redirect.github.com/mypyc/ast_serialize/issues/95\"\u003e#95\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mypyc/ast_serialize/commit/8d0a5c6d1c87e29aa37c7292149086b514ccac93\"\u003e\u003ccode\u003e8d0a5c6\u003c/code\u003e\u003c/a\u003e Bump version to 0.12.1\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mypyc/ast_serialize/commit/a7f11b17731c0c3b9afc683e977e3faf90ba6c19\"\u003e\u003ccode\u003ea7f11b1\u003c/code\u003e\u003c/a\u003e Fix parsing plain None type in a string (\u003ca href=\"https://redirect.github.com/mypyc/ast_serialize/issues/96\"\u003e#96\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mypyc/ast_serialize/commit/bcf707f0d2c59a8033d2d8734849b2233f36f70d\"\u003e\u003ccode\u003ebcf707f\u003c/code\u003e\u003c/a\u003e Bump version to 0.12.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mypyc/ast_serialize/commit/89b6e832250fbc4d80739b318237f9571d6c32cc\"\u003e\u003ccode\u003e89b6e83\u003c/code\u003e\u003c/a\u003e Allow colon in error codes (\u003ca href=\"https://redirect.github.com/mypyc/ast_serialize/issues/94\"\u003e#94\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/mypyc/ast_serialize/compare/v0.11.2...v0.13.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `cachetools` from 7.2.0 to 7.2.1\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tkem/cachetools/blob/master/CHANGELOG.rst\"\u003ecachetools's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003ev7.2.1 (2026-10-05)\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eImprove error handling for \u003ccode\u003eRRCache.popitem()\u003c/code\u003e when the cache is\nempty.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMinor style and documentation improvements.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate CI environment.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tkem/cachetools/commit/9976f1a8076631560f49c5b0dfda7e4d00ee0a4a\"\u003e\u003ccode\u003e9976f1a\u003c/code\u003e\u003c/a\u003e Release v7.2.1.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tkem/cachetools/commit/ffe21c44d3f7de9c7a89870c8cf1fd7aa583a2ae\"\u003e\u003ccode\u003effe21c4\u003c/code\u003e\u003c/a\u003e Fix \u003ca href=\"https://redirect.github.com/tkem/cachetools/issues/430\"\u003e#430\u003c/a\u003e: Honor falsey getsizeof callables (\u003ca href=\"https://redirect.github.com/tkem/cachetools/issues/431\"\u003e#431\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tkem/cachetools/commit/110fe5d03e7b4b8f5c5ec97533c94254cdf8733f\"\u003e\u003ccode\u003e110fe5d\u003c/code\u003e\u003c/a\u003e Bump codecov/codecov-action\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tkem/cachetools/commit/11153c947675edae9da06a5295bfa4a54b8a4f53\"\u003e\u003ccode\u003e11153c9\u003c/code\u003e\u003c/a\u003e Prefer pyright file-level comments over relaxing rules globally.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tkem/cachetools/commit/bcf9e8176ebe16da58751fce971c98ffe045ede1\"\u003e\u003ccode\u003ebcf9e81\u003c/code\u003e\u003c/a\u003e Fix \u003ca href=\"https://redirect.github.com/tkem/cachetools/issues/423\"\u003e#423\u003c/a\u003e: Detect an empty RRCache before calling choice.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tkem/cachetools/commit/eadb91cc9d54a57d6738386bc5c575ff3c7d22ec\"\u003e\u003ccode\u003eeadb91c\u003c/code\u003e\u003c/a\u003e docs: clarify that unbounded TTL caches still expire entries\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/tkem/cachetools/compare/v7.2.0...v7.2.1\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `coverage` from 7.16.1 to 7.16.2\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/coveragepy/coveragepy/releases\"\u003ecoverage's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e7.16.2\u003c/h2\u003e\n\u003ch2\u003eVersion 7.16.2 — 2026-09-27\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eFix: on Python 3.14 and later, a \u003ccode\u003efor\u003c/code\u003e loop completing immediately before a function return could mistakenly report an uncovered branch. This is now fixed, closing \u003ca href=\"https://redirect.github.com/coveragepy/coveragepy/issues/2168\"\u003eissue 2168\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003eFix: on Python 3.14 and later, the \u003ccode\u003eelse\u003c/code\u003e clause of a \u003ccode\u003etry\u003c/code\u003e whose body is a \u003ccode\u003ewith\u003c/code\u003e statement could incorrectly be reported as covered when the \u003ccode\u003ewith\u003c/code\u003e raised. This is now fixed, closing \u003ca href=\"https://redirect.github.com/coveragepy/coveragepy/issues/2289\"\u003eissue 2289\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003eFix: with \u003ccode\u003edynamic_context = test_function\u003c/code\u003e, test methods written as \u003ccode\u003e@staticmethod\u003c/code\u003e or \u003ccode\u003e@classmethod\u003c/code\u003e were not given a context of their own. Now they are, on Python 3.11 and later. Closes \u003ca href=\"https://redirect.github.com/coveragepy/coveragepy/issues/1923\"\u003eissue 1923\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e:arrow_right:  PyPI page: \u003ca href=\"https://pypi.org/project/coverage/7.16.2\"\u003ecoverage 7.16.2\u003c/a\u003e.\n:arrow_right:  To install: \u003ccode\u003epython3 -m pip install coverage==7.16.2\u003c/code\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/coveragepy/coveragepy/blob/main/CHANGES.rst\"\u003ecoverage's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003eVersion 7.16.2 — 2026-09-27\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eFix: on Python 3.14 and later, a \u003ccode\u003efor\u003c/code\u003e loop completing immediately before a\nfunction return could mistakenly report an uncovered branch. This is now\nfixed, closing \u003ccode\u003eissue 2168\u003c/code\u003e_.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFix: on Python 3.14 and later, the \u003ccode\u003eelse\u003c/code\u003e clause of a \u003ccode\u003etry\u003c/code\u003e whose body is\na \u003ccode\u003ewith\u003c/code\u003e statement could incorrectly be reported as covered when the\n\u003ccode\u003ewith\u003c/code\u003e raised.  This is now fixed, closing \u003ccode\u003eissue 2289\u003c/code\u003e_.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFix: with \u003ccode\u003edynamic_context = test_function\u003c/code\u003e, test methods written as\n\u003ccode\u003e@staticmethod\u003c/code\u003e or \u003ccode\u003e@classmethod\u003c/code\u003e were not given a context of their own.\nNow they are, on Python 3.11 and later.  Closes \u003ccode\u003eissue 1923\u003c/code\u003e_.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e.. _issue 1923: \u003ca href=\"https://redirect.github.com/coveragepy/coveragepy/issues/1923\"\u003ecoveragepy/coveragepy#1923\u003c/a\u003e\n.. _issue 2168: \u003ca href=\"https://redirect.github.com/coveragepy/coveragepy/issues/2168\"\u003ecoveragepy/coveragepy#2168\u003c/a\u003e\n.. _issue 2289: \u003ca href=\"https://redirect.github.com/coveragepy/coveragepy/issues/2289\"\u003ecoveragepy/coveragepy#2289\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e.. _changes_7-16-1:\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/coveragepy/coveragepy/commit/5643ae7c682bbd56ee1ac2b11556145ab8c2cab0\"\u003e\u003ccode\u003e5643ae7\u003c/code\u003e\u003c/a\u003e docs: prep for 7.16.2\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/coveragepy/coveragepy/commit/a3e969fc6ce8273538702a2336d8c2674f8017d8\"\u003e\u003ccode\u003ea3e969f\u003c/code\u003e\u003c/a\u003e fix: dynamic_context for \u003ca href=\"https://github.com/staticmethod\"\u003e\u003ccode\u003e@​staticmethod\u003c/code\u003e\u003c/a\u003e and \u003ca href=\"https://github.com/classmethod\"\u003e\u003ccode\u003e@​classmethod\u003c/code\u003e\u003c/a\u003e tests (issue 1923) (#...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/coveragepy/coveragepy/commit/8ad72362f03e59643865d15ffadd002529a777a9\"\u003e\u003ccode\u003e8ad7236\u003c/code\u003e\u003c/a\u003e fix: stop counting the try/else line when a with statement raises (\u003ca href=\"https://redirect.github.com/coveragepy/coveragepy/issues/2301\"\u003e#2301\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/coveragepy/coveragepy/commit/c6dab1fc387d161fe5938ce9421a7a38ca81ae7f\"\u003e\u003ccode\u003ec6dab1f\u003c/code\u003e\u003c/a\u003e fix(debug): debug output doesn't mis-handle odd line separators \u003ca href=\"https://redirect.github.com/coveragepy/coveragepy/issues/2296\"\u003e#2296\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/coveragepy/coveragepy/commit/08fbc3229adc8e7681a0d9134d3d5beb1684ae54\"\u003e\u003ccode\u003e08fbc32\u003c/code\u003e\u003c/a\u003e style: Protocols should use \u003ccode\u003e...\u003c/code\u003e for method bodies\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/coveragepy/coveragepy/commit/bc7b0e386388148687241cadcab56ac3e17aea9c\"\u003e\u003ccode\u003ebc7b0e3\u003c/code\u003e\u003c/a\u003e refactor: positional-only args are better than pragmas\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/coveragepy/coveragepy/commit/52afd6be360c3b949d69ff83aca873c119a7959a\"\u003e\u003ccode\u003e52afd6b\u003c/code\u003e\u003c/a\u003e Document parallel tox coverage data files (\u003ca href=\"https://redirect.github.com/coveragepy/coveragepy/issues/2284\"\u003e#2284\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/coveragepy/coveragepy/commit/f653aaec4c58f89375716389e4ca17dd056d2069\"\u003e\u003ccode\u003ef653aae\u003c/code\u003e\u003c/a\u003e fix: loop completion arcs on Python 3.14 (\u003ca href=\"https://redirect.github.com/coveragepy/coveragepy/issues/2281\"\u003e#2281\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/coveragepy/coveragepy/commit/cc1ced4d4c8ef7674a824002aa5157d1f37acd78\"\u003e\u003ccode\u003ecc1ced4\u003c/code\u003e\u003c/a\u003e test: PyPy still compiles comprehensions as functions\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/coveragepy/coveragepy/commit/85a9088395e89840cb11c1c86735ba1f7a62d50d\"\u003e\u003ccode\u003e85a9088\u003c/code\u003e\u003c/a\u003e chore: make upgrade\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/coveragepy/coveragepy/compare/7.16.1...7.16.2\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `fonttools` from 4.64.0 to 4.65.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/fonttools/fonttools/releases\"\u003efonttools's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e4.65.0\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e[glyf] Add \u003ccode\u003e__iter__\u003c/code\u003e, \u003ccode\u003eitems\u003c/code\u003e and \u003ccode\u003evalues\u003c/code\u003e methods to the \u003ccode\u003eglyf\u003c/code\u003e table to make it more dict-like (\u003ca href=\"https://redirect.github.com/fonttools/fonttools/issues/4156\"\u003e#4156\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003e[feaLib] Escape the anonymous block tag when scanning for its terminator, so tags containing regex metacharacters are matched literally (\u003ca href=\"https://redirect.github.com/fonttools/fonttools/issues/4167\"\u003e#4167\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003e[varLib] Strip directory components from \u003ccode\u003e\u0026lt;variable-font name=\u0026quot;...\u0026quot;/\u0026gt;\u003c/code\u003e when deriving the output filename in the \u003ccode\u003evarLib\u003c/code\u003e command line, so a designspace cannot write outside the output directory (\u003ca href=\"https://redirect.github.com/fonttools/fonttools/issues/4168\"\u003e#4168\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003e[feaLib] Fix tracking of the current script and language across redundant \u003ccode\u003escript\u003c/code\u003e statements. Rules following a \u003ccode\u003escript\u003c/code\u003e statement that names the first declared language system no longer end up under the \u003ccode\u003eDFLT\u003c/code\u003e script, and a \u003ccode\u003escript\u003c/code\u003e statement naming the already-current script still narrows the language systems and terminates the current lookup while leaving the \u003ccode\u003elookupflag\u003c/code\u003e alone, matching makeotf (\u003ca href=\"https://redirect.github.com/fonttools/fonttools/issues/1824\"\u003e#1824\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/fonttools/fonttools/issues/2522\"\u003e#2522\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/fonttools/fonttools/issues/4169\"\u003e#4169\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003e[varLib.interpolatable] Escape glyph names in the HTML report (\u003ca href=\"https://redirect.github.com/fonttools/fonttools/issues/4172\"\u003e#4172\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003e[otlLib] Fix overflow handling when building contextual lookups: offset overflows now raise \u003ccode\u003eOTLOffsetOverflowError\u003c/code\u003e instead of \u003ccode\u003eAttributeError\u003c/code\u003e so another contextual format can be tried (regression from \u003ca href=\"https://redirect.github.com/fonttools/fonttools/issues/3439\"\u003e#3439\u003c/a\u003e). When all formats overflow, split the ruleset in halves until it fits (\u003ca href=\"https://redirect.github.com/fonttools/fonttools/issues/4171\"\u003e#4171\u003c/a\u003e).\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/fonttools/fonttools/blob/main/NEWS.rst\"\u003efonttools's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e4.65.0 (released 2026-09-10)\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e[glyf] Add \u003ccode\u003e__iter__\u003c/code\u003e, \u003ccode\u003eitems\u003c/code\u003e and \u003ccode\u003evalues\u003c/code\u003e methods to the \u003ccode\u003eglyf\u003c/code\u003e table\nto make it more dict-like (\u003ca href=\"https://redirect.github.com/fonttools/fonttools/issues/4156\"\u003e#4156\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003e[feaLib] Escape the anonymous block tag when scanning for its terminator, so tags\ncontaining regex metacharacters are matched literally (\u003ca href=\"https://redirect.github.com/fonttools/fonttools/issues/4167\"\u003e#4167\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003e[varLib] Strip directory components from \u003ccode\u003e\u0026lt;variable-font name=\u0026quot;...\u0026quot;/\u0026gt;\u003c/code\u003e when\nderiving the output filename in the \u003ccode\u003evarLib\u003c/code\u003e command line, so a designspace\ncannot write outside the output directory (\u003ca href=\"https://redirect.github.com/fonttools/fonttools/issues/4168\"\u003e#4168\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003e[feaLib] Fix tracking of the current script and language across redundant\n\u003ccode\u003escript\u003c/code\u003e statements. Rules following a \u003ccode\u003escript\u003c/code\u003e statement that names the\nfirst declared language system no longer end up under the \u003ccode\u003eDFLT\u003c/code\u003e script, and\na \u003ccode\u003escript\u003c/code\u003e statement naming the already-current script still narrows the\nlanguage systems and terminates the current lookup while leaving the\n\u003ccode\u003elookupflag\u003c/code\u003e alone, matching makeotf (\u003ca href=\"https://redirect.github.com/fonttools/fonttools/issues/1824\"\u003e#1824\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/fonttools/fonttools/issues/2522\"\u003e#2522\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/fonttools/fonttools/issues/4169\"\u003e#4169\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003e[varLib.interpolatable] Escape glyph names in the HTML report (\u003ca href=\"https://redirect.github.com/fonttools/fonttools/issues/4172\"\u003e#4172\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003e[otlLib] Fix overflow handling when building contextual lookups: offset overflows\nnow raise \u003ccode\u003eOTLOffsetOverflowError\u003c/code\u003e instead of \u003ccode\u003eAttributeError\u003c/code\u003e so another\ncontextual format can be tried (regression from \u003ca href=\"https://redirect.github.com/fonttools/fonttools/issues/3439\"\u003e#3439\u003c/a\u003e). When all formats\noverflow, split the ruleset in halves until it fits (\u003ca href=\"https://redirect.github.com/fonttools/fonttools/issues/4171\"\u003e#4171\u003c/a\u003e).\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fonttools/fonttools/commit/656f89dbf2026a7225aafba4fa11218210a765f5\"\u003e\u003ccode\u003e656f89d\u003c/code\u003e\u003c/a\u003e Release 4.65.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fonttools/fonttools/commit/16439502571fa73669743960aeab082a1d1d965d\"\u003e\u003ccode\u003e1643950\u003c/code\u003e\u003c/a\u003e Update NEWS.rst [skip ci]\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fonttools/fonttools/commit/fd0f083404d89ca61b9a8ce030b5b3006b709734\"\u003e\u003ccode\u003efd0f083\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/fonttools/fonttools/issues/4177\"\u003e#4177\u003c/a\u003e from fonttools/sbix-to-otsvg-snippet\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fonttools/fonttools/commit/9c625d410065e5006502bee9d4c734b2bf8c5c54\"\u003e\u003ccode\u003e9c625d4\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/fonttools/fonttools/issues/4171\"\u003e#4171\u003c/a\u003e from fonttools/fix-contextual-size-overflow\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fonttools/fonttools/commit/5f04c3853b5d20185f4913f63a863d1b1a652cc3\"\u003e\u003ccode\u003e5f04c38\u003c/code\u003e\u003c/a\u003e Add sbix to OT-SVG conversion snippet\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fonttools/fonttools/commit/48a0cf93bbca4983455d2d31e85de42377b83bd2\"\u003e\u003ccode\u003e48a0cf9\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/fonttools/fonttools/issues/4172\"\u003e#4172\u003c/a\u003e from insaf021/interpolatable-html-escape\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fonttools/fonttools/commit/d30db24fc883f27c3ea5e0560c52dfe501a38918\"\u003e\u003ccode\u003ed30db24\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/fonttools/fonttools/issues/4169\"\u003e#4169\u003c/a\u003e from cmyr/fealib-script-tracking-afdko\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fonttools/fonttools/commit/ac342d76483071017dfc56cb02be4d18f5f6460d\"\u003e\u003ccode\u003eac342d7\u003c/code\u003e\u003c/a\u003e [varLib.interpolatable] escape glyph name in HTML report\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fonttools/fonttools/commit/2a93de2209317546d4016ea09b229e0417f59eb8\"\u003e\u003ccode\u003e2a93de2\u003c/code\u003e\u003c/a\u003e Split contextual rulesets when all formats overflow\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fonttools/fonttools/commit/e6bb5fe394b418b17f27ac22b96da2d39fb4a472\"\u003e\u003ccode\u003ee6bb5fe\u003c/code\u003e\u003c/a\u003e Fix overflow reporting when sizing contextual lookups\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/fonttools/fonttools/compare/4.64.0...4.65.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `hypothesis` from 6.168.0 to 6.168.5\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/ca2a4c6e3c6b979d9fbb5ef9db614885a736d2aa\"\u003e\u003ccode\u003eca2a4c6\u003c/code\u003e\u003c/a\u003e Bump hypothesis version to 6.168.5 and update changelog\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/c1c9957de83aad3facea6610b0bccecf141632f6\"\u003e\u003ccode\u003ec1c9957\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/HypothesisWorks/hypothesis/issues/4894\"\u003e#4894\u003c/a\u003e from MarcoGorelli/django-from-field-return-type\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/d8625019d00324ac8d7571db26d6180ebcd0b2eb\"\u003e\u003ccode\u003ed862501\u003c/code\u003e\u003c/a\u003e Bump hypothesis version to 6.168.4 and update changelog\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/de4ec1c1bae27e5f1364b32b21295274c12b3e6f\"\u003e\u003ccode\u003ede4ec1c\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/HypothesisWorks/hypothesis/issues/4887\"\u003e#4887\u003c/a\u003e from HypothesisWorks/create-pull-request/patch\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/8a808891a388e538b41ae758e6c4a100bf4c6379\"\u003e\u003ccode\u003e8a80889\u003c/code\u003e\u003c/a\u003e add pypy312 support\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/9ee265d9e7523351ab30c337c78b022e03e14e21\"\u003e\u003ccode\u003e9ee265d\u003c/code\u003e\u003c/a\u003e Update pinned dependencies\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/f92f61c2d2f3c8aabd4946ae6cc2ddaf6941a011\"\u003e\u003ccode\u003ef92f61c\u003c/code\u003e\u003c/a\u003e Fix the return type of django's from_field\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/44b82b24cb40c72afd1f6e10c2af7a5d82c6539a\"\u003e\u003ccode\u003e44b82b2\u003c/code\u003e\u003c/a\u003e Bump hypothesis version to 6.168.3 and update changelog\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/aeaafb590194c03e30d0fbbfe11d29061204d756\"\u003e\u003ccode\u003eaeaafb5\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/HypothesisWorks/hypothesis/issues/4888\"\u003e#4888\u003c/a\u003e from gpacix/fix-quadratic-statistics\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/f3f4a294e9de0ddc1d5fbda23275bdfe57d78981\"\u003e\u003ccode\u003ef3f4a29\u003c/code\u003e\u003c/a\u003e wording, remove hardcoded test\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/HypothesisWorks/hypothesis/compare/v6.168.0...v6.168.5\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `identify` from 2.6.19 to 2.6.20\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pre-commit/identify/commit/aa34031fb31db554aa02e61dc703604a19cba0a0\"\u003e\u003ccode\u003eaa34031\u003c/code\u003e\u003c/a\u003e v2.6.20\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pre-commit/identify/commit/116099f59f9e603de9385b9f7f36a38f47f2cb36\"\u003e\u003ccode\u003e116099f\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/pre-commit/identify/issues/609\"\u003e#609\u003c/a\u003e from Malix-Labs/feat/add-nushell\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pre-commit/identify/commit/971546cb3e5102681e143602c3b513e8153ddc65\"\u003e\u003ccode\u003e971546c\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/pre-commit/identify/issues/610\"\u003e#610\u003c/a\u003e from pre-commit/lock-file-tags\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pre-commit/identify/commit/da45cb15e5c40e03253066cbfc6259cc2ef17520\"\u003e\u003ccode\u003eda45cb1\u003c/code\u003e\u003c/a\u003e Add support for 'nu' extension and Nushell interpreters\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pre-commit/identify/commit/a35b99bcf29f016f574f52c39d1c83533fa37d5d\"\u003e\u003ccode\u003ea35b99b\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/pre-commit/identify/issues/608\"\u003e#608\u003c/a\u003e from steovd/profile-sh\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pre-commit/identify/commit/bd5cdb7c18f5cb74adba9619fe9bd06747e8a8a7\"\u003e\u003ccode\u003ebd5cdb7\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/pre-commit/identify/issues/601\"\u003e#601\u003c/a\u003e from ngie-eign/issue-258\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pre-commit/identify/commit/66faf04d79b064020901da66a648239039efcb2b\"\u003e\u003ccode\u003e66faf04\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/pre-commit/identify/issues/597\"\u003e#597\u003c/a\u003e from edgarrmondragon/patch-1\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pre-commit/identify/commit/c75a0a21564ed6e1721394255af3ddd4f40bbd06\"\u003e\u003ccode\u003ec75a0a2\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/pre-commit/identify/issues/593\"\u003e#593\u003c/a\u003e from NinjaMandalorian/main\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pre-commit/identify/commit/ea6c9f914a6d7507777ca54ba86b9af52ae6f026\"\u003e\u003ccode\u003eea6c9f9\u003c/code\u003e\u003c/a\u003e Add support for 'luau' file extension\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pre-commit/identify/commit/d28c5712db75b16bd715b7c7b545e3eb5f6f2a35\"\u003e\u003ccode\u003ed28c571\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/pre-commit/identify/issues/585\"\u003e#585\u003c/a\u003e from Kvan7/patch-1\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/pre-commit/identify/compare/v2.6.19...v2.6.20\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `iniconfig` from 2.3.0 to 2.3.1\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pytest-dev/iniconfig/releases\"\u003einiconfig's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003eVersion 2.3.1\u003c/h2\u003e\n\u003ch2\u003eFixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eParsing values with many continuation lines is now linear instead of quadratic in time (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/78\"\u003e#78\u003c/a\u003e, regarding \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/77\"\u003e#77\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003eA leading UTF-8 BOM is now stripped when reading INI files. Files saved by Windows editors used to fail with \u003ccode\u003eParseError\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/76\"\u003e#76\u003c/a\u003e, thanks \u003ca href=\"https://github.com/Pitchfork-and-Torch\"\u003e\u003ccode\u003e@​Pitchfork-and-Torch\u003c/code\u003e\u003c/a\u003e).\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eInternal\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003einiconfig._parse.ParsedLine.value\u003c/code\u003e is now a list of lines. This is private API.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eDocs\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eThe README example now uses \u003ccode\u003eIniConfig.parse()\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/79\"\u003e#79\u003c/a\u003e, thanks \u003ca href=\"https://github.com/MbappeWU\"\u003e\u003ccode\u003e@​MbappeWU\u003c/code\u003e\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003eFixed the issue tracker link (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/74\"\u003e#74\u003c/a\u003e, thanks \u003ca href=\"https://github.com/stefan6419846\"\u003e\u003ccode\u003e@​stefan6419846\u003c/code\u003e\u003c/a\u003e).\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull diff:\u003c/strong\u003e \u003ca href=\"https://github.com/pytest-dev/iniconfig/compare/v2.3.0...v2.3.1\"\u003ehttps://github.com/pytest-dev/iniconfig/compare/v2.3.0...v2.3.1\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e[pre-commit.ci] pre-commit autoupdate by \u003ca href=\"https://github.com/pre-commit-ci\"\u003e\u003ccode\u003e@​pre-commit-ci\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/71\"\u003epytest-dev/iniconfig#71\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[pre-commit.ci] pre-commit autoupdate by \u003ca href=\"https://github.com/pre-commit-ci\"\u003e\u003ccode\u003e@​pre-commit-ci\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/72\"\u003epytest-dev/iniconfig#72\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix link to issues by \u003ca href=\"https://github.com/stefan6419846\"\u003e\u003ccode\u003e@​stefan6419846\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/74\"\u003epytest-dev/iniconfig#74\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eparse_lines: keep values as list of lines, join once by \u003ca href=\"https://github.com/RonnyPfannschmidt\"\u003e\u003ccode\u003e@​RonnyPfannschmidt\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/78\"\u003epytest-dev/iniconfig#78\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[pre-commit.ci] pre-commit autoupdate by \u003ca href=\"https://github.com/pre-commit-ci\"\u003e\u003ccode\u003e@​pre-commit-ci\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/73\"\u003epytest-dev/iniconfig#73\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003etest: expect sorted \u003cstrong\u003eall\u003c/strong\u003e after ruff autofix by \u003ca href=\"https://github.com/RonnyPfannschmidt\"\u003e\u003ccode\u003e@​RonnyPfannschmidt\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/80\"\u003epytest-dev/iniconfig#80\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003edocs: use parse API in the README example by \u003ca href=\"https://github.com/MbappeWU\"\u003e\u003ccode\u003e@​MbappeWU\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/79\"\u003epytest-dev/iniconfig#79\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eStrip leading UTF-8 BOM when reading INI files by \u003ca href=\"https://github.com/Pitchfork-and-Torch\"\u003e\u003ccode\u003e@​Pitchfork-and-Torch\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/76\"\u003epytest-dev/iniconfig#76\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echangelog: add BOM stripping (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/76\"\u003e#76\u003c/a\u003e) to 2.3.1 by \u003ca href=\"https://github.com/RonnyPfannschmidt\"\u003e\u003ccode\u003e@​RonnyPfannschmidt\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/81\"\u003epytest-dev/iniconfig#81\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/stefan6419846\"\u003e\u003ccode\u003e@​stefan6419846\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/74\"\u003epytest-dev/iniconfig#74\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/MbappeWU\"\u003e\u003ccode\u003e@​MbappeWU\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/79\"\u003epytest-dev/iniconfig#79\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/Pitchfork-and-Torch\"\u003e\u003ccode\u003e@​Pitchfork-and-Torch\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/76\"\u003epytest-dev/iniconfig#76\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pytest-dev/iniconfig/compare/v2.3.0...v2.3.1\"\u003ehttps://github.com/pytest-dev/iniconfig/compare/v2.3.0...v2.3.1\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pytest-dev/iniconfig/blob/main/CHANGELOG\"\u003einiconfig's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e2.3.1\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003efix quadratic parse time for values with many continuation lines (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/78\"\u003e#78\u003c/a\u003e, regarding \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/77\"\u003e#77\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003estrip a leading UTF-8 BOM when reading INI files, which previously raised \u003ccode\u003eParseError\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/76\"\u003e#76\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003einternal: \u003ccode\u003einiconfig._parse.ParsedLine.value\u003c/code\u003e is now a list of lines\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/316fbfaf2752d89326e1e75b45cd070f5b5ace9a\"\u003e\u003ccode\u003e316fbfa\u003c/code\u003e\u003c/a\u003e changelog: add BOM stripping (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/76\"\u003e#76\u003c/a\u003e) to 2.3.1 (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/81\"\u003e#81\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/d2dcb7289291e7e7019c183659814d42f7264b2d\"\u003e\u003ccode\u003ed2dcb72\u003c/code\u003e\u003c/a\u003e Strip leading UTF-8 BOM when reading INI files (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/76\"\u003e#76\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/40d8c03a1553953350d787e45f1cb768e2c14e6a\"\u003e\u003ccode\u003e40d8c03\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/79\"\u003e#79\u003c/a\u003e from MbappeWU/codex/docs-parse-inline-comments\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/48359c3a7c2c8648a134ea8469e802b5aa8d5030\"\u003e\u003ccode\u003e48359c3\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/80\"\u003e#80\u003c/a\u003e from pytest-dev/claude/fix-iniconfig-test-eukh2n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/b153213a011fa92f4370c83cef614cf73c987f57\"\u003e\u003ccode\u003eb153213\u003c/code\u003e\u003c/a\u003e test: expect sorted \u003cstrong\u003eall\u003c/strong\u003e after ruff RUF022 autofix\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/4fddfabc850afee28178931c62535ba1c2b30c72\"\u003e\u003ccode\u003e4fddfab\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/73\"\u003e#73\u003c/a\u003e from pytest-dev/pre-commit-ci-update-config\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/15852c2d1f9178ff960bf6c39a6f0f1495f1009e\"\u003e\u003ccode\u003e15852c2\u003c/code\u003e\u003c/a\u003e [pre-commit.ci] auto fixes from pre-commit.com hooks\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/2e68639c3f41ea5b693f89807172cf304c94fb9e\"\u003e\u003ccode\u003e2e68639\u003c/code\u003e\u003c/a\u003e [pre-commit.ci] pre-commit autoupdate\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/23c9e088a909f16d0d8dc03b5090c66964c428b0\"\u003e\u003ccode\u003e23c9e08\u003c/code\u003e\u003c/a\u003e docs: use parse API in the README example\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/e038536fbee6b5e76b180fce6694fd54661ced12\"\u003e\u003ccode\u003ee038536\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/78\"\u003e#78\u003c/a\u003e from RonnyPfannschmidt/claude/dazzling-einstein-h8zq7m\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/pytest-dev/iniconfig/compare/v2.3.0...v2.3.1\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `librt` from 0.15.0 to 0.16.0\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mypyc/librt/commit/b2508063e86e012301e09432a6d58e74224f1e24\"\u003e\u003ccode\u003eb250806\u003c/code\u003e\u003c/a\u003e Sync mypy and bump version\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/mypyc/librt/compare/v0.15.0...v0.16.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `matplotlib` from 3.10.0 to 3.10.9\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/matplotlib/matplotlib/releases\"\u003ematplotlib's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev3.10.9\u003c/h2\u003e\n\u003cp\u003eThis is a micro release of the v3.10.x series.\nHighlights of this release include:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eVarious minor bug and doc fixes\u003c/li\u003e\n\u003cli\u003eSecurity hardening validation of cyclers - Removing eval usage\u003c/li\u003e\n\u003cli\u003eSecurity hardening in Latex and PS calls - Removing shell escapes\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eREL: v3.10.8\u003c/h2\u003e\n\u003cp\u003eThis is a bugfix release in the 3.10.x series.\u003c/p\u003e\n\u003cp\u003eThe primary highlights of this release are:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eProperly allow freethreaded mode in the MacOS backend\u003c/li\u003e\n\u003cli\u003eBetter error handling for MacOS backend\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eREL: v3.10.7\u003c/h2\u003e\n\u003cp\u003eThis is the latest bugfix release in the 3.10.x series.\u003c/p\u003e\n\u003cp\u003eThe most important update in this release is that the minimum version\nof \u003ccode\u003epyparsing\u003c/code\u003e has been updated to version 3.0.\u003c/p\u003e\n\u003ch2\u003eREL: v3.10.6\u003c/h2\u003e\n\u003cp\u003eThis is a bugfix release in the 3.10.x series.\u003c/p\u003e\n\u003cp\u003eHighlights from this release include:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e- Fix regression of hi-dpi support for Qt\r\n- Fix race condition in TexManager.make_dvi \u0026amp; make_png\r\n- Various documentation and other bugfixes\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2\u003eREL: v3.10.5\u003c/h2\u003e\n\u003cp\u003eThis is the fourth bugfix release of the 3.10.x series.\u003c/p\u003e\n\u003cp\u003eIncluded in this release is distributed wheels for Python 3.14 (including freethreaded) and Windows ARM.\u003c/p\u003e\n\u003cp\u003eThere are also several smaller bugfixes.\u003c/p\u003e\n\u003ch2\u003eREL: v3.10.3\u003c/h2\u003e\n\u003cp\u003eThis is the third bugfix release of the 3.10.x series\u003c/p\u003e\n\u003ch2\u003eREL: v3.10.1\u003c/h2\u003e\n\u003cp\u003eThis is the first bugfix release of the 3.10.x series.\u003c/p\u003e\n\u003cp\u003eThis release contains several bug-fixes and adjustments:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eRespect array alpha with interpolation_stage='rgba' in _Imagebase::_make_image\u003c/li\u003e\n\u003cli\u003eRemove md5 usage to prevent issues on FIPS enabled systems\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/matplotlib/matplotlib/commit/dd8d78b8dce60b6c8db86132892577a0b9dbe469\"\u003e\u003ccode\u003edd8d78b\u003c/code\u003e\u003c/a\u003e REL: v3.10.9\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/matplotlib/matplotlib/commit/2fb18915bcfe69a188832c776fe18d88337de9bc\"\u003e\u003ccode\u003e2fb1891\u003c/code\u003e\u003c/a\u003e REL: Release prep v3.10.9\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/matplotlib/matplotlib/commit/d0e923abfa016c04901fe4e315b9d215949f6fc5\"\u003e\u003ccode\u003ed0e923a\u003c/code\u003e\u003c/a\u003e Merge branch 'v3.10.8-doc' into v3.10.x\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/matplotlib/matplotlib/commit/163793248a5fc9f23a560e45551c44351a8bd716\"\u003e\u003ccode\u003e1637932\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/matplotlib/matplotlib/issues/31558\"\u003e#31558\u003c/a\u003e from meeseeksmachine/auto-backport-of-pr-31556-on-v...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/matplotlib/matplotlib/commit/a83faacb0dbe7edd1bae38e1e715b77b6aaebb84\"\u003e\u003ccode\u003ea83faac\u003c/code\u003e\u003c/a\u003e Backport PR \u003ca href=\"https://redirect.github.com/matplotlib/matplotlib/issues/31556\"\u003e#31556\u003c/a\u003e: FIX: Inverted PyErr_Occurred check in enum type caster (_...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/matplotlib/matplotlib/commit/a4f57ab0623f9d26be29e0a3b0de904667c7eeb7\"\u003e\u003ccode\u003ea4f57ab\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/matplotlib/matplotlib/issues/31545\"\u003e#31545\u003c/a\u003e from ksunden/backport-of-pr-31282-on-v3.10.x\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/matplotlib/matplotlib/commit/063288d0cc912aa2af5cc1b7e7ca3d228d9f8976\"\u003e\u003ccode\u003e063288d\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/matplotlib/matplotlib/issues/31544\"\u003e#31544\u003c/a\u003e from ksunden/backport-of-pr-31248-on-v3.10.x\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/matplotlib/matplotlib/commit/b2ed1969191a03ec8927f96573664474662ab4c1\"\u003e\u003ccode\u003eb2ed196\u003c/code\u003e\u003c/a\u003e Backport PR \u003ca href=\"https://redirect.github.com/matplotlib/matplotlib/issues/31248\"\u003e#31248\u003c/a\u003e: SEC: Remove eval() from validate_cycler\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/matplotlib/matplotlib/commit/acc60241a70b920eaf04fce41a8cf0a77010fb7d\"\u003e\u003ccode\u003eacc6024\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/matplotlib/matplotlib/issues/31282\"\u003e#31282\u003c/a\u003e from scottshambaugh/tex_no_shell\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/matplotlib/matplotlib/commit/e3fb54163b1ce9dbc1a9e8e0973289dc14e366c2\"\u003e\u003ccode\u003ee3fb541\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/matplotlib/matplotlib/issues/31078\"\u003e#31078\u003c/a\u003e from meeseeksmachine/auto-backport-of-pr-31075-on-v...\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/matplotlib/matplotlib/compare/v3.10.0...v3.10.9\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `mypy` from 2.3.1 to 2.4.0\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/python/mypy/blob/master/CHANGELOG.md\"\u003emypy's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003eMypy Release Notes\u003c/h1\u003e\n\u003ch2\u003eNext Release\u003c/h2\u003e\n\u003ch2\u003eMypy 2.4\u003c/h2\u003e\n\u003cp\u003eWe've just uploaded mypy 2.4.0 to the Python Package Index (\u003ca href=\"https://pypi.org/project/mypy/\"\u003ePyPI\u003c/a\u003e).\nMypy is a static type checker for Python. This release includes new features, performance\nimprovements and bug fixes. You can install it as follows:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003epython3 -m pip install -U mypy\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eYou can read the full documentation for this release on \u003ca href=\"http://mypy.readthedocs.io\"\u003eRead the Docs\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003ePython 3.15 Support\u003c/h3\u003e\n\u003cp\u003eMypy 2.4 supports running on Python 3.15 and type checking most Python\n3.15 features. This includes the new builtin \u003ccode\u003esentinel\u003c/code\u003e type for\nsentinel values (PEP 661), which mypy now supports (see below for\ndetails). Lazy imports (PEP 810) and unpacking in comprehensions\n(PEP 798) are also supported. Closed TypedDicts (PEP 728) have been\nsupported since mypy 2.2, but the \u003ccode\u003eextra_items\u003c/code\u003e TypedDict argument,\nalso introduced in PEP 728, is still unsupported. Support for\n\u003ccode\u003eextra_items\u003c/code\u003e will be added in a future mypy release.\u003c/p\u003e\n\u003ch3\u003eNative Parser Enabled by Default\u003c/h3\u003e\n\u003cp\u003eMypy now uses the new native parser by default. It's based on the Ruff\nparser, and it's significantly faster than the legacy parser, which\nuses the stdlib \u003ccode\u003east\u003c/code\u003e module. The native parser also has other\nbenefits:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eYou can target newer Python versions and use recent Python syntax\neven when running mypy on an older Python version. For example, you\ncan use \u003ccode\u003e--python-version 3.15\u003c/code\u003e when running mypy on Python 3.14.\u003c/li\u003e\n\u003cli\u003eStub files can use syntax that is newer than the target Python\nversion. For example, stubs can use the PEP 695 generic class syntax\n(\u003ccode\u003eclass Box[T]: ...\u003c/code\u003e) when running on or targeting Python 3.10.\u003c/li\u003e\n\u003cli\u003eParallel type checking requires the native parser.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe legacy parser is still available through \u003ccode\u003e--no-native-parser\u003c/code\u003e, or\n\u003ccode\u003enative_parser = False\u003c/code\u003e in the config file (\u003ccode\u003enative_parser = false\u003c/code\u003e\nunder \u003ccode\u003e[tool.mypy]\u003c/code\u003e in pyproject.toml). We are planning to remove the\nlegacy parser in early 2027. If you run into a problem with the native\nparser, please report it on the\n\u003ca href=\"https://github.com/python/mypy/issues\"\u003eissue tracker\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eUnlike the legacy parser, the native parser doesn't support type\ncomments for variables defined by \u003ccode\u003efor\u003c/code\u003e and \u003ccode\u003ewith\u003c/code\u003e statements. These\ntype comments are silently ignored, and the types of the variables are\u003c/p\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/935ba8afba7ceacca0651579450c74339f343016\"\u003e\u003ccode\u003e935ba8a\u003c/code\u003e\u003c/a\u003e Bump version to 2.4.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/334a678967dc6bcda3d3f8cb82e253dd61fa2be9\"\u003e\u003ccode\u003e334a678\u003c/code\u003e\u003c/a\u003e Add link for PR 22066 in mypy 2.4 changelog (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22082\"\u003e#22082\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/fe69660bcdaa76cccb1aedbb4b9c1c7627215571\"\u003e\u003ccode\u003efe69660\u003c/code\u003e\u003c/a\u003e Finalize mypy 2.4 changelog (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22080\"\u003e#22080\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/541fd87ac53581fb3c511b277fd780ec4e869c95\"\u003e\u003ccode\u003e541fd87\u003c/code\u003e\u003c/a\u003e Various mypy 2.4 changelog updates (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22077\"\u003e#22077\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/b231182c0b2993918f74594236bda7d3ec6fcbe5\"\u003e\u003ccode\u003eb231182\u003c/code\u003e\u003c/a\u003e Update native parser docs (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22078\"\u003e#22078\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/04fe42ce217f120a4de2c1fd62b71ef77452d699\"\u003e\u003ccode\u003e04fe42c\u003c/code\u003e\u003c/a\u003e Initial Changelog for Mypy 2.4 (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22071\"\u003e#22071\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/06174941bca0e88567441ee3cb0ffaef0dd22e2c\"\u003e\u003ccode\u003e0617494\u003c/code\u003e\u003c/a\u003e Quick fix for non UTF-8 encodings with new parser (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22066\"\u003e#22066\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/b2f9b60eae5ac7cd9c6a60650b128815bb703daf\"\u003e\u003ccode\u003eb2f9b60\u003c/code\u003e\u003c/a\u003e Bump librt to 0.16.0 (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22067\"\u003e#22067\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/9d798dcb9589f9bd62e625a97d8db23ad9a678fa\"\u003e\u003ccode\u003e9d798dc\u003c/code\u003e\u003c/a\u003e Sync typeshed (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22054\"\u003e#22054\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/0861bb6450d6d3658e44dbca9cd2ba478faf3c1d\"\u003e\u003ccode\u003e0861bb6\u003c/code\u003e\u003c/a\u003e Reduce max protocol stack size to 20 (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22053\"\u003e#22053\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/python/mypy/compare/v2.3.1...v2.4.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `nodeenv` from 1.10.0 to 1.11.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/ekalinin/nodeenv/releases\"\u003enodeenv's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e1.11.0\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003ch3\u003eNew Features 🎉\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003efeat(certifi): optionally use certifi certificates by \u003ca href=\"https://github.com/ekalinin\"\u003e\u003ccode\u003e@​ekalinin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/394\"\u003eekalinin/nodeenv#394\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat(nodeenv): accept npm-style semver ranges in --node by \u003ca href=\"https://github.com/ekalinin\"\u003e\u003ccode\u003e@​ekalinin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/393\"\u003eekalinin/nodeenv#393\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat(nodeenv): add --prefer-system to use system node when available by \u003ca href=\"https://github.com/ekalinin\"\u003e\u003ccode\u003e@​ekalinin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/395\"\u003eekalinin/nodeenv#395\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat(nodeenv): add --isolate-npm to keep npm config inside the environment by \u003ca href=\"https://github.com/ekalinin\"\u003e\u003ccode\u003e@​ekalinin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/396\"\u003eekalinin/nodeenv#396\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat(nodeenv): install local packages from a requirements file by \u003ca href=\"https://github.com/ekalinin\"\u003e\u003ccode\u003e@​ekalinin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/407\"\u003eekalinin/nodeenv#407\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat(nodeenv): write the posix activate on Windows for git-bash by \u003ca href=\"https://github.com/ekalinin\"\u003e\u003ccode\u003e@​ekalinin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/409\"\u003eekalinin/nodeenv#409\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eFixed bugs 🐛\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003efix: repair Windows CI (ZipFile.extractall filter, test_smoke layout) by \u003ca href=\"https://github.com/ekalinin\"\u003e\u003ccode\u003e@​ekalinin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/392\"\u003eekalinin/nodeenv#392\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(nodeenv): replace leftover debug print with logger.debug by \u003ca href=\"https://github.com/ekalinin\"\u003e\u003ccode\u003e@​ekalinin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/391\"\u003eekalinin/nodeenv#391\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(nodeenv): stop -p from reinstalling node that is already there by \u003ca href=\"https://github.com/ekalinin\"\u003e\u003ccode\u003e@​ekalinin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/403\"\u003eekalinin/nodeenv#403\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(nodeenv): let -p target a virtualenv nodeenv isn't installed in by \u003ca href=\"https://github.com/ekalinin\"\u003e\u003ccode\u003e@​ekalinin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/402\"\u003eekalinin/nodeenv#402\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(nodeenv): report the url and proxy instead of a traceback by \u003ca href=\"https://github.com/ekalinin\"\u003e\u003ccode\u003e@​ekalinin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/410\"\u003eekalinin/nodeenv#410\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(nodeenv): keep the python virtualenv's scripts under -p on Windows by \u003ca href=\"https://github.com/ekalinin\"\u003e\u003ccode\u003e@​ekalinin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/411\"\u003eekalinin/nodeenv#411\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(nodeenv): report a missing node archive instead of a traceback by \u003ca href=\"https://github.com/ekalinin\"\u003e\u003ccode\u003e@​ekalinin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/412\"\u003eekalinin/nodeenv#412\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(nodeenv): detect musl regardless of the host triplet vendor by \u003ca href=\"https://github.com/ekalinin\"\u003e\u003ccode\u003e@​ekalinin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/413\"\u003eekalinin/nodeenv#413\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(nodeenv): read npm's parseable listing in freeze by \u003ca href=\"https://github.com/ekalinin\"\u003e\u003ccode\u003e@​ekalinin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/414\"\u003eekalinin/nodeenv#414\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix: allow zsh to source bin/activate by \u003ca href=\"https://github.com/r3wretrhy\"\u003e\u003ccode\u003e@​r3wretrhy\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/417\"\u003eekalinin/nodeenv#417\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(nodeenv): link nodejs.exe without mklink by \u003ca href=\"https://github.com/ekalinin\"\u003e\u003ccode\u003e@​ekalinin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/415\"\u003eekalinin/nodeenv#415\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eImprovements 🛠\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eFEAT: Check if activate is called as script. by \u003ca href=\"https://github.com/quazgar\"\u003e\u003ccode\u003e@​quazgar\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/384\"\u003eekalinin/nodeenv#384\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eaddress deprecation warning in tarfile.TarFile.extract all in Python … by \u003ca href=\"https://github.com/nernst\"\u003e\u003ccode\u003e@​nernst\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/380\"\u003eekalinin/nodeenv#380\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(ci): run the activation scripts in sh, dash, bash, zsh and fish by \u003ca href=\"https://github.com/ekalinin\"\u003e\u003ccode\u003e@​ekalinin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/397\"\u003eekalinin/nodeenv#397\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(ci): give the integration smoke tests a home and stop running them 20 times by \u003ca href=\"https://github.com/ekalinin\"\u003e\u003ccode\u003e@​ekalinin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/401\"\u003eekalinin/nodeenv#401\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat(nodeenv): clean \u0026quot;src\u0026quot; directory by default by \u003ca href=\"https://github.com/ekalinin\"\u003e\u003ccode\u003e@​ekalinin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/404\"\u003eekalinin/nodeenv#404\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eDocumentation 📄\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003edocs(readme): document file:// mirrors as a local download source by \u003ca href=\"https://github.com/ekalinin\"\u003e\u003ccode\u003e@​ekalinin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/405\"\u003eekalinin/nodeenv#405\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003edocs(changes): backfill the changelog from 1.3.2 to 1.10.0 by \u003ca href=\"https://github.com/ekalinin\"\u003e\u003ccode\u003e@​ekalinin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/408\"\u003eekalinin/nodeenv#408\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eOther Changes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003echore(release): bump nodeenv version to 1.11.0 by \u003ca href=\"https://github.com/ekalinin\"\u003e\u003ccode\u003e@​ekalinin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/418\"\u003eekalinin/nodeenv#418\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/quazgar\"\u003e\u003ccode\u003e@​quazgar\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/384\"\u003eekalinin/nodeenv#384\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/nernst\"\u003e\u003ccode\u003e@​nernst\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/380\"\u003eekalinin/nodeenv#380\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/r3wretrhy\"\u003e\u003ccode\u003e@​r3wretrhy\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/417\"\u003eekalinin/nodeenv#417\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/ekalinin/nodeenv/compare/1.10.0...1.11.0\"\u003ehttps://github.com/ekalinin/nodeenv/compare/1.10.0...1.11.0\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/ekalinin/nodeenv/blob/master/CHANGES\"\u003enodeenv's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003eVersion 1.11.0\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eFixed zsh \u003ccode\u003esource bin/activate\u003c/code\u003e aborting on the direct-call guard \u003ccode\u003e[#398](https://github.com/ekalinin/nodeenv/issues/398) \u0026lt;https://github.com/ekalinin/nodeenv/issues/398\u0026gt;\u003c/code\u003e_\u003c/li\u003e\n\u003cli\u003eAdded check for how \u003ccode\u003eactivate\u003c/code\u003e is called\n\u003ccode\u003e[#384](https://github.com/ekalinin/nodeenv/issues/384) \u0026lt;https://github.com/ekalinin/nodeenv/pull/384\u0026gt;\u003c/code\u003e_\u003c/li\u003e\n\u003cli\u003eAddressed the \u003ccode\u003etarfile.extractall\u003c/code\u003e deprecation on Python \u0026gt;= 3.12 by\nsetting \u003ccode\u003efilter='data'\u003c/code\u003e, which also prevents writing files via \u0026quot;..\u0026quot; or\nabsolute paths \u003ccode\u003e[#380](https://github.com/ekalinin/nodeenv/issues/380) \u0026lt;https://github.com/ekalinin/nodeenv/pull/380\u0026gt;\u003c/code\u003e_\u003c/li\u003e\n\u003cli\u003eAdded support for Solaris/illumos\n\u003ccode\u003e[#360](https://github.com/ekalinin/nodeenv/issues/360) \u0026lt;https://github.com/ekalinin/nodeenv/issues/360\u0026gt;\u003c/code\u003e_\u003c/li\u003e\n\u003cli\u003eAdded \u003ccode\u003epredeactivate\u003c/code\u003e hooks for Windows\u003c/li\u003e\n\u003cli\u003eAdded error handling and tests for the node installation\n\u003ccode\u003e[#336](https://github.com/ekalinin/nodeenv/issues/336) \u0026lt;https://github.com/ekalinin/nodeenv/issues/336\u0026gt;\u003c/code\u003e_\u003c/li\u003e\n\u003cli\u003eRemoved the leftover debug \u003ccode\u003eprint\u003c/code\u003e that leaked a dict to stdout on every\nversion detection \u003ccode\u003e[#390](https://github.com/ekalinin/nodeenv/issues/390) \u0026lt;https://github.com/ekalinin/nodeenv/issues/390\u0026gt;\u003c/code\u003e_\u003c/li\u003e\n\u003cli\u003eAdded \u003ccode\u003e--with-certifi\u003c/code\u003e to download packages with the certifi certificate\nbundle \u003ccode\u003e[#388](https://github.com/ekalinin/nodeenv/issues/388) \u0026lt;https://github.com/ekalinin/nodeenv/pull/388\u0026gt;\u003c/code\u003e_\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e--node\u003c/code\u003e accepts npm-style semver ranges\n\u003ccode\u003e[#393](https://github.com/ekalinin/nodeenv/issues/393) \u0026lt;https://github.com/ekalinin/nodeenv/pull/393\u0026gt;\u003c/code\u003e_\u003c/li\u003e\n\u003cli\u003eAdded \u003ccode\u003e--prefer-system\u003c/code\u003e to use system-wide node.js when available and\ninstall one otherwise \u003ccode\u003e[#153](https://github.com/ekalinin/nodeenv/issues/153) \u0026lt;https://github.com/ekalinin/nodeenv/issues/153\u0026gt;\u003c/code\u003e_\u003c/li\u003e\n\u003cli\u003eAdded \u003ccode\u003e--isolate-npm\u003c/code\u003e to keep npm cache, userconfig and init-module inside\nthe environment \u003ccode\u003e[#154](https://github.com/ekalinin/nodeenv/issues/154) \u0026lt;https://github.com/ekalinin/nodeenv/issues/154\u0026gt;\u003c/code\u003e_\u003c/li\u003e\n\u003cli\u003eAdded tests that run the activation scripts in sh, dash, bash, zsh and fish.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-p\u003c/code\u003e no longer reinstalls node when the requested version is already in the\nvirtualenv \u003ccode\u003e[#159](https://github.com/ekalinin/nodeenv/issues/159) \u0026lt;https://github.com/ekalinin/nodeenv/issues/159\u0026gt;\u003c/code\u003e_\u003c/li\u003e\n\u003cli\u003eRepeated \u003ccode\u003e-p\u003c/code\u003e runs no longer duplicate the \u003ccode\u003epredeactivate\u003c/code\u003e hook\n\u003ccode\u003e[#159](https://github.com/ekalinin/nodeenv/issues/159) \u0026lt;https://github.com/ekalinin/nodeenv/issues/159\u0026gt;\u003c/code\u003e_\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-p\u003c/code\u003e accepts an optional virtualenv directory and prefers the activated\n\u003ccode\u003eVIRTUAL_ENV\u003c/code\u003e over the virtualenv nodeenv itself is installed in\n\u003ccode\u003e[#156](https://github.com/ekalinin/nodeenv/issues/156) \u0026lt;https://github.com/ekalinin/nodeenv/issues/156\u0026gt;\u003c/code\u003e_\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-r/--requirements\u003c/code\u003e may now be given more than once, and the new\n\u003ccode\u003e--local-requirements\u003c/code\u003e installs the packages of a file locally, into\n\u0026quot;node_modules\u0026quot; of the current directory, which is what \u003ccode\u003efreeze -l\u003c/code\u003e writes.\nUnder npm \u0026lt; 1.0.0, which has no \u003ccode\u003e-g\u003c/code\u003e, a local file is still installed the\nold way \u003ccode\u003e[#206](https://github.com/ekalinin/nodeenv/issues/206) \u0026lt;https://github.com/ekalinin/nodeenv/issues/206\u0026gt;\u003c/code\u003e_\u003c/li\u003e\n\u003cli\u003eThe \u0026quot;src\u0026quot; directory is now removed after installation by default, which\nhalves the size of an environment. Added \u003ccode\u003e--no-clean-src\u003c/code\u003e to keep it: with\n\u003ccode\u003e--source\u003c/code\u003e that is what lets a repeated \u003ccode\u003e--force\u003c/code\u003e build reuse the\ndownloaded source tree\n\u003ccode\u003e[#205](https://github.com/ekalinin/nodeenv/issues/205) \u0026lt;https://github.com/ekalinin/nodeenv/issues/205\u0026gt;\u003c/code\u003e_\u003c/li\u003e\n\u003cli\u003eDocumented that \u003ccode\u003e--mirror\u003c/code\u003e takes a \u003ccode\u003efile://\u003c/code\u003e URL, so a local directory can\nserve as the download source\n\u003ccode\u003e[#193](https://github.com/ekalinin/nodeenv/issues/193) \u0026lt;https://github.com/ekalinin/nodeenv/issues/193\u0026gt;\u003c/code\u003e_\u003c/li\u003e\n\u003cli\u003eThe posix \u003ccode\u003eactivate\u003c/code\u003e is now written on Windows too, into \u0026quot;Scripts\u0026quot;, so\ngit-bash and the other posix shells there can activate an environment\n\u003ccode\u003e[#226](https://github.com/ekalinin/nodeenv/issues/226) \u0026lt;https://github.com/ekalinin/nodeenv/issues/226\u0026gt;\u003c/code\u003e_\u003c/li\u003e\n\u003cli\u003eA download that reaches nothing at all, which a broken \u003ccode\u003ehttp_proxy\u003c/code\u003e or\n\u003ccode\u003ehttps_proxy\u003c/code\u003e usually causes, now reports the url and the proxy settings\ninstead of a traceback\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/ekalinin/nodeenv/commit/e7453580730938674da3e6928cc663cf9faf9e66\"\u003e\u003ccode\u003ee745358\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/issues/418\"\u003e#418\u003c/a\u003e from ekalinin/chore/release-1.11.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/ekalinin/nodeenv/commit/fd19956502f268aeb69757cbee17569ec7adf97a\"\u003e\u003ccode\u003efd19956\u003c/code\u003e\u003c/a\u003e...\n\n_Description has been truncated_\n\n\u003c!-- This is an auto-generated comment: release notes by coderabbit.ai --\u003e\n\n## Summary by CodeRabbit\n\n* **Chores**\n  * Updated development and project tooling versions.\n\n\u003c!-- end of auto-generated comment: release notes by coderabbit.ai --\u003e","html_url":"https://github.com/Sharqascc/graf/pull/125","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/Sharqascc%2Fgraf/issues/125","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/125/packages"},{"uuid":"5877513074","node_id":"PR_kwDOLfl6cs8AAAABIwnTEw","number":340,"state":"closed","title":"build(deps): bump the python-wheel group across 1 directory with 7 updates","user":"dependabot[bot]","labels":["dependencies","python"],"assignees":[],"locked":false,"comments_count":2,"pull_request":true,"closed_at":"2026-10-16T03:46:08.000Z","author_association":null,"state_reason":null,"created_at":"2026-10-16T02:59:01.000Z","updated_at":"2026-10-16T03:46:18.000Z","time_to_close":2827,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"build(deps): bump","group_name":"python-wheel","update_count":7,"packages":[{"name":"scikit-build-core","old_version":"1.1.0","new_version":"1.1.1","repository_url":"https://github.com/scikit-build/scikit-build-core"},{"name":"filelock","old_version":"3.32.7","new_version":"4.1.1","repository_url":"https://github.com/tox-dev/py-filelock"},{"name":"platformdirs","old_version":"4.12.0","new_version":"4.13.0","repository_url":"https://github.com/tox-dev/platformdirs"},{"name":"mypy","old_version":"2.3.1","new_version":"2.4.0","repository_url":"https://github.com/python/mypy"},{"name":"delvewheel","old_version":"1.13.1","new_version":"1.13.2","repository_url":"https://github.com/adang1345/delvewheel"},{"name":"python-discovery","old_version":"1.6.1","new_version":"1.6.2","repository_url":"https://github.com/tox-dev/python-discovery"},{"name":"virtualenv","old_version":"21.14.6","new_version":"21.14.7","repository_url":"https://github.com/pypa/virtualenv"}],"path":null,"ecosystem":"pip"},"body":"[//]: # (dependabot-start)\n⚠️  **Dependabot is rebasing this PR** ⚠️ \n\nRebasing might not happen immediately, so don't worry if this takes some time.\n\nNote: if you make any changes to this PR yourself, they will take precedence over the rebase.\n\n---\n\n[//]: # (dependabot-end)\n\nBumps the python-wheel group with 7 updates in the /bindings/python directory:\n\n| Package | From | To |\n| --- | --- | --- |\n| [scikit-build-core](https://github.com/scikit-build/scikit-build-core) | `1.1.0` | `1.1.1` |\n| [filelock](https://github.com/tox-dev/py-filelock) | `3.32.7` | `4.1.1` |\n| [platformdirs](https://github.com/tox-dev/platformdirs) | `4.12.0` | `4.13.0` |\n| [mypy](https://github.com/python/mypy) | `2.3.1` | `2.4.0` |\n| [delvewheel](https://github.com/adang1345/delvewheel) | `1.13.1` | `1.13.2` |\n| [python-discovery](https://github.com/tox-dev/python-discovery) | `1.6.1` | `1.6.2` |\n| [virtualenv](https://github.com/pypa/virtualenv) | `21.14.6` | `21.14.7` |\n\n\nUpdates `scikit-build-core` from 1.1.0 to 1.1.1\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/scikit-build/scikit-build-core/releases\"\u003escikit-build-core's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003eVersion 1.1.1\u003c/h2\u003e\n\u003cp\u003eThis patch release improves performance and fixes two minor regressions from 1.1.0. Free-threaded builds work again on CMake versions between 3.30 and 4.1.2 (please update CMake to 4.1.2+, though). A checkout inside an ignored directory is again left out of the SDist. Wheel builds are also faster, especially on Windows, because package sources are no longer copied to a staging directory first.\u003c/p\u003e\n\u003cp\u003eFixes:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eOnly set \u003ccode\u003ePython_FIND_ABI\u003c/code\u003e for free-threaded builds on CMake 4.1.2+, since older versions fail to find \u003ccode\u003eDevelopment.Module\u003c/code\u003e when it is set (\u003ca href=\"https://redirect.github.com/scikit-build/scikit-build-core/issues/1597\"\u003e#1597\u003c/a\u003e) by \u003ca href=\"https://github.com/henryiii\"\u003e\u003ccode\u003e@​henryiii\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/scikit-build/scikit-build-core/issues/1598\"\u003e#1598\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eSDist: a repository boundary that the outer repository ignores is excluded with its full subtree (\u003ca href=\"https://redirect.github.com/scikit-build/scikit-build-core/issues/1593\"\u003e#1593\u003c/a\u003e) by \u003ca href=\"https://github.com/henryiii\"\u003e\u003ccode\u003e@​henryiii\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/scikit-build/scikit-build-core/issues/1594\"\u003e#1594\u003c/a\u003e. Also improves performance.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePerformance:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eWrite package sources directly to wheels without staging copies (\u003ca href=\"https://redirect.github.com/scikit-build/scikit-build-core/issues/1591\"\u003e#1591\u003c/a\u003e) by \u003ca href=\"https://github.com/sepcnt\"\u003e\u003ccode\u003e@​sepcnt\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/scikit-build/scikit-build-core/issues/1592\"\u003e#1592\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI and testing:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSuppress sphinx-llm unknown node warnings by \u003ca href=\"https://github.com/henryiii\"\u003e\u003ccode\u003e@​henryiii\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/scikit-build/scikit-build-core/issues/1595\"\u003e#1595\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUse CMake 4.2 on \u003ccode\u003ewindows-11-arm\u003c/code\u003e by \u003ca href=\"https://github.com/henryiii\"\u003e\u003ccode\u003e@​henryiii\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/scikit-build/scikit-build-core/issues/1590\"\u003e#1590\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/scikit-build/scikit-build-core/compare/v1.1.0...v1.1.1\"\u003ehttps://github.com/scikit-build/scikit-build-core/compare/v1.1.0...v1.1.1\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/scikit-build/scikit-build-core/commit/67040d09985ea5683038943676f31550b5f4faf5\"\u003e\u003ccode\u003e67040d0\u003c/code\u003e\u003c/a\u003e docs: changelog for 1.1.1 (\u003ca href=\"https://redirect.github.com/scikit-build/scikit-build-core/issues/1599\"\u003e#1599\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/scikit-build/scikit-build-core/commit/82de0b82faae0e9cc892b30e05e3e3046eb4b8db\"\u003e\u003ccode\u003e82de0b8\u003c/code\u003e\u003c/a\u003e fix: only set Python_FIND_ABI on CMake 4.1.2+ (\u003ca href=\"https://redirect.github.com/scikit-build/scikit-build-core/issues/1598\"\u003e#1598\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/scikit-build/scikit-build-core/commit/d5866917c0451579daa85be0925504095754a61c\"\u003e\u003ccode\u003ed586691\u003c/code\u003e\u003c/a\u003e fix(sdist): exclude subtree of an ignored repository boundary (\u003ca href=\"https://redirect.github.com/scikit-build/scikit-build-core/issues/1594\"\u003e#1594\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/scikit-build/scikit-build-core/commit/e750d347e460570f6d3e3edeb7b1911c7dfe4535\"\u003e\u003ccode\u003ee750d34\u003c/code\u003e\u003c/a\u003e perf: Write package sources directly to wheels without staging copies (\u003ca href=\"https://redirect.github.com/scikit-build/scikit-build-core/issues/1592\"\u003e#1592\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/scikit-build/scikit-build-core/commit/214286b131d4adc691c95a446f0c363594d3d68f\"\u003e\u003ccode\u003e214286b\u003c/code\u003e\u003c/a\u003e chore(deps): bump the github-actions group with 3 updates (\u003ca href=\"https://redirect.github.com/scikit-build/scikit-build-core/issues/1596\"\u003e#1596\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/scikit-build/scikit-build-core/commit/4b211804ac06f8c903494960dd86d4497ea0c035\"\u003e\u003ccode\u003e4b21180\u003c/code\u003e\u003c/a\u003e docs: suppress sphinx-llm unknown node warnings (\u003ca href=\"https://redirect.github.com/scikit-build/scikit-build-core/issues/1595\"\u003e#1595\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/scikit-build/scikit-build-core/commit/0f65cb1dc0796434e7ab379bf79a99a74c66966d\"\u003e\u003ccode\u003e0f65cb1\u003c/code\u003e\u003c/a\u003e ci: use CMake 4.2 on windows-11-arm (\u003ca href=\"https://redirect.github.com/scikit-build/scikit-build-core/issues/1590\"\u003e#1590\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/scikit-build/scikit-build-core/commit/b43c0e8a0f44d7d825a82193586fb1feea166ab7\"\u003e\u003ccode\u003eb43c0e8\u003c/code\u003e\u003c/a\u003e docs: changelog credit for \u003ca href=\"https://redirect.github.com/scikit-build/scikit-build-core/issues/1587\"\u003e#1587\u003c/a\u003e, regenerate for 1.1 (\u003ca href=\"https://redirect.github.com/scikit-build/scikit-build-core/issues/1589\"\u003e#1589\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/scikit-build/scikit-build-core/compare/v1.1.0...v1.1.1\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `filelock` from 3.32.7 to 4.1.1\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/py-filelock/releases\"\u003efilelock's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e4.1.1\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003efeat(python): default to Python 3.15 by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/816\"\u003etox-dev/filelock#816\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(rw): avoid macOS descriptor lookups by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/820\"\u003etox-dev/filelock#820\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(tests): bound concurrent lock progress by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/819\"\u003etox-dev/filelock#819\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003etest: make lock error checks deterministic by \u003ca href=\"https://github.com/adenzhou1350\"\u003e\u003ccode\u003e@​adenzhou1350\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/817\"\u003etox-dev/filelock#817\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(read-write): reject a hostile pid in _owner_is_gone by \u003ca href=\"https://github.com/dxbjavid\"\u003e\u003ccode\u003e@​dxbjavid\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/821\"\u003etox-dev/filelock#821\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/adenzhou1350\"\u003e\u003ccode\u003e@​adenzhou1350\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/817\"\u003etox-dev/filelock#817\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/tox-dev/filelock/compare/4.1.0...4.1.1\"\u003ehttps://github.com/tox-dev/filelock/compare/4.1.0...4.1.1\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e4.1.0\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eci: download coverage during tool setup by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/776\"\u003etox-dev/filelock#776\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(api): validate timeout and poll_interval bounds by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/781\"\u003etox-dev/filelock#781\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(read-write): accept inf and reject nan timeouts by \u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/779\"\u003etox-dev/filelock#779\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft-rw): ignore non-ASCII generation names by \u003ca href=\"https://github.com/dxbjavid\"\u003e\u003ccode\u003e@​dxbjavid\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/778\"\u003etox-dev/filelock#778\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): check start token in is_lock_held_by_us by \u003ca href=\"https://github.com/lprnmns\"\u003e\u003ccode\u003e@​lprnmns\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/774\"\u003etox-dev/filelock#774\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): clean up marker when rollback close fails by \u003ca href=\"https://github.com/harbinresearcher\"\u003e\u003ccode\u003e@​harbinresearcher\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/775\"\u003etox-dev/filelock#775\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(read-write): clamp waits to threading.TIMEOUT_MAX by \u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/780\"\u003etox-dev/filelock#780\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): treat truncated markers as malformed by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/782\"\u003etox-dev/filelock#782\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(acquire): keep every acquire wait within the timeout by \u003ca href=\"https://github.com/feiiiiii5\"\u003e\u003ccode\u003e@​feiiiiii5\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/777\"\u003etox-dev/filelock#777\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e📝 docs: fix hanging example and platform claims by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/783\"\u003etox-dev/filelock#783\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(unix): keep peer marker on ENOSYS fallback by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/785\"\u003etox-dev/filelock#785\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(async): clear the task hold after a canceled release by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/789\"\u003etox-dev/filelock#789\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e✨ feat(api): export lease types and has_fcntl by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/790\"\u003etox-dev/filelock#790\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(strict): age private records by the filesystem clock by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/792\"\u003etox-dev/filelock#792\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(async): surface executor shutdown as an error by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/793\"\u003etox-dev/filelock#793\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): expire leases on the contender's clock by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/796\"\u003etox-dev/filelock#796\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft-rw): stop an acquire that close() overtook by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/798\"\u003etox-dev/filelock#798\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(strict): record claims before linking them by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/787\"\u003etox-dev/filelock#787\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): restore a live marker a stale break moved aside by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/786\"\u003etox-dev/filelock#786\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(api): chain errors on 3.10 without exceptiongroup by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/788\"\u003etox-dev/filelock#788\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): release a dropped SoftFileLease by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/791\"\u003etox-dev/filelock#791\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(read-write): keep probe fds until the last connection closes by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/794\"\u003etox-dev/filelock#794\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e📦 build(sdist): ship docs and update SECURITY.md by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/812\"\u003etox-dev/filelock#812\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft-rw): survive a removed generation log by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/795\"\u003etox-dev/filelock#795\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): tell PID namespaces apart in the marker host by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/797\"\u003etox-dev/filelock#797\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(async): release from the finalizer and keep I/O off the loop by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/800\"\u003etox-dev/filelock#800\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(strict): name what blocks the lock path by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/804\"\u003etox-dev/filelock#804\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(read-write): reject WAL databases and link beside the db by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/805\"\u003etox-dev/filelock#805\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(read-write): track read depth per thread by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/806\"\u003etox-dev/filelock#806\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): honour mode and tighten marker grammar by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/807\"\u003etox-dev/filelock#807\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🧪 test: drop timing races from two runner-load flakes by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/809\"\u003etox-dev/filelock#809\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/filelock/blob/main/docs/changelog.rst\"\u003efilelock's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e###########\nChangelog\n###########\u003c/p\u003e\n\u003cp\u003e.. towncrier-draft-entries:: Unreleased\u003c/p\u003e\n\u003cp\u003e.. towncrier release notes start\u003c/p\u003e\n\u003chr /\u003e\n\u003cp\u003e4.2.0 (2026-10-14)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eimport filelock\u003c/code\u003e is about twice as fast: lock types other than :class:\u003ccode\u003e~filelock.FileLock\u003c/code\u003e load on first use. :pr:\u003ccode\u003e831\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eFix :class:\u003ccode\u003e~filelock.StrictSoftFileLock\u003c/code\u003e raising :class:\u003ccode\u003e~filelock.SoftFileLockProtocolError\u003c/code\u003e on Windows when a\ncontender read a claim whose owner was still finishing its unlink. :pr:\u003ccode\u003e829\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.1.2 (2026-10-14)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eFix read-lock acquisition on SQLite versions older than 3.33.0 by using \u003ccode\u003esqlite_master\u003c/code\u003e for the schema probe. :pr:\u003ccode\u003e770\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eRaise \u003ccode\u003eIsADirectoryError\u003c/code\u003e (or \u003ccode\u003ePermissionError\u003c/code\u003e on Windows) for a directory lock path regardless of its write\npermissions. :pr:\u003ccode\u003e822\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eFix a forked child hanging at exit on PyPy when the parent forked while an\n:class:\u003ccode\u003e~filelock.AsyncReadWriteLock\u003c/code\u003e worker thread was between two operations. :pr:\u003ccode\u003e828\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eHash all cache keys in the lock filename recipe so short path-like keys stay in the chosen directory. The example also\naccepts path-derived surrogate escapes and works before the cache directory exists. :pr:\u003ccode\u003e824\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.1.1 (2026-10-11)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eBound the shared-lock contention test by worker progress so slow CI machines can finish the workload. :pr:\u003ccode\u003e819\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eAvoid the macOS \u003ccode\u003e/dev/fd\u003c/code\u003e lookup implicated in a kernel panic by opening SQLite through a validated hard link.\nThe database directory must be writable and support hard links; alias creation failure raises \u003ccode\u003eOSError\u003c/code\u003e. :pr:\u003ccode\u003e820\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eIgnore non-ASCII PID or start-time fields and out-of-range PIDs in \u003ccode\u003eReadWriteLock\u003c/code\u003e hard-link directory names so forged\nowners cannot abort acquisition. :pr:\u003ccode\u003e821\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eUse Python 3.15 for development and automation. :pr:\u003ccode\u003e816\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.1.0 (2026-10-09)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eImport :data:\u003ccode\u003e~filelock.OwnerMode\u003c/code\u003e, :data:\u003ccode\u003e~filelock.CompromiseReason\u003c/code\u003e and :data:\u003ccode\u003e~filelock.has_fcntl\u003c/code\u003e from\n\u003ccode\u003efilelock\u003c/code\u003e. :pr:\u003ccode\u003e790\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:class:\u003ccode\u003e~filelock.AcquireReturnProxy\u003c/code\u003e is generic in the lock type, so \u003ccode\u003ewith lock.acquire() as held:\u003c/code\u003e types \u003ccode\u003eheld\u003c/code\u003e as\nthe lock's own class. :pr:\u003ccode\u003e803\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eA :class:\u003ccode\u003e~filelock.Timeout\u003c/code\u003e from a soft lock names a holder on another host or in another PID namespace, which no\ncontender ever reclaims. :pr:\u003ccode\u003e815\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:attr:\u003ccode\u003e~filelock.SoftFileLock.is_lock_held_by_us\u003c/code\u003e and :attr:\u003ccode\u003e~filelock.MarkerSoftFileLock.is_lock_held_by_us\u003c/code\u003e return\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/5830a7e2c39d387ae5320bb3be1fbb2aa7742d4a\"\u003e\u003ccode\u003e5830a7e\u003c/code\u003e\u003c/a\u003e Release 4.1.1\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/a5fb607a8655035bb6d5ae4326637e25cf1af849\"\u003e\u003ccode\u003ea5fb607\u003c/code\u003e\u003c/a\u003e fix(read-write): reject a hostile pid in _owner_is_gone (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/821\"\u003e#821\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/4c6f32f2797b2883bbcb0cca1ee81211d3e09c12\"\u003e\u003ccode\u003e4c6f32f\u003c/code\u003e\u003c/a\u003e test: make lock error checks deterministic (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/817\"\u003e#817\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/f11f52357425943a6dbffd36ea1112726255f970\"\u003e\u003ccode\u003ef11f523\u003c/code\u003e\u003c/a\u003e fix(tests): bound concurrent lock progress (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/819\"\u003e#819\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/5fd0c8f2e6a778da1933204e4a95bd84db9cdd43\"\u003e\u003ccode\u003e5fd0c8f\u003c/code\u003e\u003c/a\u003e fix(rw): avoid macOS descriptor lookups (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/820\"\u003e#820\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/0c3aaabc75ca927b2530b7264a04b965d64acf55\"\u003e\u003ccode\u003e0c3aaab\u003c/code\u003e\u003c/a\u003e feat(python): default to Python 3.15 (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/816\"\u003e#816\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/6c0ecc28f898f08cd0438cd489c3eaabad79a4b7\"\u003e\u003ccode\u003e6c0ecc2\u003c/code\u003e\u003c/a\u003e Release 4.1.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/df06bbd640765ad3f1ed4a096cbe29e64b5592bb\"\u003e\u003ccode\u003edf06bbd\u003c/code\u003e\u003c/a\u003e 🐛 fix: close regressions since 4.0.12 (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/815\"\u003e#815\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/071204515d211b560d203cb68105ec06789eab46\"\u003e\u003ccode\u003e0712045\u003c/code\u003e\u003c/a\u003e 🐛 fix(read-write): refuse a database moved mid-acquire (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/808\"\u003e#808\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/73fefc1e907457dd9bc9793eeba52f183d7f9c40\"\u003e\u003ccode\u003e73fefc1\u003c/code\u003e\u003c/a\u003e 📝 docs: point canonical and og:url at versioned pages (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/813\"\u003e#813\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/tox-dev/py-filelock/compare/3.32.7...4.1.1\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `platformdirs` from 4.12.0 to 4.13.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/platformdirs/releases\"\u003eplatformdirs's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e4.13.0\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003efix: recognize Homebrew Cellar framework prefixes by \u003ca href=\"https://github.com/sricharanreddycheruku\"\u003e\u003ccode\u003e@​sricharanreddycheruku\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/612\"\u003etox-dev/platformdirs#612\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat(python): require 3.11 and default to 3.15 by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/613\"\u003etox-dev/platformdirs#613\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/sricharanreddycheruku\"\u003e\u003ccode\u003e@​sricharanreddycheruku\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/612\"\u003etox-dev/platformdirs#612\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/tox-dev/platformdirs/compare/4.12.4...4.13.0\"\u003ehttps://github.com/tox-dev/platformdirs/compare/4.12.4...4.13.0\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e4.12.4\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eci: download coverage during tool setup by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/609\"\u003etox-dev/platformdirs#609\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(api): keep root's site dir readable in place_*_file by \u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/610\"\u003etox-dev/platformdirs#610\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix: fall back from unreachable runtime directory with ensure_exists by \u003ca href=\"https://github.com/harbinresearcher\"\u003e\u003ccode\u003e@​harbinresearcher\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/611\"\u003etox-dev/platformdirs#611\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/harbinresearcher\"\u003e\u003ccode\u003e@​harbinresearcher\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/611\"\u003etox-dev/platformdirs#611\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/tox-dev/platformdirs/compare/4.12.3...4.12.4\"\u003ehttps://github.com/tox-dev/platformdirs/compare/4.12.3...4.12.4\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e4.12.3\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003ePlace root config and data files in the first site directory by \u003ca href=\"https://github.com/PDGGK\"\u003e\u003ccode\u003e@​PDGGK\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/607\"\u003etox-dev/platformdirs#607\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/PDGGK\"\u003e\u003ccode\u003e@​PDGGK\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/607\"\u003etox-dev/platformdirs#607\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/tox-dev/platformdirs/compare/4.12.2...4.12.3\"\u003ehttps://github.com/tox-dev/platformdirs/compare/4.12.2...4.12.3\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e4.12.2\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e🐛 fix(api): build site paths from site lists by \u003ca href=\"https://github.com/9Kun\"\u003e\u003ccode\u003e@​9Kun\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/604\"\u003etox-dev/platformdirs#604\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e♻️ refactor(api): share use_site iteration by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/606\"\u003etox-dev/platformdirs#606\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/9Kun\"\u003e\u003ccode\u003e@​9Kun\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/604\"\u003etox-dev/platformdirs#604\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/tox-dev/platformdirs/compare/4.12.1...4.12.2\"\u003ehttps://github.com/tox-dev/platformdirs/compare/4.12.1...4.12.2\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e4.12.1\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/platformdirs/blob/main/docs/changelog.rst\"\u003eplatformdirs's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e###########\nChangelog\n###########\u003c/p\u003e\n\u003cp\u003e.. towncrier-draft-entries:: Unreleased\u003c/p\u003e\n\u003cp\u003e.. towncrier release notes start\u003c/p\u003e\n\u003chr /\u003e\n\u003cp\u003e4.13.3 (2026-10-16)\u003c/p\u003e\n\u003chr /\u003e\n\u003chr /\u003e\n\u003cp\u003e4.13.2 (2026-10-16)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eNormalize \u003ccode\u003euser_fonts_dir\u003c/code\u003e when \u003ccode\u003eXDG_DATA_HOME\u003c/code\u003e ends with a separator. :pr:\u003ccode\u003e619\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.13.1 (2026-10-15)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eFree the path buffer from \u003ccode\u003eSHGetKnownFolderPath\u003c/code\u003e when the known-folder lookup fails. :pr:\u003ccode\u003e618\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003ePreserve literal backslashes before ordinary characters in double-quoted \u003ccode\u003euser-dirs.dirs\u003c/code\u003e paths instead of removing\nthem.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.13.0 (2026-10-10)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eDetect Homebrew Python for the :class:\u003ccode\u003e~platformdirs.macos.MacOS\u003c/code\u003e site directories under :option:\u003ccode\u003epython:-S\u003c/code\u003e, which\nleaves :data:\u003ccode\u003esys.base_prefix\u003c/code\u003e on the \u003ccode\u003eCellar\u003c/code\u003e keg, and for the \u003ccode\u003epython-freethreading\u003c/code\u003e formula - by\n:user:\u003ccode\u003esricharanreddycheruku\u003c/code\u003e. :pr:\u003ccode\u003e612\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eUse Python 3.15 for development and automation. :pr:\u003ccode\u003e613\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.12.4 (2026-10-07)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eKeep site directories readable by other users when root calls\n:meth:\u003ccode\u003e~platformdirs.api.PlatformDirsABC.place_config_file\u003c/code\u003e or another \u003ccode\u003eplace_*_file\u003c/code\u003e method with\n:attr:\u003ccode\u003e~platformdirs.api.PlatformDirsABC.use_site_for_root\u003c/code\u003e - by :user:\u003ccode\u003edarrenhuai\u003c/code\u003e. :pr:\u003ccode\u003e610\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eMake :func:\u003ccode\u003e~platformdirs.user_runtime_dir\u003c/code\u003e warn and fall back from an unreachable \u003ccode\u003eXDG_RUNTIME_DIR\u003c/code\u003e under\n:attr:\u003ccode\u003e~platformdirs.api.PlatformDirsABC.ensure_exists\u003c/code\u003e instead of raising. :pr:\u003ccode\u003e611\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.12.3 (2026-10-03)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003ePlace files from \u003ccode\u003eplace_config_file\u003c/code\u003e and \u003ccode\u003eplace_data_file\u003c/code\u003e in the first site directory for root on Unix with\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/f05fb4ef31f38dfc316802c5301db972fd75468e\"\u003e\u003ccode\u003ef05fb4e\u003c/code\u003e\u003c/a\u003e Release 4.13.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/b3174fdd4e80c83d72cf723fd2a7bb6cb54cbd5f\"\u003e\u003ccode\u003eb3174fd\u003c/code\u003e\u003c/a\u003e feat(python): require 3.11 and default to 3.15 (\u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/issues/613\"\u003e#613\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/d7eb4fe34231df80a6b1c7abc362aa504feddbf1\"\u003e\u003ccode\u003ed7eb4fe\u003c/code\u003e\u003c/a\u003e fix: recognize Homebrew Cellar framework prefixes (\u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/issues/612\"\u003e#612\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/19338a4fdfc0cdd6b5342ec137efd9e5613d67d2\"\u003e\u003ccode\u003e19338a4\u003c/code\u003e\u003c/a\u003e Release 4.12.4\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/f2a4fa944f3637c8e7aa1fe8e95c9adfefe8ed2c\"\u003e\u003ccode\u003ef2a4fa9\u003c/code\u003e\u003c/a\u003e fix: fall back from unreachable runtime directory with ensure_exists (\u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/issues/611\"\u003e#611\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/16429e2135fa70b314ef69fa7da4d5e746eb75c9\"\u003e\u003ccode\u003e16429e2\u003c/code\u003e\u003c/a\u003e 🐛 fix(api): keep root's site dir readable in place_*_file (\u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/issues/610\"\u003e#610\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/b9735d3c9f4a0b5ca4dafc15b53541fe3973f453\"\u003e\u003ccode\u003eb9735d3\u003c/code\u003e\u003c/a\u003e ci: download coverage during tool setup (\u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/issues/609\"\u003e#609\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/344f2497bce1fba7838ef112f2bd91e9d5f23b58\"\u003e\u003ccode\u003e344f249\u003c/code\u003e\u003c/a\u003e [pre-commit.ci] pre-commit autoupdate (\u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/issues/608\"\u003e#608\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/960ff632eb575deb6f0d5bf49519d5a2ee2098b6\"\u003e\u003ccode\u003e960ff63\u003c/code\u003e\u003c/a\u003e Release 4.12.3\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/8047ad5bf0e5fd3db9c8ce9f250f73c3d961fe19\"\u003e\u003ccode\u003e8047ad5\u003c/code\u003e\u003c/a\u003e Place root config and data files in the first site directory (\u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/issues/607\"\u003e#607\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/tox-dev/platformdirs/compare/4.12.0...4.13.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `mypy` from 2.3.1 to 2.4.0\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/python/mypy/blob/master/CHANGELOG.md\"\u003emypy's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003eMypy Release Notes\u003c/h1\u003e\n\u003ch2\u003eNext Release\u003c/h2\u003e\n\u003ch2\u003eMypy 2.4\u003c/h2\u003e\n\u003cp\u003eWe've just uploaded mypy 2.4.0 to the Python Package Index (\u003ca href=\"https://pypi.org/project/mypy/\"\u003ePyPI\u003c/a\u003e).\nMypy is a static type checker for Python. This release includes new features, performance\nimprovements and bug fixes. You can install it as follows:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003epython3 -m pip install -U mypy\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eYou can read the full documentation for this release on \u003ca href=\"http://mypy.readthedocs.io\"\u003eRead the Docs\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003ePython 3.15 Support\u003c/h3\u003e\n\u003cp\u003eMypy 2.4 supports running on Python 3.15 and type checking most Python\n3.15 features. This includes the new builtin \u003ccode\u003esentinel\u003c/code\u003e type for\nsentinel values (PEP 661), which mypy now supports (see below for\ndetails). Lazy imports (PEP 810) and unpacking in comprehensions\n(PEP 798) are also supported. Closed TypedDicts (PEP 728) have been\nsupported since mypy 2.2, but the \u003ccode\u003eextra_items\u003c/code\u003e TypedDict argument,\nalso introduced in PEP 728, is still unsupported. Support for\n\u003ccode\u003eextra_items\u003c/code\u003e will be added in a future mypy release.\u003c/p\u003e\n\u003ch3\u003eNative Parser Enabled by Default\u003c/h3\u003e\n\u003cp\u003eMypy now uses the new native parser by default. It's based on the Ruff\nparser, and it's significantly faster than the legacy parser, which\nuses the stdlib \u003ccode\u003east\u003c/code\u003e module. The native parser also has other\nbenefits:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eYou can target newer Python versions and use recent Python syntax\neven when running mypy on an older Python version. For example, you\ncan use \u003ccode\u003e--python-version 3.15\u003c/code\u003e when running mypy on Python 3.14.\u003c/li\u003e\n\u003cli\u003eStub files can use syntax that is newer than the target Python\nversion. For example, stubs can use the PEP 695 generic class syntax\n(\u003ccode\u003eclass Box[T]: ...\u003c/code\u003e) when running on or targeting Python 3.10.\u003c/li\u003e\n\u003cli\u003eParallel type checking requires the native parser.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe legacy parser is still available through \u003ccode\u003e--no-native-parser\u003c/code\u003e, or\n\u003ccode\u003enative_parser = False\u003c/code\u003e in the config file (\u003ccode\u003enative_parser = false\u003c/code\u003e\nunder \u003ccode\u003e[tool.mypy]\u003c/code\u003e in pyproject.toml). We are planning to remove the\nlegacy parser in early 2027. If you run into a problem with the native\nparser, please report it on the\n\u003ca href=\"https://github.com/python/mypy/issues\"\u003eissue tracker\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eUnlike the legacy parser, the native parser doesn't support type\ncomments for variables defined by \u003ccode\u003efor\u003c/code\u003e and \u003ccode\u003ewith\u003c/code\u003e statements. These\ntype comments are silently ignored, and the types of the variables are\u003c/p\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/935ba8afba7ceacca0651579450c74339f343016\"\u003e\u003ccode\u003e935ba8a\u003c/code\u003e\u003c/a\u003e Bump version to 2.4.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/334a678967dc6bcda3d3f8cb82e253dd61fa2be9\"\u003e\u003ccode\u003e334a678\u003c/code\u003e\u003c/a\u003e Add link for PR 22066 in mypy 2.4 changelog (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22082\"\u003e#22082\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/fe69660bcdaa76cccb1aedbb4b9c1c7627215571\"\u003e\u003ccode\u003efe69660\u003c/code\u003e\u003c/a\u003e Finalize mypy 2.4 changelog (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22080\"\u003e#22080\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/541fd87ac53581fb3c511b277fd780ec4e869c95\"\u003e\u003ccode\u003e541fd87\u003c/code\u003e\u003c/a\u003e Various mypy 2.4 changelog updates (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22077\"\u003e#22077\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/b231182c0b2993918f74594236bda7d3ec6fcbe5\"\u003e\u003ccode\u003eb231182\u003c/code\u003e\u003c/a\u003e Update native parser docs (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22078\"\u003e#22078\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/04fe42ce217f120a4de2c1fd62b71ef77452d699\"\u003e\u003ccode\u003e04fe42c\u003c/code\u003e\u003c/a\u003e Initial Changelog for Mypy 2.4 (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22071\"\u003e#22071\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/06174941bca0e88567441ee3cb0ffaef0dd22e2c\"\u003e\u003ccode\u003e0617494\u003c/code\u003e\u003c/a\u003e Quick fix for non UTF-8 encodings with new parser (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22066\"\u003e#22066\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/b2f9b60eae5ac7cd9c6a60650b128815bb703daf\"\u003e\u003ccode\u003eb2f9b60\u003c/code\u003e\u003c/a\u003e Bump librt to 0.16.0 (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22067\"\u003e#22067\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/9d798dcb9589f9bd62e625a97d8db23ad9a678fa\"\u003e\u003ccode\u003e9d798dc\u003c/code\u003e\u003c/a\u003e Sync typeshed (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22054\"\u003e#22054\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/0861bb6450d6d3658e44dbca9cd2ba478faf3c1d\"\u003e\u003ccode\u003e0861bb6\u003c/code\u003e\u003c/a\u003e Reduce max protocol stack size to 20 (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22053\"\u003e#22053\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/python/mypy/compare/v2.3.1...v2.4.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `delvewheel` from 1.13.1 to 1.13.2\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/adang1345/delvewheel/blob/master/CHANGELOG.md\"\u003edelvewheel's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e1.13.2 \u003c!-- raw HTML omitted --\u003e\u003c!-- raw HTML omitted --\u003e(\u003cem\u003e9 October 2026\u003c/em\u003e)\u003c!-- raw HTML omitted --\u003e\u003c!-- raw HTML omitted --\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eWrite wheel metadata files in UTF-8 regardless of locale.\u003c/li\u003e\n\u003cli\u003eAdd Python 3.15 to trove classifiers.\u003c/li\u003e\n\u003cli\u003eUpdate GitHub Actions.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/adang1345/delvewheel/commits\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `python-discovery` from 1.6.1 to 1.6.2\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/python-discovery/releases\"\u003epython-discovery's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev1.6.2\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003efix: ignore broken sphinx-llm release by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/pull/134\"\u003etox-dev/python-discovery#134\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e👷 ci: pin ubuntu-26.04 and bump dependencies by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/pull/138\"\u003etox-dev/python-discovery#138\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eci: run old Python checks in parallel by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/pull/140\"\u003etox-dev/python-discovery#140\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat(python): default to 3.15 and match virtualenv by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/pull/142\"\u003etox-dev/python-discovery#142\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(cache): discard unusable interpreter cache entries by \u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/pull/141\"\u003etox-dev/python-discovery#141\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(query): validate PY_DISCOVERY_TIMEOUT by \u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/pull/143\"\u003etox-dev/python-discovery#143\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/pull/141\"\u003etox-dev/python-discovery#141\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/tox-dev/python-discovery/compare/1.6.1...1.6.2\"\u003ehttps://github.com/tox-dev/python-discovery/compare/1.6.1...1.6.2\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/python-discovery/blob/main/docs/changelog.rst\"\u003epython-discovery's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003eBug fixes - 1.6.2\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eDiscard malformed interpreter cache entries and query the interpreter again, including entries with missing,\nnon-string or unusable \u003ccode\u003esystem_executable\u003c/code\u003e paths - by :user:\u003ccode\u003edarrenhuai\u003c/code\u003e. (:issue:\u003ccode\u003e141\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eUse the default interpreter query timeout and warn for invalid \u003ccode\u003ePY_DISCOVERY_TIMEOUT\u003c/code\u003e values. Accept \u003ccode\u003einf\u003c/code\u003e\nor values above the subprocess wait limit to disable the timeout - by :user:\u003ccode\u003edarrenhuai\u003c/code\u003e. (:issue:\u003ccode\u003e143\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003ev1.6.1 (2026-09-18)\u003c/p\u003e\n\u003chr /\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/4fe2ade736e5191de42ca3d4a0b8bf672ffc5652\"\u003e\u003ccode\u003e4fe2ade\u003c/code\u003e\u003c/a\u003e release 1.6.2\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/60ddef109aafdd6d54aa25c8057a569c76e3dba2\"\u003e\u003ccode\u003e60ddef1\u003c/code\u003e\u003c/a\u003e fix(query): validate PY_DISCOVERY_TIMEOUT (\u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/issues/143\"\u003e#143\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/eb1eab726924245c533ad867d1b4bcc4c47b6d2a\"\u003e\u003ccode\u003eeb1eab7\u003c/code\u003e\u003c/a\u003e fix(cache): discard unusable interpreter cache entries (\u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/issues/141\"\u003e#141\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/db810b8206339892c0cd15f000b8e18860a8b913\"\u003e\u003ccode\u003edb810b8\u003c/code\u003e\u003c/a\u003e feat(python): default to 3.15 and match virtualenv (\u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/issues/142\"\u003e#142\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/614afa4adaa5fb36daf38919e3c407af71f3260b\"\u003e\u003ccode\u003e614afa4\u003c/code\u003e\u003c/a\u003e ci: run old Python checks in parallel (\u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/issues/140\"\u003e#140\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/9148aa454b276b5745d56bb2a42bdc8f26ee7f55\"\u003e\u003ccode\u003e9148aa4\u003c/code\u003e\u003c/a\u003e [pre-commit.ci] pre-commit autoupdate (\u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/issues/139\"\u003e#139\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/a69c0d9139ff0f1276d318d75d25d59cbc172bf4\"\u003e\u003ccode\u003ea69c0d9\u003c/code\u003e\u003c/a\u003e 👷 ci: pin ubuntu-26.04 and bump dependencies (\u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/issues/138\"\u003e#138\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/c8fcbf599ac401c8b1ad793187b28e45ccd1ffc8\"\u003e\u003ccode\u003ec8fcbf5\u003c/code\u003e\u003c/a\u003e build(deps): bump astral-sh/setup-uv from 10.1.0 to 10.2.0 in the github-acti...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/f0b3a2030c57a4f9217cd6ab09f837123ad0bc17\"\u003e\u003ccode\u003ef0b3a20\u003c/code\u003e\u003c/a\u003e [pre-commit.ci] pre-commit autoupdate (\u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/issues/136\"\u003e#136\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/b4eea32e584c0c1f08c9ad4b9f5850cb8c2275da\"\u003e\u003ccode\u003eb4eea32\u003c/code\u003e\u003c/a\u003e build(deps): bump astral-sh/setup-uv from 10.0.1 to 10.1.0 in the github-acti...\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/tox-dev/python-discovery/compare/1.6.1...1.6.2\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `virtualenv` from 21.14.6 to 21.14.7\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pypa/virtualenv/releases\"\u003evirtualenv's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e21.14.7\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eUpgrade embedded pip/setuptools/wheel and CI test tools by \u003ca href=\"https://github.com/github-actions\"\u003e\u003ccode\u003e@​github-actions\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3385\"\u003epypa/virtualenv#3385\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🧪 test(seed): verify periodic update scheduling by \u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3384\"\u003epypa/virtualenv#3384\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat(python): default to Python 3.15 by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3386\"\u003epypa/virtualenv#3386\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🔧 chore: enroll in Anthropic OSS Scanner by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3387\"\u003epypa/virtualenv#3387\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🧪 test(util): skip safe_delete permission tests as root by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3389\"\u003epypa/virtualenv#3389\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e📝 docs(security): add an email reporting contact by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3388\"\u003epypa/virtualenv#3388\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(activation): escape the bash prompt for both PS1 passes by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3390\"\u003epypa/virtualenv#3390\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🧪 test(activation): undo both bash prompt passes on bash \u0026lt; 4.4 by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3392\"\u003epypa/virtualenv#3392\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🔧 build(release): bump pydantic for 3.15 wheels by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3391\"\u003epypa/virtualenv#3391\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.14.6...21.14.7\"\u003ehttps://github.com/pypa/virtualenv/compare/21.14.6...21.14.7\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pypa/virtualenv/blob/main/docs/changelog.rst\"\u003evirtualenv's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003eBugfixes - 21.14.7\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eEscape the environment name in the bash activator for both of bash's \u003ccode\u003ePS1\u003c/code\u003e passes, so a name or \u003ccode\u003e--prompt\u003c/code\u003e value\nwith a backslash before \u003ccode\u003e$(...)\u003c/code\u003e or backticks no longer runs as a command each time bash draws the prompt - by\n:user:\u003ccode\u003egaborbernat\u003c/code\u003e. (:issue:\u003ccode\u003e3390\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003ev21.14.6 (2026-10-08)\u003c/p\u003e\n\u003chr /\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/a857a7823c73c35935d0318b4f36e5d582691e1c\"\u003e\u003ccode\u003ea857a78\u003c/code\u003e\u003c/a\u003e release 21.14.7\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/4004d884fa22a4fe30fd9f1d8336eec52a796730\"\u003e\u003ccode\u003e4004d88\u003c/code\u003e\u003c/a\u003e 🔧 build(release): bump pydantic for 3.15 wheels (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3391\"\u003e#3391\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/212f69fb905371aed4d67fcb2ac194492f417d5b\"\u003e\u003ccode\u003e212f69f\u003c/code\u003e\u003c/a\u003e 🧪 test(activation): undo both bash prompt passes on bash \u0026lt; 4.4 (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3392\"\u003e#3392\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/c3104e02474b652832a9bbaae79f6e1696296932\"\u003e\u003ccode\u003ec3104e0\u003c/code\u003e\u003c/a\u003e 🐛 fix(activation): escape the bash prompt for both PS1 passes (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3390\"\u003e#3390\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/f29efc45c063e08e02527d211c41b24a3eefe0d3\"\u003e\u003ccode\u003ef29efc4\u003c/code\u003e\u003c/a\u003e 📝 docs(security): add an email reporting contact (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3388\"\u003e#3388\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/c26cc297e2291f76a72a925fa83100f827c5c8eb\"\u003e\u003ccode\u003ec26cc29\u003c/code\u003e\u003c/a\u003e 🧪 test(util): skip safe_delete permission tests as root (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3389\"\u003e#3389\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/8b21c36b4c56bd3bea41171fa513289c503efd97\"\u003e\u003ccode\u003e8b21c36\u003c/code\u003e\u003c/a\u003e 🔧 chore: enroll in Anthropic OSS Scanner (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3387\"\u003e#3387\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/bf09c7eb62246c19c2cfd0a179c5edcc14801397\"\u003e\u003ccode\u003ebf09c7e\u003c/code\u003e\u003c/a\u003e feat(python): default to Python 3.15 (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3386\"\u003e#3386\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/3f077928210afa4ec2cca456f4c587460b40bfc5\"\u003e\u003ccode\u003e3f07792\u003c/code\u003e\u003c/a\u003e 🧪 test(seed): verify periodic update scheduling (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3384\"\u003e#3384\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/7614b02375239b36090a53ce0f52a7086fbb6766\"\u003e\u003ccode\u003e7614b02\u003c/code\u003e\u003c/a\u003e Upgrade embedded pip/setuptools/wheel and CI test tools (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3385\"\u003e#3385\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.14.6...21.14.7\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore \u003cdependency name\u003e major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself)\n- `@dependabot ignore \u003cdependency name\u003e minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself)\n- `@dependabot ignore \u003cdependency name\u003e` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself)\n- `@dependabot unignore \u003cdependency name\u003e` will remove all of the ignore conditions of the specified dependency\n- `@dependabot unignore \u003cdependency name\u003e \u003cignore condition\u003e` will remove the ignore condition of the specified dependency and ignore conditions\n\n\n\u003c/details\u003e","html_url":"https://github.com/0xf3cd/celestial-calendar/pull/340","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/0xf3cd%2Fcelestial-calendar/issues/340","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/340/packages"},{"uuid":"5860418779","node_id":"PR_kwDOC9SUl88AAAABIi71KQ","number":182,"state":"open","title":"build(deps-dev): bump virtualenv from 21.11.1 to 21.12.0","user":"dependabot[bot]","labels":["dependencies","python"],"assignees":[],"locked":false,"comments_count":1,"pull_request":true,"closed_at":null,"author_association":null,"state_reason":null,"created_at":"2026-10-15T05:02:48.000Z","updated_at":"2026-10-15T05:03:17.000Z","time_to_close":null,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"build(deps-dev)","packages":[{"name":"virtualenv","old_version":"21.11.1","new_version":"21.12.0","repository_url":"https://github.com/pypa/virtualenv"}],"path":null,"ecosystem":"pip"},"body":"Bumps [virtualenv](https://github.com/pypa/virtualenv) from 21.11.1 to 21.12.0.\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pypa/virtualenv/releases\"\u003evirtualenv's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e21.12.0\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e✨ feat(create): point a .venv redirect per PEP 832 by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3204\"\u003epypa/virtualenv#3204\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.11.1...21.12.0\"\u003ehttps://github.com/pypa/virtualenv/compare/21.11.1...21.12.0\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pypa/virtualenv/blob/main/docs/changelog.rst\"\u003evirtualenv's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003eFeatures - 21.12.0\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eWrite the \u003ccode\u003ePEP 838 \u0026lt;https://peps.python.org/pep-0838/\u0026gt;\u003c/code\u003e_ \u003ccode\u003epython-version\u003c/code\u003e key into \u003ccode\u003epyvenv.cfg\u003c/code\u003e, holding the\ntarget interpreter's feature release. The new :doc:\u003ccode\u003ereference/files\u003c/code\u003e page covers it alongside every other file a\ncreated environment holds - by :user:\u003ccode\u003ekonstin\u003c/code\u003e. (:issue:\u003ccode\u003e3193\u003c/code\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ePoint a \u003ccode\u003e.venv\u003c/code\u003e redirect file in the parent folder at the created environment, per \u003ccode\u003ePEP 832 \u0026lt;https://peps.python.org/pep-0832/\u0026gt;\u003c/code\u003e_, so editors and type checkers can find it - by :user:\u003ccode\u003egaborbernat\u003c/code\u003e.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003evirtualenv leaves a \u003ccode\u003e.venv\u003c/code\u003e folder alone, and a redirect pointing at an environment it did not create.\u003c/li\u003e\n\u003cli\u003ePass \u003ccode\u003e--no-venv-redirect\u003c/code\u003e to opt out.\u003c/li\u003e\n\u003cli\u003eThe feature is provisional while PEP 832 is a draft: a minor or patch release may change it in backward incompatible\nways to follow the PEP. (:issue:\u003ccode\u003e3204\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003ev21.11.1 (2026-09-23)\u003c/p\u003e\n\u003chr /\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/f19165be525a9f4e7d4ccf374bfb47090ee4a397\"\u003e\u003ccode\u003ef19165b\u003c/code\u003e\u003c/a\u003e release 21.12.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/554bc8f65c3dc1eeca4aaa7150fa00f670818a30\"\u003e\u003ccode\u003e554bc8f\u003c/code\u003e\u003c/a\u003e ✨ feat(create): point a .venv redirect per PEP 832 (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3204\"\u003e#3204\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.11.1...21.12.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=virtualenv\u0026package-manager=pip\u0026previous-version=21.11.1\u0026new-version=21.12.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n\n\n\u003c/details\u003e","html_url":"https://github.com/Senzing/mapper-icij/pull/182","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/Senzing%2Fmapper-icij/issues/182","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/182/packages"},{"uuid":"5860208807","node_id":"PR_kwDORgfIwM8AAAABIixIDw","number":224,"state":"open","title":"build(deps): bump the other group across 1 directory with 6 updates","user":"dependabot[bot]","labels":["dependencies","python"],"assignees":["aisecnomad"],"locked":false,"comments_count":1,"pull_request":true,"closed_at":null,"author_association":null,"state_reason":null,"created_at":"2026-10-15T04:41:42.000Z","updated_at":"2026-10-15T04:51:12.000Z","time_to_close":null,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"build(deps): bump","group_name":"other","update_count":6,"packages":[{"name":"hypothesis","old_version":"6.168.5","new_version":"6.169.0","repository_url":"https://github.com/HypothesisWorks/hypothesis"},{"name":"filelock","old_version":"4.0.12","new_version":"4.1.1","repository_url":"https://github.com/tox-dev/py-filelock"},{"name":"platformdirs","old_version":"4.12.4","new_version":"4.13.0","repository_url":"https://github.com/tox-dev/platformdirs"},{"name":"python-discovery","old_version":"1.6.1","new_version":"1.6.2","repository_url":"https://github.com/tox-dev/python-discovery"},{"name":"virtualenv","old_version":"21.14.6","new_version":"21.14.7","repository_url":"https://github.com/pypa/virtualenv"}],"path":null,"ecosystem":"pip"},"body":"Updates the requirements on [hypothesis](https://github.com/HypothesisWorks/hypothesis), [mkdocstrings](https://github.com/mkdocstrings/mkdocstrings), [filelock](https://github.com/tox-dev/py-filelock), [platformdirs](https://github.com/tox-dev/platformdirs), [python-discovery](https://github.com/tox-dev/python-discovery) and [virtualenv](https://github.com/pypa/virtualenv) to permit the latest version.\nUpdates `hypothesis` from 6.168.5 to 6.169.0\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/82fa40ada6bc83480a746890a40bb3d708ba8f03\"\u003e\u003ccode\u003e82fa40a\u003c/code\u003e\u003c/a\u003e Bump hypothesis version to 6.169.0 and update changelog\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/0116655b33188ec4f32c80e43b2da34afd3deceb\"\u003e\u003ccode\u003e0116655\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/HypothesisWorks/hypothesis/issues/4899\"\u003e#4899\u003c/a\u003e from Arjun-Aravind/fix/uv-download-metadata-url\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/4f7ef96b165569427553bbb9303abcdf15fad227\"\u003e\u003ccode\u003e4f7ef96\u003c/code\u003e\u003c/a\u003e claude: exclude rarely-hit realize branch from coverage\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/4d42db9a0a15a6dbf6820c09b2208cde56adea81\"\u003e\u003ccode\u003e4d42db9\u003c/code\u003e\u003c/a\u003e Update uv download-metadata URL\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/1484f6dd4c0a220f68e2698afed29e2a16a3f654\"\u003e\u003ccode\u003e1484f6d\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/HypothesisWorks/hypothesis/issues/4896\"\u003e#4896\u003c/a\u003e from Liam-DeVoe/drop-python-3.10\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/e3e5fea000e2ad0032332a51cc4f2b462eafb31f\"\u003e\u003ccode\u003ee3e5fea\u003c/code\u003e\u003c/a\u003e claude: address review comments\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/7c22da6b40925beedc9f38f88d00e36c8a4da7a2\"\u003e\u003ccode\u003e7c22da6\u003c/code\u003e\u003c/a\u003e claude: simplify add_note fallback\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/f6a8067cecc738cadb52f5d3f9e75cc93f8aff9f\"\u003e\u003ccode\u003ef6a8067\u003c/code\u003e\u003c/a\u003e claude: check ghostwriter golden outputs on 3.11 instead of 3.10\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/2416a79271cf101c0290a583392d2429765012a5\"\u003e\u003ccode\u003e2416a79\u003c/code\u003e\u003c/a\u003e Merge remote-tracking branch 'upstream/master' into plait/worktop-270d0237\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/b4c5a08fb84f76b2ef7da80730aef30c96ae45ee\"\u003e\u003ccode\u003eb4c5a08\u003c/code\u003e\u003c/a\u003e claude: drop support for Python 3.10\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/HypothesisWorks/hypothesis/compare/v6.168.5...v6.169.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `mkdocstrings` to 1.0.7\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/releases\"\u003emkdocstrings's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e1.0.7\u003c/h2\u003e\n\u003ch2\u003e\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/releases/tag/1.0.7\"\u003e1.0.7\u003c/a\u003e - 2026-10-10\u003c/h2\u003e\n\u003cp\u003e\u003c!-- raw HTML omitted --\u003e\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/compare/1.0.6...1.0.7\"\u003eCompare with 1.0.6\u003c/a\u003e\u003c!-- raw HTML omitted --\u003e\u003c/p\u003e\n\u003ch3\u003eBuild\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eDrop support for Python 3.10 (\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/commit/2c2cbb19d0fdab8554f93fe2fb1568ffba8c0f5d\"\u003e2c2cbb1\u003c/a\u003e by Timothée Mazzucotelli).\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eBug Fixes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eSupport pymdownx 12.2 (\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/commit/ff510f27eb514dd2e46fa213365475d6fa0c4c9e\"\u003eff510f2\u003c/a\u003e by Timothée Mazzucotelli). \u003ca href=\"https://redirect.github.com/mkdocstrings/mkdocstrings/issues/829\"\u003eIssue-829\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/blob/main/CHANGELOG.md\"\u003emkdocstrings's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/releases/tag/1.0.7\"\u003e1.0.7\u003c/a\u003e - 2026-10-10\u003c/h2\u003e\n\u003cp\u003e\u003c!-- raw HTML omitted --\u003e\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/compare/1.0.6...1.0.7\"\u003eCompare with 1.0.6\u003c/a\u003e\u003c!-- raw HTML omitted --\u003e\u003c/p\u003e\n\u003ch3\u003eBuild\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eDrop support for Python 3.10 (\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/commit/2c2cbb19d0fdab8554f93fe2fb1568ffba8c0f5d\"\u003e2c2cbb1\u003c/a\u003e by Timothée Mazzucotelli).\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eBug Fixes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eSupport pymdownx 12.2 (\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/commit/ff510f27eb514dd2e46fa213365475d6fa0c4c9e\"\u003eff510f2\u003c/a\u003e by Timothée Mazzucotelli). \u003ca href=\"https://redirect.github.com/mkdocstrings/mkdocstrings/issues/829\"\u003eIssue-829\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/releases/tag/1.0.6\"\u003e1.0.6\u003c/a\u003e - 2026-07-11\u003c/h2\u003e\n\u003cp\u003e\u003c!-- raw HTML omitted --\u003e\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/compare/1.0.5...1.0.6\"\u003eCompare with 1.0.5\u003c/a\u003e\u003c!-- raw HTML omitted --\u003e\u003c/p\u003e\n\u003ch3\u003eBug Fixes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eStop propagating Zensical's \u003ccode\u003ezrelpath\u003c/code\u003e treeprocessor and its \u003ccode\u003epreview\u003c/code\u003e extension (\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/commit/473279816aff4cc8ee3215fdf8b2d186517fc63d\"\u003e4732798\u003c/a\u003e by Timothée Mazzucotelli). \u003ca href=\"https://redirect.github.com/zensical/zensical/issues/818\"\u003eIssue-zensical-818\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/releases/tag/1.0.5\"\u003e1.0.5\u003c/a\u003e - 2026-07-10\u003c/h2\u003e\n\u003cp\u003e\u003c!-- raw HTML omitted --\u003e\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/compare/1.0.4...1.0.5\"\u003eCompare with 1.0.4\u003c/a\u003e\u003c!-- raw HTML omitted --\u003e\u003c/p\u003e\n\u003ch3\u003eBug Fixes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eParse inventory project and version (\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/commit/acc0da32d11428ea9c60f8e50f90df329f2e6460\"\u003eacc0da3\u003c/a\u003e by Timothée Mazzucotelli).\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/releases/tag/1.0.4\"\u003e1.0.4\u003c/a\u003e - 2026-04-15\u003c/h2\u003e\n\u003cp\u003e\u003c!-- raw HTML omitted --\u003e\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/compare/1.0.3...1.0.4\"\u003eCompare with 1.0.3\u003c/a\u003e\u003c!-- raw HTML omitted --\u003e\u003c/p\u003e\n\u003ch3\u003eBug Fixes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAdd timeout when downloading inventories (10 seconds) (\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/commit/3d1969a279ea396792c682810d029503e48d8fcd\"\u003e3d1969a\u003c/a\u003e by Simon Lloyd). \u003ca href=\"https://redirect.github.com/mkdocstrings/mkdocstrings/issues/819\"\u003eIssue-819\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/releases/tag/1.0.3\"\u003e1.0.3\u003c/a\u003e - 2026-02-07\u003c/h2\u003e\n\u003cp\u003e\u003c!-- raw HTML omitted --\u003e\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/compare/1.0.2...1.0.3\"\u003eCompare with 1.0.2\u003c/a\u003e\u003c!-- raw HTML omitted --\u003e\u003c/p\u003e\n\u003ch3\u003eBug Fixes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eForward extension instances directly passed from Zensical (\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/commit/65b27ec8d1d671eddf021e48b0114cc3f8aca14a\"\u003e65b27ec\u003c/a\u003e by Timothée Mazzucotelli).\u003c/li\u003e\n\u003cli\u003ePropagate Zensical's \u003ccode\u003ezrelpath\u003c/code\u003e processor (\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/commit/dbf263dfdd2fdd769d66fa62bdd388e05988bc78\"\u003edbf263d\u003c/a\u003e by Timothée Mazzucotelli).\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/releases/tag/1.0.2\"\u003e1.0.2\u003c/a\u003e - 2026-01-24\u003c/h2\u003e\n\u003cp\u003e\u003c!-- raw HTML omitted --\u003e\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/compare/1.0.1...1.0.2\"\u003eCompare with 1.0.1\u003c/a\u003e\u003c!-- raw HTML omitted --\u003e\u003c/p\u003e\n\u003ch3\u003eCode Refactoring\u003c/h3\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/commit/79eefbc4543915daafd936437e285907111aaf13\"\u003e\u003ccode\u003e79eefbc\u003c/code\u003e\u003c/a\u003e chore: Prepare release 1.0.7\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/commit/2c2cbb19d0fdab8554f93fe2fb1568ffba8c0f5d\"\u003e\u003ccode\u003e2c2cbb1\u003c/code\u003e\u003c/a\u003e build: Drop support for Python 3.10\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/commit/7275d141ec2d1e578ce982cc7963c0144d2fae80\"\u003e\u003ccode\u003e7275d14\u003c/code\u003e\u003c/a\u003e chore: Lint\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/commit/ff510f27eb514dd2e46fa213365475d6fa0c4c9e\"\u003e\u003ccode\u003eff510f2\u003c/code\u003e\u003c/a\u003e fix: Support pymdownx 12.2\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/commit/8b635eb92d09978231b89a4d24a1b73353489029\"\u003e\u003ccode\u003e8b635eb\u003c/code\u003e\u003c/a\u003e chore: Template upgrade\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/commit/e0cf0ed66ad0e134a00e49cdeb4576b161624011\"\u003e\u003ccode\u003ee0cf0ed\u003c/code\u003e\u003c/a\u003e chore: Template upgrade\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/commit/fa50fef2bf25b1aa7e11d99f8730daf64f32cdcf\"\u003e\u003ccode\u003efa50fef\u003c/code\u003e\u003c/a\u003e test: Fix tests for new Pygments version\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/commit/e37de4ea38ff4e4bb10f5d5b216edd23309ed5f8\"\u003e\u003ccode\u003ee37de4e\u003c/code\u003e\u003c/a\u003e chore: Template upgrade\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/commit/0cb9404c6d470fccbed1dffa72b8407789df974d\"\u003e\u003ccode\u003e0cb9404\u003c/code\u003e\u003c/a\u003e chore: Template upgrade\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/commit/b18d7d58eea7e67377a449d5fed0b2dcc1ed4954\"\u003e\u003ccode\u003eb18d7d5\u003c/code\u003e\u003c/a\u003e docs: Add note about Zensical and gen-files\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/compare/1.0.6...1.0.7\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `filelock` from 4.0.12 to 4.1.1\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/py-filelock/releases\"\u003efilelock's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e4.1.1\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003efeat(python): default to Python 3.15 by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/816\"\u003etox-dev/filelock#816\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(rw): avoid macOS descriptor lookups by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/820\"\u003etox-dev/filelock#820\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(tests): bound concurrent lock progress by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/819\"\u003etox-dev/filelock#819\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003etest: make lock error checks deterministic by \u003ca href=\"https://github.com/adenzhou1350\"\u003e\u003ccode\u003e@​adenzhou1350\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/817\"\u003etox-dev/filelock#817\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(read-write): reject a hostile pid in _owner_is_gone by \u003ca href=\"https://github.com/dxbjavid\"\u003e\u003ccode\u003e@​dxbjavid\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/821\"\u003etox-dev/filelock#821\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/adenzhou1350\"\u003e\u003ccode\u003e@​adenzhou1350\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/817\"\u003etox-dev/filelock#817\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/tox-dev/filelock/compare/4.1.0...4.1.1\"\u003ehttps://github.com/tox-dev/filelock/compare/4.1.0...4.1.1\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e4.1.0\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eci: download coverage during tool setup by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/776\"\u003etox-dev/filelock#776\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(api): validate timeout and poll_interval bounds by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/781\"\u003etox-dev/filelock#781\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(read-write): accept inf and reject nan timeouts by \u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/779\"\u003etox-dev/filelock#779\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft-rw): ignore non-ASCII generation names by \u003ca href=\"https://github.com/dxbjavid\"\u003e\u003ccode\u003e@​dxbjavid\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/778\"\u003etox-dev/filelock#778\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): check start token in is_lock_held_by_us by \u003ca href=\"https://github.com/lprnmns\"\u003e\u003ccode\u003e@​lprnmns\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/774\"\u003etox-dev/filelock#774\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): clean up marker when rollback close fails by \u003ca href=\"https://github.com/harbinresearcher\"\u003e\u003ccode\u003e@​harbinresearcher\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/775\"\u003etox-dev/filelock#775\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(read-write): clamp waits to threading.TIMEOUT_MAX by \u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/780\"\u003etox-dev/filelock#780\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): treat truncated markers as malformed by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/782\"\u003etox-dev/filelock#782\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(acquire): keep every acquire wait within the timeout by \u003ca href=\"https://github.com/feiiiiii5\"\u003e\u003ccode\u003e@​feiiiiii5\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/777\"\u003etox-dev/filelock#777\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e📝 docs: fix hanging example and platform claims by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/783\"\u003etox-dev/filelock#783\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(unix): keep peer marker on ENOSYS fallback by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/785\"\u003etox-dev/filelock#785\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(async): clear the task hold after a canceled release by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/789\"\u003etox-dev/filelock#789\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e✨ feat(api): export lease types and has_fcntl by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/790\"\u003etox-dev/filelock#790\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(strict): age private records by the filesystem clock by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/792\"\u003etox-dev/filelock#792\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(async): surface executor shutdown as an error by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/793\"\u003etox-dev/filelock#793\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): expire leases on the contender's clock by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/796\"\u003etox-dev/filelock#796\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft-rw): stop an acquire that close() overtook by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/798\"\u003etox-dev/filelock#798\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(strict): record claims before linking them by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/787\"\u003etox-dev/filelock#787\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): restore a live marker a stale break moved aside by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/786\"\u003etox-dev/filelock#786\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(api): chain errors on 3.10 without exceptiongroup by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/788\"\u003etox-dev/filelock#788\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): release a dropped SoftFileLease by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/791\"\u003etox-dev/filelock#791\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(read-write): keep probe fds until the last connection closes by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/794\"\u003etox-dev/filelock#794\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e📦 build(sdist): ship docs and update SECURITY.md by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/812\"\u003etox-dev/filelock#812\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft-rw): survive a removed generation log by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/795\"\u003etox-dev/filelock#795\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): tell PID namespaces apart in the marker host by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/797\"\u003etox-dev/filelock#797\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(async): release from the finalizer and keep I/O off the loop by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/800\"\u003etox-dev/filelock#800\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(strict): name what blocks the lock path by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/804\"\u003etox-dev/filelock#804\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(read-write): reject WAL databases and link beside the db by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/805\"\u003etox-dev/filelock#805\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(read-write): track read depth per thread by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/806\"\u003etox-dev/filelock#806\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): honour mode and tighten marker grammar by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/807\"\u003etox-dev/filelock#807\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🧪 test: drop timing races from two runner-load flakes by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/809\"\u003etox-dev/filelock#809\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/filelock/blob/main/docs/changelog.rst\"\u003efilelock's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e###########\nChangelog\n###########\u003c/p\u003e\n\u003cp\u003e.. towncrier-draft-entries:: Unreleased\u003c/p\u003e\n\u003cp\u003e.. towncrier release notes start\u003c/p\u003e\n\u003chr /\u003e\n\u003cp\u003e4.2.0 (2026-10-14)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eimport filelock\u003c/code\u003e is about twice as fast: lock types other than :class:\u003ccode\u003e~filelock.FileLock\u003c/code\u003e load on first use. :pr:\u003ccode\u003e831\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eFix :class:\u003ccode\u003e~filelock.StrictSoftFileLock\u003c/code\u003e raising :class:\u003ccode\u003e~filelock.SoftFileLockProtocolError\u003c/code\u003e on Windows when a\ncontender read a claim whose owner was still finishing its unlink. :pr:\u003ccode\u003e829\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.1.2 (2026-10-14)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eFix read-lock acquisition on SQLite versions older than 3.33.0 by using \u003ccode\u003esqlite_master\u003c/code\u003e for the schema probe. :pr:\u003ccode\u003e770\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eRaise \u003ccode\u003eIsADirectoryError\u003c/code\u003e (or \u003ccode\u003ePermissionError\u003c/code\u003e on Windows) for a directory lock path regardless of its write\npermissions. :pr:\u003ccode\u003e822\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eFix a forked child hanging at exit on PyPy when the parent forked while an\n:class:\u003ccode\u003e~filelock.AsyncReadWriteLock\u003c/code\u003e worker thread was between two operations. :pr:\u003ccode\u003e828\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eHash all cache keys in the lock filename recipe so short path-like keys stay in the chosen directory. The example also\naccepts path-derived surrogate escapes and works before the cache directory exists. :pr:\u003ccode\u003e824\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.1.1 (2026-10-11)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eBound the shared-lock contention test by worker progress so slow CI machines can finish the workload. :pr:\u003ccode\u003e819\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eAvoid the macOS \u003ccode\u003e/dev/fd\u003c/code\u003e lookup implicated in a kernel panic by opening SQLite through a validated hard link.\nThe database directory must be writable and support hard links; alias creation failure raises \u003ccode\u003eOSError\u003c/code\u003e. :pr:\u003ccode\u003e820\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eIgnore non-ASCII PID or start-time fields and out-of-range PIDs in \u003ccode\u003eReadWriteLock\u003c/code\u003e hard-link directory names so forged\nowners cannot abort acquisition. :pr:\u003ccode\u003e821\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eUse Python 3.15 for development and automation. :pr:\u003ccode\u003e816\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.1.0 (2026-10-09)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eImport :data:\u003ccode\u003e~filelock.OwnerMode\u003c/code\u003e, :data:\u003ccode\u003e~filelock.CompromiseReason\u003c/code\u003e and :data:\u003ccode\u003e~filelock.has_fcntl\u003c/code\u003e from\n\u003ccode\u003efilelock\u003c/code\u003e. :pr:\u003ccode\u003e790\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:class:\u003ccode\u003e~filelock.AcquireReturnProxy\u003c/code\u003e is generic in the lock type, so \u003ccode\u003ewith lock.acquire() as held:\u003c/code\u003e types \u003ccode\u003eheld\u003c/code\u003e as\nthe lock's own class. :pr:\u003ccode\u003e803\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eA :class:\u003ccode\u003e~filelock.Timeout\u003c/code\u003e from a soft lock names a holder on another host or in another PID namespace, which no\ncontender ever reclaims. :pr:\u003ccode\u003e815\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:attr:\u003ccode\u003e~filelock.SoftFileLock.is_lock_held_by_us\u003c/code\u003e and :attr:\u003ccode\u003e~filelock.MarkerSoftFileLock.is_lock_held_by_us\u003c/code\u003e return\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/5830a7e2c39d387ae5320bb3be1fbb2aa7742d4a\"\u003e\u003ccode\u003e5830a7e\u003c/code\u003e\u003c/a\u003e Release 4.1.1\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/a5fb607a8655035bb6d5ae4326637e25cf1af849\"\u003e\u003ccode\u003ea5fb607\u003c/code\u003e\u003c/a\u003e fix(read-write): reject a hostile pid in _owner_is_gone (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/821\"\u003e#821\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/4c6f32f2797b2883bbcb0cca1ee81211d3e09c12\"\u003e\u003ccode\u003e4c6f32f\u003c/code\u003e\u003c/a\u003e test: make lock error checks deterministic (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/817\"\u003e#817\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/f11f52357425943a6dbffd36ea1112726255f970\"\u003e\u003ccode\u003ef11f523\u003c/code\u003e\u003c/a\u003e fix(tests): bound concurrent lock progress (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/819\"\u003e#819\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/5fd0c8f2e6a778da1933204e4a95bd84db9cdd43\"\u003e\u003ccode\u003e5fd0c8f\u003c/code\u003e\u003c/a\u003e fix(rw): avoid macOS descriptor lookups (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/820\"\u003e#820\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/0c3aaabc75ca927b2530b7264a04b965d64acf55\"\u003e\u003ccode\u003e0c3aaab\u003c/code\u003e\u003c/a\u003e feat(python): default to Python 3.15 (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/816\"\u003e#816\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/6c0ecc28f898f08cd0438cd489c3eaabad79a4b7\"\u003e\u003ccode\u003e6c0ecc2\u003c/code\u003e\u003c/a\u003e Release 4.1.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/df06bbd640765ad3f1ed4a096cbe29e64b5592bb\"\u003e\u003ccode\u003edf06bbd\u003c/code\u003e\u003c/a\u003e 🐛 fix: close regressions since 4.0.12 (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/815\"\u003e#815\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/071204515d211b560d203cb68105ec06789eab46\"\u003e\u003ccode\u003e0712045\u003c/code\u003e\u003c/a\u003e 🐛 fix(read-write): refuse a database moved mid-acquire (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/808\"\u003e#808\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/73fefc1e907457dd9bc9793eeba52f183d7f9c40\"\u003e\u003ccode\u003e73fefc1\u003c/code\u003e\u003c/a\u003e 📝 docs: point canonical and og:url at versioned pages (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/813\"\u003e#813\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/tox-dev/py-filelock/compare/4.0.12...4.1.1\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `platformdirs` from 4.12.4 to 4.13.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/platformdirs/releases\"\u003eplatformdirs's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e4.13.0\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003efix: recognize Homebrew Cellar framework prefixes by \u003ca href=\"https://github.com/sricharanreddycheruku\"\u003e\u003ccode\u003e@​sricharanreddycheruku\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/612\"\u003etox-dev/platformdirs#612\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat(python): require 3.11 and default to 3.15 by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/613\"\u003etox-dev/platformdirs#613\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/sricharanreddycheruku\"\u003e\u003ccode\u003e@​sricharanreddycheruku\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/612\"\u003etox-dev/platformdirs#612\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/tox-dev/platformdirs/compare/4.12.4...4.13.0\"\u003ehttps://github.com/tox-dev/platformdirs/compare/4.12.4...4.13.0\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/platformdirs/blob/main/docs/changelog.rst\"\u003eplatformdirs's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e###########\nChangelog\n###########\u003c/p\u003e\n\u003cp\u003e.. towncrier-draft-entries:: Unreleased\u003c/p\u003e\n\u003cp\u003e.. towncrier release notes start\u003c/p\u003e\n\u003chr /\u003e\n\u003cp\u003e4.13.0 (2026-10-10)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eDetect Homebrew Python for the :class:\u003ccode\u003e~platformdirs.macos.MacOS\u003c/code\u003e site directories under :option:\u003ccode\u003epython:-S\u003c/code\u003e, which\nleaves :data:\u003ccode\u003esys.base_prefix\u003c/code\u003e on the \u003ccode\u003eCellar\u003c/code\u003e keg, and for the \u003ccode\u003epython-freethreading\u003c/code\u003e formula - by\n:user:\u003ccode\u003esricharanreddycheruku\u003c/code\u003e. :pr:\u003ccode\u003e612\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eUse Python 3.15 for development and automation. :pr:\u003ccode\u003e613\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.12.4 (2026-10-07)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eKeep site directories readable by other users when root calls\n:meth:\u003ccode\u003e~platformdirs.api.PlatformDirsABC.place_config_file\u003c/code\u003e or another \u003ccode\u003eplace_*_file\u003c/code\u003e method with\n:attr:\u003ccode\u003e~platformdirs.api.PlatformDirsABC.use_site_for_root\u003c/code\u003e - by :user:\u003ccode\u003edarrenhuai\u003c/code\u003e. :pr:\u003ccode\u003e610\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eMake :func:\u003ccode\u003e~platformdirs.user_runtime_dir\u003c/code\u003e warn and fall back from an unreachable \u003ccode\u003eXDG_RUNTIME_DIR\u003c/code\u003e under\n:attr:\u003ccode\u003e~platformdirs.api.PlatformDirsABC.ensure_exists\u003c/code\u003e instead of raising. :pr:\u003ccode\u003e611\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.12.3 (2026-10-03)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003ePlace files from \u003ccode\u003eplace_config_file\u003c/code\u003e and \u003ccode\u003eplace_data_file\u003c/code\u003e in the first site directory for root on Unix with\n\u003ccode\u003euse_site_for_root=True\u003c/code\u003e and \u003ccode\u003emultipath=True\u003c/code\u003e, where \u003ccode\u003efind_config_file\u003c/code\u003e and \u003ccode\u003efind_data_file\u003c/code\u003e look for them.\n:pr:\u003ccode\u003e607\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.12.2 (2026-09-29)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eKeep \u003ccode\u003eos.pathsep\u003c/code\u003e in \u003ccode\u003esite_applications_path\u003c/code\u003e under \u003ccode\u003emultipath=True\u003c/code\u003e on platforms with one applications\ndirectory. :pr:\u003ccode\u003e604\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.12.1 (2026-09-28)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eAvoid \u003ccode\u003ePytestAssertRewriteWarning\u003c/code\u003e when importing \u003ccode\u003eplatformdirs\u003c/code\u003e before invoking pytest. :pr:\u003ccode\u003e601\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.12.0 (2026-09-26)\u003c/p\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/f05fb4ef31f38dfc316802c5301db972fd75468e\"\u003e\u003ccode\u003ef05fb4e\u003c/code\u003e\u003c/a\u003e Release 4.13.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/b3174fdd4e80c83d72cf723fd2a7bb6cb54cbd5f\"\u003e\u003ccode\u003eb3174fd\u003c/code\u003e\u003c/a\u003e feat(python): require 3.11 and default to 3.15 (\u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/issues/613\"\u003e#613\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/d7eb4fe34231df80a6b1c7abc362aa504feddbf1\"\u003e\u003ccode\u003ed7eb4fe\u003c/code\u003e\u003c/a\u003e fix: recognize Homebrew Cellar framework prefixes (\u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/issues/612\"\u003e#612\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/tox-dev/platformdirs/compare/4.12.4...4.13.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `python-discovery` from 1.6.1 to 1.6.2\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/python-discovery/releases\"\u003epython-discovery's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev1.6.2\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003efix: ignore broken sphinx-llm release by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/pull/134\"\u003etox-dev/python-discovery#134\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e👷 ci: pin ubuntu-26.04 and bump dependencies by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/pull/138\"\u003etox-dev/python-discovery#138\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eci: run old Python checks in parallel by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/pull/140\"\u003etox-dev/python-discovery#140\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat(python): default to 3.15 and match virtualenv by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/pull/142\"\u003etox-dev/python-discovery#142\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(cache): discard unusable interpreter cache entries by \u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/pull/141\"\u003etox-dev/python-discovery#141\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(query): validate PY_DISCOVERY_TIMEOUT by \u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/pull/143\"\u003etox-dev/python-discovery#143\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/pull/141\"\u003etox-dev/python-discovery#141\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/tox-dev/python-discovery/compare/1.6.1...1.6.2\"\u003ehttps://github.com/tox-dev/python-discovery/compare/1.6.1...1.6.2\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/python-discovery/blob/main/docs/changelog.rst\"\u003epython-discovery's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003eBug fixes - 1.6.2\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eDiscard malformed interpreter cache entries and query the interpreter again, including entries with missing,\nnon-string or unusable \u003ccode\u003esystem_executable\u003c/code\u003e paths - by :user:\u003ccode\u003edarrenhuai\u003c/code\u003e. (:issue:\u003ccode\u003e141\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eUse the default interpreter query timeout and warn for invalid \u003ccode\u003ePY_DISCOVERY_TIMEOUT\u003c/code\u003e values. Accept \u003ccode\u003einf\u003c/code\u003e\nor values above the subprocess wait limit to disable the timeout - by :user:\u003ccode\u003edarrenhuai\u003c/code\u003e. (:issue:\u003ccode\u003e143\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003ev1.6.1 (2026-09-18)\u003c/p\u003e\n\u003chr /\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/4fe2ade736e5191de42ca3d4a0b8bf672ffc5652\"\u003e\u003ccode\u003e4fe2ade\u003c/code\u003e\u003c/a\u003e release 1.6.2\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/60ddef109aafdd6d54aa25c8057a569c76e3dba2\"\u003e\u003ccode\u003e60ddef1\u003c/code\u003e\u003c/a\u003e fix(query): validate PY_DISCOVERY_TIMEOUT (\u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/issues/143\"\u003e#143\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/eb1eab726924245c533ad867d1b4bcc4c47b6d2a\"\u003e\u003ccode\u003eeb1eab7\u003c/code\u003e\u003c/a\u003e fix(cache): discard unusable interpreter cache entries (\u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/issues/141\"\u003e#141\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/db810b8206339892c0cd15f000b8e18860a8b913\"\u003e\u003ccode\u003edb810b8\u003c/code\u003e\u003c/a\u003e feat(python): default to 3.15 and match virtualenv (\u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/issues/142\"\u003e#142\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/614afa4adaa5fb36daf38919e3c407af71f3260b\"\u003e\u003ccode\u003e614afa4\u003c/code\u003e\u003c/a\u003e ci: run old Python checks in parallel (\u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/issues/140\"\u003e#140\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/9148aa454b276b5745d56bb2a42bdc8f26ee7f55\"\u003e\u003ccode\u003e9148aa4\u003c/code\u003e\u003c/a\u003e [pre-commit.ci] pre-commit autoupdate (\u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/issues/139\"\u003e#139\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/a69c0d9139ff0f1276d318d75d25d59cbc172bf4\"\u003e\u003ccode\u003ea69c0d9\u003c/code\u003e\u003c/a\u003e 👷 ci: pin ubuntu-26.04 and bump dependencies (\u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/issues/138\"\u003e#138\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/c8fcbf599ac401c8b1ad793187b28e45ccd1ffc8\"\u003e\u003ccode\u003ec8fcbf5\u003c/code\u003e\u003c/a\u003e build(deps): bump astral-sh/setup-uv from 10.1.0 to 10.2.0 in the github-acti...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/f0b3a2030c57a4f9217cd6ab09f837123ad0bc17\"\u003e\u003ccode\u003ef0b3a20\u003c/code\u003e\u003c/a\u003e [pre-commit.ci] pre-commit autoupdate (\u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/issues/136\"\u003e#136\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/b4eea32e584c0c1f08c9ad4b9f5850cb8c2275da\"\u003e\u003ccode\u003eb4eea32\u003c/code\u003e\u003c/a\u003e build(deps): bump astral-sh/setup-uv from 10.0.1 to 10.1.0 in the github-acti...\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/tox-dev/python-discovery/compare/1.6.1...1.6.2\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `virtualenv` from 21.14.6 to 21.14.7\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pypa/virtualenv/releases\"\u003evirtualenv's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e21.14.7\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eUpgrade embedded pip/setuptools/wheel and CI test tools by \u003ca href=\"https://github.com/github-actions\"\u003e\u003ccode\u003e@​github-actions\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3385\"\u003epypa/virtualenv#3385\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🧪 test(seed): verify periodic update scheduling by \u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3384\"\u003epypa/virtualenv#3384\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat(python): default to Python 3.15 by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3386\"\u003epypa/virtualenv#3386\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🔧 chore: enroll in Anthropic OSS Scanner by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3387\"\u003epypa/virtualenv#3387\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🧪 test(util): skip safe_delete permission tests as root by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3389\"\u003epypa/virtualenv#3389\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e📝 docs(security): add an email reporting contact by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3388\"\u003epypa/virtualenv#3388\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(activation): escape the bash prompt for both PS1 passes by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3390\"\u003epypa/virtualenv#3390\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🧪 test(activation): undo both bash prompt passes on bash \u0026lt; 4.4 by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3392\"\u003epypa/virtualenv#3392\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🔧 build(release): bump pydantic for 3.15 wheels by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3391\"\u003epypa/virtualenv#3391\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.14.6...21.14.7\"\u003ehttps://github.com/pypa/virtualenv/compare/21.14.6...21.14.7\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pypa/virtualenv/blob/main/docs/changelog.rst\"\u003evirtualenv's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003eBugfixes - 21.14.7\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eEscape the environment name in the bash activator for both of bash's \u003ccode\u003ePS1\u003c/code\u003e passes, so a name or \u003ccode\u003e--prompt\u003c/code\u003e value\nwith a backslash before \u003ccode\u003e$(...)\u003c/code\u003e or backticks no longer runs as a command each time bash draws the prompt - by\n:user:\u003ccode\u003egaborbernat\u003c/code\u003e. (:issue:\u003ccode\u003e3390\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003ev21.14.6 (2026-10-08)\u003c/p\u003e\n\u003chr /\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/a857a7823c73c35935d0318b4f36e5d582691e1c\"\u003e\u003ccode\u003ea857a78\u003c/code\u003e\u003c/a\u003e release 21.14.7\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/4004d884fa22a4fe30fd9f1d8336eec52a796730\"\u003e\u003ccode\u003e4004d88\u003c/code\u003e\u003c/a\u003e 🔧 build(release): bump pydantic for 3.15 wheels (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3391\"\u003e#3391\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/212f69fb905371aed4d67fcb2ac194492f417d5b\"\u003e\u003ccode\u003e212f69f\u003c/code\u003e\u003c/a\u003e 🧪 test(activation): undo both bash prompt passes on bash \u0026lt; 4.4 (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3392\"\u003e#3392\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/c3104e02474b652832a9bbaae79f6e1696296932\"\u003e\u003ccode\u003ec3104e0\u003c/code\u003e\u003c/a\u003e 🐛 fix(activation): escape the bash prompt for both PS1 passes (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3390\"\u003e#3390\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/f29efc45c063e08e02527d211c41b24a3eefe0d3\"\u003e\u003ccode\u003ef29efc4\u003c/code\u003e\u003c/a\u003e 📝 docs(security): add an email reporting contact (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3388\"\u003e#3388\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/c26cc297e2291f76a72a925fa83100f827c5c8eb\"\u003e\u003ccode\u003ec26cc29\u003c/code\u003e\u003c/a\u003e 🧪 test(util): skip safe_delete permission tests as root (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3389\"\u003e#3389\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/8b21c36b4c56bd3bea41171fa513289c503efd97\"\u003e\u003ccode\u003e8b21c36\u003c/code\u003e\u003c/a\u003e 🔧 chore: enroll in Anthropic OSS Scanner (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3387\"\u003e#3387\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/bf09c7eb62246c19c2cfd0a179c5edcc14801397\"\u003e\u003ccode\u003ebf09c7e\u003c/code\u003e\u003c/a\u003e feat(python): default to Python 3.15 (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3386\"\u003e#3386\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/3f077928210afa4ec2cca456f4c587460b40bfc5\"\u003e\u003ccode\u003e3f07792\u003c/code\u003e\u003c/a\u003e 🧪 test(seed): verify periodic update scheduling (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3384\"\u003e#3384\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/7614b02375239b36090a53ce0f52a7086fbb6766\"\u003e\u003ccode\u003e7614b02\u003c/code\u003e\u003c/a\u003e Upgrade embedded pip/setuptools/wheel and CI test tools (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3385\"\u003e#3385\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.14.6...21.14.7\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore \u003cdependency name\u003e major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself)\n- `@dependabot ignore \u003cdependency name\u003e minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself)\n- `@dependabot ignore \u003cdependency name\u003e` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself)\n- `@dependabot unignore \u003cdependency name\u003e` will remove all of the ignore conditions of the specified dependency\n- `@dependabot unignore \u003cdependency name\u003e \u003cignore condition\u003e` will remove the ignore condition of the specified dependency and ignore conditions\n\n\n\u003c/details\u003e","html_url":"https://github.com/aisecnomad/Nexus-ShadowScan/pull/224","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/aisecnomad%2FNexus-ShadowScan/issues/224","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/224/packages"},{"uuid":"5856996230","node_id":"PR_kwDOMJDtY88AAAABIgP8WQ","number":462,"state":"closed","title":"Bump virtualenv from 21.11.0 to 21.11.1","user":"dependabot[bot]","labels":["python","dependencies"],"assignees":[],"locked":false,"comments_count":2,"pull_request":true,"closed_at":"2026-10-14T22:56:52.000Z","author_association":null,"state_reason":null,"created_at":"2026-10-14T22:53:11.000Z","updated_at":"2026-10-14T22:56:53.000Z","time_to_close":221,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"Bump","packages":[{"name":"virtualenv","old_version":"21.11.0","new_version":"21.11.1","repository_url":"https://github.com/pypa/virtualenv"}],"path":null,"ecosystem":"pip"},"body":"Bumps [virtualenv](https://github.com/pypa/virtualenv) from 21.11.0 to 21.11.1.\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pypa/virtualenv/releases\"\u003evirtualenv's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e21.11.1\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e📝 docs(security): close threat items resolved by 21.11.0 by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3313\"\u003epypa/virtualenv#3313\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(build): ship test inputs in the sdist and check it by \u003ca href=\"https://github.com/Gonghan-Princess\"\u003e\u003ccode\u003e@​Gonghan-Princess\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3315\"\u003epypa/virtualenv#3315\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/Gonghan-Princess\"\u003e\u003ccode\u003e@​Gonghan-Princess\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3315\"\u003epypa/virtualenv#3315\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.11.0...21.11.1\"\u003ehttps://github.com/pypa/virtualenv/compare/21.11.0...21.11.1\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pypa/virtualenv/blob/main/docs/changelog.rst\"\u003evirtualenv's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003eBugfixes - 21.11.1\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eInclude the pre-commit configuration and the zipapp lock file in the source distribution, so downstream packagers can\nrun the test suite from it. (:issue:\u003ccode\u003e3314\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003ev21.11.0 (2026-09-23)\u003c/p\u003e\n\u003chr /\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/4c13875f0967e872f5e0708bdccfcd45aa175f0a\"\u003e\u003ccode\u003e4c13875\u003c/code\u003e\u003c/a\u003e release 21.11.1\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/ae073fbb0927f16a13e3fbf2561cd31439b2f3fa\"\u003e\u003ccode\u003eae073fb\u003c/code\u003e\u003c/a\u003e 🐛 fix(build): ship test inputs in the sdist and check it (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3315\"\u003e#3315\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/fc912de38475681b5ddd1e3ab3d04224f5e18f69\"\u003e\u003ccode\u003efc912de\u003c/code\u003e\u003c/a\u003e 📝 docs(security): close threat items resolved by 21.11.0 (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3313\"\u003e#3313\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.11.0...21.11.1\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n","html_url":"https://github.com/senzing-garage/sz-python-tools/pull/462","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/senzing-garage%2Fsz-python-tools/issues/462","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/462/packages"},{"uuid":"5856656423","node_id":"PR_kwDORWOh8s8AAAABIf-mIA","number":39,"state":"closed","title":"chore(deps): Bump the uv group across 1 directory with 9 updates","user":"dependabot[bot]","labels":["dependencies","python:uv"],"assignees":[],"locked":false,"comments_count":2,"pull_request":true,"closed_at":"2026-10-16T23:13:32.000Z","author_association":null,"state_reason":null,"created_at":"2026-10-14T22:21:25.000Z","updated_at":"2026-10-16T23:13:34.000Z","time_to_close":175927,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"chore(deps): Bump","group_name":"uv","update_count":9,"packages":[{"name":"aiohttp","old_version":"3.14.1","new_version":"3.14.3","repository_url":"https://github.com/aio-libs/aiohttp"},{"name":"anyio","old_version":"4.12.1","new_version":"4.14.2","repository_url":"https://github.com/agronholm/anyio"},{"name":"cryptography","old_version":"48.0.1","new_version":"50.0.0","repository_url":"https://github.com/pyca/cryptography"},{"name":"multidict","old_version":"6.7.1","new_version":"6.9.1","repository_url":"https://github.com/aio-libs/multidict"},{"name":"pyasn1","old_version":"0.6.3","new_version":"0.6.4","repository_url":"https://github.com/pyasn1/pyasn1"},{"name":"pygments","old_version":"2.19.2","new_version":"2.20.0","repository_url":"https://github.com/pygments/pygments"},{"name":"pyjwt","old_version":"2.13.0","new_version":"2.15.0","repository_url":"https://github.com/jpadilla/pyjwt"},{"name":"urllib3","old_version":"2.7.0","new_version":"2.8.0","repository_url":"https://github.com/urllib3/urllib3"},{"name":"virtualenv","old_version":"21.5.1","new_version":"21.7.13","repository_url":"https://github.com/pypa/virtualenv"}],"path":null,"ecosystem":"pip"},"body":"Bumps the uv group with 9 updates in the / directory:\n\n| Package | From | To |\n| --- | --- | --- |\n| [aiohttp](https://github.com/aio-libs/aiohttp) | `3.14.1` | `3.14.3` |\n| [anyio](https://github.com/agronholm/anyio) | `4.12.1` | `4.14.2` |\n| [cryptography](https://github.com/pyca/cryptography) | `48.0.1` | `50.0.0` |\n| [multidict](https://github.com/aio-libs/multidict) | `6.7.1` | `6.9.1` |\n| [pyasn1](https://github.com/pyasn1/pyasn1) | `0.6.3` | `0.6.4` |\n| [pygments](https://github.com/pygments/pygments) | `2.19.2` | `2.20.0` |\n| [pyjwt](https://github.com/jpadilla/pyjwt) | `2.13.0` | `2.15.0` |\n| [urllib3](https://github.com/urllib3/urllib3) | `2.7.0` | `2.8.0` |\n| [virtualenv](https://github.com/pypa/virtualenv) | `21.5.1` | `21.7.13` |\n\n\nUpdates `aiohttp` from 3.14.1 to 3.14.3\nUpdates `anyio` from 4.12.1 to 4.14.2\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/agronholm/anyio/releases\"\u003eanyio's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e4.14.2\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eChanged \u003ccode\u003eByteReceiveStream.receive()\u003c/code\u003e implementations to raise a \u003ccode\u003eValueError\u003c/code\u003e when \u003ccode\u003emax_bytes\u003c/code\u003e is not a positive integer (\u003ca href=\"https://redirect.github.com/agronholm/anyio/pull/1191\"\u003e#1191\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFixed \u003ccode\u003eCapacityLimiter.total_tokens\u003c/code\u003e rejecting \u003ccode\u003efloat(\u0026quot;inf\u0026quot;)\u003c/code\u003e when the limiter was instantiated outside of an event loop. The adapter setter checked for infinity by identity (\u003ccode\u003evalue is math.inf\u003c/code\u003e), so only the exact \u003ccode\u003emath.inf\u003c/code\u003e singleton was accepted, while every backend setter (using \u003ccode\u003emath.isinf()\u003c/code\u003e) accepts any positive infinity (\u003ca href=\"https://redirect.github.com/agronholm/anyio/pull/1189\"\u003e#1189\u003c/a\u003e; PR by \u003ca href=\"https://github.com/greymoth-jp\"\u003e\u003ccode\u003e@​greymoth-jp\u003c/code\u003e\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003eFixed \u003ccode\u003eto_process.run_sync()\u003c/code\u003e deadlocking when the worker function writes enough data to \u003ccode\u003esys.stderr\u003c/code\u003e to fill the (undrained) pipe buffer. The worker process now redirects \u003ccode\u003esys.stderr\u003c/code\u003e to \u003ccode\u003eos.devnull\u003c/code\u003e as well, matching the documented behavior\u003c/li\u003e\n\u003cli\u003eFixed \u003ccode\u003eTLSStream.wrap()\u003c/code\u003e matching an internationalized (unicode) host name against the peer certificate using IDNA 2003 (via the standard library) instead of IDNA 2008, which could cause the host name to be matched against the wrong certificate (\u003ca href=\"https://redirect.github.com/agronholm/anyio/pull/1208\"\u003e#1208\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFixed \u003ccode\u003eanyio.open_process()\u003c/code\u003e (and \u003ccode\u003erun_process()\u003c/code\u003e) ignoring the \u003ccode\u003eextra_groups\u003c/code\u003e argument, as it mistakenly passed the value of the \u003ccode\u003egroup\u003c/code\u003e argument instead (\u003ca href=\"https://redirect.github.com/agronholm/anyio/pull/1209\"\u003e#1209\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFixed \u003ccode\u003eCapacityLimiter.acquire_nowait()\u003c/code\u003e and \u003ccode\u003eCapacityLimiter.acquire_nowait_on_behalf_of()\u003c/code\u003e raising \u003ccode\u003etrio.WouldBlock\u003c/code\u003e instead of \u003ccode\u003eanyio.WouldBlock\u003c/code\u003e on the \u003ccode\u003etrio\u003c/code\u003e backend when there are no tokens available (\u003ca href=\"https://redirect.github.com/agronholm/anyio/pull/1218\"\u003e#1218\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFixed \u003ccode\u003eCapacityLimiter\u003c/code\u003e on the asyncio backend over-granting tokens (\u003ccode\u003eborrowed_tokens\u003c/code\u003e exceeding \u003ccode\u003etotal_tokens\u003c/code\u003e and \u003ccode\u003eavailable_tokens\u003c/code\u003e going negative) when a non-blocking acquire was made in the window between a token being released and the notified waiter resuming. The freed token is now reserved for the woken waiter right away, so the non-blocking acquire correctly raises \u003ccode\u003eWouldBlock\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/agronholm/anyio/issues/1170\"\u003e#1170\u003c/a\u003e; PR by \u003ca href=\"https://github.com/gaoflow\"\u003e\u003ccode\u003e@​gaoflow\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFixed unnecessary CPU spin when delivering cancellation from \u003ccode\u003eCancelScope\u003c/code\u003e on asyncio under certain conditions, including improper cancel scope nesting (\u003ca href=\"https://redirect.github.com/agronholm/anyio/issues/1111\"\u003e#1111\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e4.14.1\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eFixed teardown of higher-scoped async fixtures failing on asyncio with \u003ccode\u003eRuntimeError: Attempted to exit cancel scope in a different task than it was entered in\u003c/code\u003e when an async test raise an outcome exception (e.g., \u003ccode\u003epytest.skip()\u003c/code\u003e, \u003ccode\u003epytest.xfail()\u003c/code\u003e, or \u003ccode\u003epytest.fail()\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/agronholm/anyio/issues/1179\"\u003e#1179\u003c/a\u003e; PR by \u003ca href=\"https://github.com/EmmanuelNiyonshuti\"\u003e\u003ccode\u003e@​EmmanuelNiyonshuti\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFixed \u003ccode\u003eCapacityLimiter.total_tokens\u003c/code\u003e rejecting a value of \u003ccode\u003e0\u003c/code\u003e when the limiter was instantiated outside of an event loop, contradicting the documented behavior of allowing 0 total tokens (\u003ca href=\"https://redirect.github.com/agronholm/anyio/pull/1183\"\u003e#1183\u003c/a\u003e; PR by \u003ca href=\"https://github.com/nyxst4ck\"\u003e\u003ccode\u003e@​nyxst4ck\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e4.14.0\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eAdded support for Python 3.15\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAdded an asynchronous implementation of the \u003ccode\u003eitertools\u003c/code\u003e module (\u003ca href=\"https://redirect.github.com/agronholm/anyio/issues/998\"\u003e#998\u003c/a\u003e; PR by \u003ca href=\"https://github.com/11kkw\"\u003e\u003ccode\u003e@​11kkw\u003c/code\u003e\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAdded the \u003ccode\u003elocal_port\u003c/code\u003e parameter to \u003ccode\u003econnect_tcp()\u003c/code\u003e to allow binding to a specific local port before connecting (\u003ca href=\"https://redirect.github.com/agronholm/anyio/issues/1067\"\u003e#1067\u003c/a\u003e; PR by \u003ca href=\"https://github.com/nullwiz\"\u003e\u003ccode\u003e@​nullwiz\u003c/code\u003e\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAdded support for custom capacity limiters in async path and file I/O functions and classes\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAdded the \u003ccode\u003ecreate_task()\u003c/code\u003e task group method for easier asyncio migration (returns a \u003ccode\u003eTaskHandle\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/agronholm/anyio/pull/1098\"\u003e#1098\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eChanged \u003ccode\u003eTaskGroup.start_soon()\u003c/code\u003e to return a \u003ccode\u003eTaskHandle\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAdded an option for \u003ccode\u003eTaskGroup.start()\u003c/code\u003e to return a \u003ccode\u003eTaskHandle\u003c/code\u003e (which then contains the start value in the \u003ccode\u003estart_value\u003c/code\u003e property)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAdded the \u003ccode\u003ecancel()\u003c/code\u003e convenience method to \u003ccode\u003eTaskGroup\u003c/code\u003e as a shortcut for cancelling the task group's cancel scope\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eImproved the error message when a known backend is not installed to suggest the install command (\u003ca href=\"https://redirect.github.com/agronholm/anyio/pull/1115\"\u003e#1115\u003c/a\u003e; PR by \u003ca href=\"https://github.com/EmmanuelNiyonshuti\"\u003e\u003ccode\u003e@​EmmanuelNiyonshuti\u003c/code\u003e\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eImproved \u003ccode\u003eanyio.Path\u003c/code\u003e to preserve subclass types by returning \u003ccode\u003eSelf\u003c/code\u003e in methods that return path objects (\u003ca href=\"https://redirect.github.com/agronholm/anyio/issues/1130\"\u003e#1130\u003c/a\u003e; PR by \u003ca href=\"https://github.com/EmmanuelNiyonshuti\"\u003e\u003ccode\u003e@​EmmanuelNiyonshuti\u003c/code\u003e\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eChanged the parameter type annotation in \u003ccode\u003eanyio.Path.write_bytes()\u003c/code\u003e to accept any \u003ccode\u003eReadableBuffer\u003c/code\u003e, thus allowing it to accept \u003ccode\u003ebytearray\u003c/code\u003e and \u003ccode\u003ememoryview\u003c/code\u003e to match \u003ccode\u003epathlib.Path.write_bytes()\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/agronholm/anyio/issues/1135\"\u003e#1135\u003c/a\u003e; PR by \u003ca href=\"https://github.com/SAY-5\"\u003e\u003ccode\u003e@​SAY-5\u003c/code\u003e\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eChanged several type annotations to only accept callables returning coroutine-like objects instead of arbitrary awaitables:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eTaskGroup.start_soon()\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eTaskGroup.start()\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eanyio.from_thread.run()\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThis reverts an earlier change from v3.7.0 which was made in error. (\u003ca href=\"https://redirect.github.com/agronholm/anyio/pull/1153\"\u003e#1153\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eChanged \u003ccode\u003eanyio.run\u003c/code\u003e to support callables returning arbitrary awaitables at runtime on all backends. Previously, this only worked on asyncio (\u003ca href=\"https://redirect.github.com/agronholm/anyio/pull/1171\"\u003e#1171\u003c/a\u003e; PR by \u003ca href=\"https://github.com/gschaffner\"\u003e\u003ccode\u003e@​gschaffner\u003c/code\u003e\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eChanged several classes (and their subclasses) to have \u003ccode\u003e__slots__\u003c/code\u003e (with \u003ccode\u003e__weakref__\u003c/code\u003e):\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eanyio.CancelScope\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/agronholm/anyio/commit/c384f99687c64c59ed8a11c3a0f11a2d57daff71\"\u003e\u003ccode\u003ec384f99\u003c/code\u003e\u003c/a\u003e Bumped up the version\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/agronholm/anyio/commit/dbba29d1ade7936f18fb71ba24aa92978673482a\"\u003e\u003ccode\u003edbba29d\u003c/code\u003e\u003c/a\u003e Fixed 100% CPU spin on cancel scope misuse (\u003ca href=\"https://redirect.github.com/agronholm/anyio/issues/1217\"\u003e#1217\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/agronholm/anyio/commit/6bbc6c33caabc13af5bc4256f745027cf8d5d7b8\"\u003e\u003ccode\u003e6bbc6c3\u003c/code\u003e\u003c/a\u003e Fix CapacityLimiter over-granting tokens on asyncio (\u003ca href=\"https://redirect.github.com/agronholm/anyio/issues/1172\"\u003e#1172\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/agronholm/anyio/commit/6f82b2537cbbe98f3df3f295499056ab7de0b15b\"\u003e\u003ccode\u003e6f82b25\u003c/code\u003e\u003c/a\u003e Refactored TestTLSStream.test_receive_invalid_max_bytes() to be less flaky\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/agronholm/anyio/commit/be24b0414f67f604bcbdd5ea3bcc56ab920d872e\"\u003e\u003ccode\u003ebe24b04\u003c/code\u003e\u003c/a\u003e Relaxed timeouts to fix test flakiness\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/agronholm/anyio/commit/81135065749b4f60c06619b9caaf0a11871c1ddf\"\u003e\u003ccode\u003e8113506\u003c/code\u003e\u003c/a\u003e Fix test flakiness caused by slow callback duration logging\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/agronholm/anyio/commit/1e988b617b69588e33fecb75e36a9837245f562f\"\u003e\u003ccode\u003e1e988b6\u003c/code\u003e\u003c/a\u003e Fixed CapacityLimiter raising trio.WouldBlock instead of anyio.WouldBlock (\u003ca href=\"https://redirect.github.com/agronholm/anyio/issues/1\"\u003e#1\u003c/a\u003e...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/agronholm/anyio/commit/44713f345cd29dd4e7d76553c134543a1296cc62\"\u003e\u003ccode\u003e44713f3\u003c/code\u003e\u003c/a\u003e Pin setup-uv to a commit sha across downstream jobs (\u003ca href=\"https://redirect.github.com/agronholm/anyio/issues/1213\"\u003e#1213\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/agronholm/anyio/commit/f1b7301c8264b0d2e8d24a5788fd29e93dea4040\"\u003e\u003ccode\u003ef1b7301\u003c/code\u003e\u003c/a\u003e Fixed stderr writes in a worker subprocess causing a deadlock (\u003ca href=\"https://redirect.github.com/agronholm/anyio/issues/1207\"\u003e#1207\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/agronholm/anyio/commit/212be93c2cf2c841e753e95e5e2c543ee7feca90\"\u003e\u003ccode\u003e212be93\u003c/code\u003e\u003c/a\u003e Fix flaky test_tcp_listener_same_port using a hardcoded port (\u003ca href=\"https://redirect.github.com/agronholm/anyio/issues/1206\"\u003e#1206\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/agronholm/anyio/compare/4.12.1...4.14.2\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `cryptography` from 48.0.1 to 50.0.0\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst\"\u003ecryptography's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e50.0.0 - 2026-07-31\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e\n* **SECURITY ISSUE**:\n  :func:`~cryptography.hazmat.primitives.serialization.pkcs7.pkcs7_decrypt_der`\n  and its PEM and S/MIME variants no longer expose distinguishable errors or\n  timing when unwrapping a ``RecipientInfo``'s ``encryptedKey``, which could\n  act as a Bleichenbacher oracle for callers that decrypt untrusted messages.\n  A random key is now substituted on failure, as described in :rfc:`3218`.\n  Credit to **@X1AOxiang** for reporting the issue. **CVE-2026-69247**\n* Deprecated Diffie-Hellman key exchange over finite fields (FFDH).\n  Everything FFDH is deprecated, including the types in\n  ``cryptography.hazmat.primitives.asymmetric.dh`` and loading FFDH keys or\n  parameters with the key loading APIs. Users should migrate to a more\n  modern key exchange algorithm.\n* Added ``xof()`` class methods to\n  :class:`~cryptography.hazmat.primitives.hashes.SHAKE128` and\n  :class:`~cryptography.hazmat.primitives.hashes.SHAKE256` for constructing\n  algorithm instances configured for use with\n  :class:`~cryptography.hazmat.primitives.hashes.XOFHash`.\n* The :mod:`X.509 verification \u0026lt;cryptography.x509.verification\u0026gt;` APIs are now\n  considered stable and are subject to our API stability policy.\n* Added the :doc:`/cobblestone` recipe, an implementation of the\n  Cobblestone-128 and Cobblestone-256 instantiations of the `C2SP\n  chunked-encryption specification\n  \u0026lt;https://c2sp.org/chunked-encryption\u0026gt;`_ for streaming authenticated\n  encryption of large messages.\n* Parsing a Signed Certificate Timestamp list now rejects encodings that\n  carry trailing bytes after the list or after an individual SCT, instead of\n  silently ignoring them.\n* Added support for using :class:`~cryptography.x509.Name` as a field type in\n  the :doc:`/hazmat/asn1/index` module.\n* Loading a public key or an EC private key now rejects DER where the\n  ``subjectPublicKey`` (or EC ``publicKey``) ``BIT STRING`` declares a non-zero\n  number of unused bits, instead of silently ignoring it.\n* Parsing a CRL entry's ``InvalidityDate`` extension now rejects a\n  ``GeneralizedTime`` that carries fractional seconds or another non-DER form,\n  matching the strict encoding already required for every other X.509 time\n  field.\n* :func:`~cryptography.x509.ocsp.load_der_ocsp_request` and\n  :func:`~cryptography.x509.ocsp.load_der_ocsp_response` now reject a request\n  or response whose ``version`` field is not ``v1``, the only version defined\n  by RFC 6960, matching the version validation already performed when loading\n  certificates, CSRs and CRLs.\n* :class:`~cryptography.hazmat.primitives.hashes.XOFHash` is now supported\n  when building against AWS-LC.\n* HMAC (and therefore PBKDF2-HMAC) with SHA-3 hashes is now supported when\n  building against AWS-LC.\n* Diffie-Hellman (:doc:`/hazmat/primitives/asymmetric/dh`) is now supported\n  when building against AWS-LC.\n\u0026lt;/tr\u0026gt;\u0026lt;/table\u0026gt; \n\u003c/code\u003e\u003c/pre\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pyca/cryptography/commit/dcb7050b807b00392fa9fe2eac7cb362fcf355cc\"\u003e\u003ccode\u003edcb7050\u003c/code\u003e\u003c/a\u003e Prepare for 50.0.0 release (\u003ca href=\"https://redirect.github.com/pyca/cryptography/issues/15372\"\u003e#15372\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pyca/cryptography/commit/53fccd93413a8d7f07d6d8999681f27b75cffa3f\"\u003e\u003ccode\u003e53fccd9\u003c/code\u003e\u003c/a\u003e Don't leak how PKCS#7 encryptedKey decryption failed (\u003ca href=\"https://redirect.github.com/pyca/cryptography/issues/15369\"\u003e#15369\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pyca/cryptography/commit/d472f978470fbefa521b86d98b2ecccbbb4d1dd8\"\u003e\u003ccode\u003ed472f97\u003c/code\u003e\u003c/a\u003e Add \u003ccode\u003efrom __future__ import annotations\u003c/code\u003e to all src/ Python files (\u003ca href=\"https://redirect.github.com/pyca/cryptography/issues/15371\"\u003e#15371\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pyca/cryptography/commit/908773d53829fb1466c6db364b31321c3cd8eb9a\"\u003e\u003ccode\u003e908773d\u003c/code\u003e\u003c/a\u003e Bump downstream dependencies in CI (\u003ca href=\"https://redirect.github.com/pyca/cryptography/issues/15368\"\u003e#15368\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pyca/cryptography/commit/2cc07cc948948211899bcb0cddd1fddf86e95812\"\u003e\u003ccode\u003e2cc07cc\u003c/code\u003e\u003c/a\u003e Bump BoringSSL, OpenSSL, AWS-LC in CI (\u003ca href=\"https://redirect.github.com/pyca/cryptography/issues/15367\"\u003e#15367\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pyca/cryptography/commit/c94ede9f040fa44942f7139772603419000acf66\"\u003e\u003ccode\u003ec94ede9\u003c/code\u003e\u003c/a\u003e chore(deps): bump ruff from 0.16.0 to 0.16.1 (\u003ca href=\"https://redirect.github.com/pyca/cryptography/issues/15366\"\u003e#15366\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pyca/cryptography/commit/67a8308dc9ea4cce6056e0f1438f903c208c3f35\"\u003e\u003ccode\u003e67a8308\u003c/code\u003e\u003c/a\u003e chore(deps): bump virtualenv from 21.7.0 to 21.7.1 (\u003ca href=\"https://redirect.github.com/pyca/cryptography/issues/15365\"\u003e#15365\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pyca/cryptography/commit/95018ffcdbbc510fd92fc872e3a3e80aa6e58596\"\u003e\u003ccode\u003e95018ff\u003c/code\u003e\u003c/a\u003e Release the GIL in one-shot AEAD encrypt/decrypt (\u003ca href=\"https://redirect.github.com/pyca/cryptography/issues/15361\"\u003e#15361\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pyca/cryptography/commit/6954733eaf55a0074abf88f06f7242dfca3a5d02\"\u003e\u003ccode\u003e6954733\u003c/code\u003e\u003c/a\u003e Release the GIL during DH and DSA parameter generation (\u003ca href=\"https://redirect.github.com/pyca/cryptography/issues/15364\"\u003e#15364\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pyca/cryptography/commit/6893b94c33e948f6240082461424cfb5da2dacc6\"\u003e\u003ccode\u003e6893b94\u003c/code\u003e\u003c/a\u003e Import _serialization instead of serialization in x509/extensions (\u003ca href=\"https://redirect.github.com/pyca/cryptography/issues/15363\"\u003e#15363\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/pyca/cryptography/compare/48.0.1...50.0.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `multidict` from 6.7.1 to 6.9.1\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/aio-libs/multidict/releases\"\u003emultidict's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e6.9.1\u003c/h2\u003e\n\u003ch2\u003eBug fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eFixed the C extension reading freed memory on free-threaded builds when a\nlist handed to :py:meth:\u003ccode\u003e~multidict.MultiDict.update\u003c/code\u003e,\n:py:meth:\u003ccode\u003e~multidict.MultiDict.extend\u003c/code\u003e, :py:meth:\u003ccode\u003e~multidict.MultiDict.merge\u003c/code\u003e\nor the :py:class:\u003ccode\u003e~multidict.MultiDict\u003c/code\u003e and :py:class:\u003ccode\u003e~multidict.CIMultiDict\u003c/code\u003e\nconstructors, a \u003ccode\u003e[key, value]\u003c/code\u003e item inside any iterable handed to them, or a\nlist tested with \u003ccode\u003ein\u003c/code\u003e against :py:meth:\u003ccode\u003e~multidict.MultiDict.items\u003c/code\u003e, is\nchanged by another thread; a call that catches the list shrinking under it\nnow raises :py:exc:\u003ccode\u003eRuntimeError\u003c/code\u003e -- by :user:\u003ccode\u003erodrigobnogueira\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eRelated issues and pull requests on GitHub:\u003c/em\u003e\n\u003ca href=\"https://redirect.github.com/aio-libs/multidict/issues/1437\"\u003e#1437\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFixed a data race on the free-threaded build where a retired hash table's\nreader count used relaxed atomics, letting a lock-free \u003ccode\u003eget()\u003c/code\u003e/\u003ccode\u003egetone()\u003c/code\u003e/\n\u003ccode\u003e__getitem__()\u003c/code\u003e read race a concurrent free of that table. The reader-exit\ndecrement and the drain's free check now use release/acquire ordering\ninstead -- by :user:\u003ccode\u003easvetlov\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eRelated issues and pull requests on GitHub:\u003c/em\u003e\n\u003ca href=\"https://redirect.github.com/aio-libs/multidict/issues/1481\"\u003e#1481\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFixed a free-threaded build bug where two threads calling \u003ccode\u003eupdate()\u003c/code\u003e,\n\u003ccode\u003emerge()\u003c/code\u003e, or \u003ccode\u003e__setitem__()\u003c/code\u003e on the same key at the same time could lose\nthe key entirely instead of just racing on which value wins. A decref of the\nreplaced value could transiently suspend the writer's critical section,\nletting a second writer for the same key observe the first writer's\nin-progress entry as absent and, once both settled, mistake it for a stale\nduplicate and delete it. Every such decref is now deferred until the writer\nhas released its critical section, so the window can no longer open.\n\u003ccode\u003esetdefault()\u003c/code\u003e had an unrelated instance of the same blind spot (it could\ninsert a duplicate rather than recognizing an in-flight key), fixed alongside\nit -- by :user:\u003ccode\u003easvetlov\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eRelated issues and pull requests on GitHub:\u003c/em\u003e\n\u003ca href=\"https://redirect.github.com/aio-libs/multidict/issues/1483\"\u003e#1483\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFixed a free-threaded build bug where \u003ccode\u003egetall()\u003c/code\u003e and the \u003ccode\u003eitems()\u003c/code\u003e/\n\u003ccode\u003ekeys()\u003c/code\u003e/\u003ccode\u003evalues()\u003c/code\u003e equality path could raise \u003ccode\u003eKeyError\u003c/code\u003e or report a\npresent, never-deleted key as missing. A concurrent \u003ccode\u003eupdate()\u003c/code\u003e/\u003ccode\u003eextend()\u003c/code\u003e/\n\u003ccode\u003e__setitem__()\u003c/code\u003e call can have its critical section transiently suspended\n(a decref triggering a blocking allocator call) while an entry is marked as\npart of its own bookkeeping; a reader landing in that window used to treat\nthe mark as \u0026quot;not found\u0026quot; instead of \u0026quot;still there, in flight\u0026quot; -- by\n:user:\u003ccode\u003easvetlov\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eRelated issues and pull requests on GitHub:\u003c/em\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/aio-libs/multidict/blob/master/CHANGES.rst\"\u003emultidict's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e6.9.1\u003c/h1\u003e\n\u003cp\u003e\u003cem\u003e(2026-09-21)\u003c/em\u003e\u003c/p\u003e\n\u003ch2\u003eBug fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eFixed the C extension reading freed memory on free-threaded builds when a\nlist handed to :py:meth:\u003ccode\u003e~multidict.MultiDict.update\u003c/code\u003e,\n:py:meth:\u003ccode\u003e~multidict.MultiDict.extend\u003c/code\u003e, :py:meth:\u003ccode\u003e~multidict.MultiDict.merge\u003c/code\u003e\nor the :py:class:\u003ccode\u003e~multidict.MultiDict\u003c/code\u003e and :py:class:\u003ccode\u003e~multidict.CIMultiDict\u003c/code\u003e\nconstructors, a \u003ccode\u003e[key, value]\u003c/code\u003e item inside any iterable handed to them, or a\nlist tested with \u003ccode\u003ein\u003c/code\u003e against :py:meth:\u003ccode\u003e~multidict.MultiDict.items\u003c/code\u003e, is\nchanged by another thread; a call that catches the list shrinking under it\nnow raises :py:exc:\u003ccode\u003eRuntimeError\u003c/code\u003e -- by :user:\u003ccode\u003erodrigobnogueira\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eRelated issues and pull requests on GitHub:\u003c/em\u003e\n:issue:\u003ccode\u003e1437\u003c/code\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFixed a data race on the free-threaded build where a retired hash table's\nreader count used relaxed atomics, letting a lock-free \u003ccode\u003eget()\u003c/code\u003e/\u003ccode\u003egetone()\u003c/code\u003e/\n\u003ccode\u003e__getitem__()\u003c/code\u003e read race a concurrent free of that table. The reader-exit\ndecrement and the drain's free check now use release/acquire ordering\ninstead -- by :user:\u003ccode\u003easvetlov\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eRelated issues and pull requests on GitHub:\u003c/em\u003e\n:issue:\u003ccode\u003e1481\u003c/code\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFixed a free-threaded build bug where two threads calling \u003ccode\u003eupdate()\u003c/code\u003e,\n\u003ccode\u003emerge()\u003c/code\u003e, or \u003ccode\u003e__setitem__()\u003c/code\u003e on the same key at the same time could lose\nthe key entirely instead of just racing on which value wins. A decref of the\nreplaced value could transiently suspend the writer's critical section,\nletting a second writer for the same key observe the first writer's\nin-progress entry as absent and, once both settled, mistake it for a stale\nduplicate and delete it. Every such decref is now deferred until the writer\nhas released its critical section, so the window can no longer open.\n\u003ccode\u003esetdefault()\u003c/code\u003e had an unrelated instance of the same blind spot (it could\ninsert a duplicate rather than recognizing an in-flight key), fixed alongside\nit -- by :user:\u003ccode\u003easvetlov\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eRelated issues and pull requests on GitHub:\u003c/em\u003e\n:issue:\u003ccode\u003e1483\u003c/code\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFixed a free-threaded build bug where \u003ccode\u003egetall()\u003c/code\u003e and the \u003ccode\u003eitems()\u003c/code\u003e/\n\u003ccode\u003ekeys()\u003c/code\u003e/\u003ccode\u003evalues()\u003c/code\u003e equality path could raise \u003ccode\u003eKeyError\u003c/code\u003e or report a\npresent, never-deleted key as missing. A concurrent \u003ccode\u003eupdate()\u003c/code\u003e/\u003ccode\u003eextend()\u003c/code\u003e/\n\u003ccode\u003e__setitem__()\u003c/code\u003e call can have its critical section transiently suspended\n(a decref triggering a blocking allocator call) while an entry is marked as\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/aio-libs/multidict/commit/0a1770c7e69845c8ef2000b3707cd7f1917a6944\"\u003e\u003ccode\u003e0a1770c\u003c/code\u003e\u003c/a\u003e Release 6.9.1 (\u003ca href=\"https://redirect.github.com/aio-libs/multidict/issues/1504\"\u003e#1504\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/aio-libs/multidict/commit/d220522b54b1989c90a96aa50c42bb0264d46210\"\u003e\u003ccode\u003ed220522\u003c/code\u003e\u003c/a\u003e Upload release assets one at a time to avoid the secondary rate limit (\u003ca href=\"https://redirect.github.com/aio-libs/multidict/issues/1503\"\u003e#1503\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/aio-libs/multidict/commit/30cd596f945ed7b69f5502c693339224043eb9e9\"\u003e\u003ccode\u003e30cd596\u003c/code\u003e\u003c/a\u003e Stop a GIL-releasing \u003cstrong\u003edel\u003c/strong\u003e from segfaulting the standard C extension build ...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/aio-libs/multidict/commit/d1c331ab2617299a1385fff29ef4da64e50bd071\"\u003e\u003ccode\u003ed1c331a\u003c/code\u003e\u003c/a\u003e Recheck the reader gate after taking the retired list (\u003ca href=\"https://redirect.github.com/aio-libs/multidict/issues/1502\"\u003e#1502\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/aio-libs/multidict/commit/b37f07c1a16122f95208936f2e58f55ea99cdbaf\"\u003e\u003ccode\u003eb37f07c\u003c/code\u003e\u003c/a\u003e Allocate deferred decrefs in fixed-size blocks (\u003ca href=\"https://redirect.github.com/aio-libs/multidict/issues/1501\"\u003e#1501\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/aio-libs/multidict/commit/563f667307c376744ca345802ca835f8b84ba947\"\u003e\u003ccode\u003e563f667\u003c/code\u003e\u003c/a\u003e Run CodSpeed benchmarks on Python 3.14 and loop the smallest ones (\u003ca href=\"https://redirect.github.com/aio-libs/multidict/issues/1498\"\u003e#1498\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/aio-libs/multidict/commit/157c87c6cecbeac0011b085e8f6c2496754c17e6\"\u003e\u003ccode\u003e157c87c\u003c/code\u003e\u003c/a\u003e Cancel superseded CI runs on pull requests (\u003ca href=\"https://redirect.github.com/aio-libs/multidict/issues/1500\"\u003e#1500\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/aio-libs/multidict/commit/d43adfe27f759a2810a900db73fc85ab3660e75b\"\u003e\u003ccode\u003ed43adfe\u003c/code\u003e\u003c/a\u003e Drop -I from the ASan test command so PYTHONMALLOC takes effect (\u003ca href=\"https://redirect.github.com/aio-libs/multidict/issues/1499\"\u003e#1499\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/aio-libs/multidict/commit/2a68472db036f199ecb1c1a0c66872eeb03a3135\"\u003e\u003ccode\u003e2a68472\u003c/code\u003e\u003c/a\u003e Stop items() iteration from reading a freed entry in CIMultiDict (\u003ca href=\"https://redirect.github.com/aio-libs/multidict/issues/1496\"\u003e#1496\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/aio-libs/multidict/commit/cd528d6d82dc1465042459b3cc143dc58c5ce6ab\"\u003e\u003ccode\u003ecd528d6\u003c/code\u003e\u003c/a\u003e Rename GHSA-54p9-h82j-f925 changelog fragment to the merged commit (\u003ca href=\"https://redirect.github.com/aio-libs/multidict/issues/1495\"\u003e#1495\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/aio-libs/multidict/compare/v6.7.1...v6.9.1\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `pyasn1` from 0.6.3 to 0.6.4\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pyasn1/pyasn1/releases\"\u003epyasn1's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003eRelease 0.6.4\u003c/h2\u003e\n\u003cp\u003eThis is a security release.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eCVE-2026-59885 (GHSA-8ppf-4f7h-5ppj): Fixed quadratic time complexity in the OBJECT IDENTIFIER and RELATIVE-OID decoders. A small crafted substrate encoding many arcs could consume excessive CPU.\u003c/li\u003e\n\u003cli\u003eCVE-2026-59884 (GHSA-m4p7-r5rc-7g4j): Limited BER long-form tag IDs to 20 octets (140 bits). Unbounded tag IDs allowed a crafted substrate to consume excessive CPU and memory.\u003c/li\u003e\n\u003cli\u003eCVE-2026-59886 (GHSA-hm4w-wwcw-mr6r): Fixed excessive memory and CPU consumption in \u003ccode\u003eReal.__float__()\u003c/code\u003e for values with large base-10 exponents.\u003c/li\u003e\n\u003cli\u003ePinned PyPI publish GitHub Action to an immutable commit.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eAll changes are noted in the \u003ca href=\"https://github.com/pyasn1/pyasn1/blob/main/CHANGES.rst\"\u003eCHANGELOG\u003c/a\u003e.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pyasn1/pyasn1/blob/main/CHANGES.rst\"\u003epyasn1's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003eRevision 0.6.4, released 08-07-2026\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eCVE-2026-59885 (GHSA-8ppf-4f7h-5ppj): Fixed quadratic time\ncomplexity in the OBJECT IDENTIFIER and RELATIVE-OID decoders.\nA small crafted substrate encoding many arcs could consume\nexcessive CPU. Arcs are now accumulated in linear time; decoded\nvalues are unchanged (thanks for reporting, tynus2)\u003c/li\u003e\n\u003cli\u003eCVE-2026-59884 (GHSA-m4p7-r5rc-7g4j): Limited BER long-form tag\nIDs to 20 octets (140 bits), matching the OID arc limit introduced\nin 0.6.2. Unbounded tag IDs allowed a crafted substrate to consume\nexcessive CPU and memory; longer tag IDs are now rejected with\nPyAsn1Error. Also fixed Tag and TagSet repr() failing on huge tag\n(thanks for reporting, mikeappsec)\nIDs due to the integer-to-string conversion limit (Python 3.11+)\u003c/li\u003e\n\u003cli\u003eCVE-2026-59886 (GHSA-hm4w-wwcw-mr6r): Fixed excessive memory and\nCPU consumption in Real.\u003cstrong\u003efloat\u003c/strong\u003e() for values with large base-10\nexponents. Conversion no longer materializes huge intermediate\nintegers; values too large to represent as a Python float raise\nOverflowError promptly, and prettyPrint() renders them as\n'\u003c!-- raw HTML omitted --\u003e' as before. Also fixed base-10 mantissa normalization\nto use exact integer arithmetic; mantissas larger than 2**53\ncould previously lose precision through float division\n(thanks for reporting, gvozdila)\u003c/li\u003e\n\u003cli\u003ePinned PyPI publish GitHub Action to an immutable commit\n[pr \u003ca href=\"https://redirect.github.com/pyasn1/pyasn1/issues/113\"\u003e#113\u003c/a\u003e](\u003ca href=\"https://redirect.github.com/pyasn1/pyasn1/pull/113\"\u003epyasn1/pyasn1#113\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pyasn1/pyasn1/commit/72e4803405816c371ed3b2cb4be181c47f038406\"\u003e\u003ccode\u003e72e4803\u003c/code\u003e\u003c/a\u003e Prepare release 0.6.4\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pyasn1/pyasn1/commit/0c19eeb853731db1c717ff125ea001a1e558332d\"\u003e\u003ccode\u003e0c19eeb\u003c/code\u003e\u003c/a\u003e Pin PyPI publish action to immutable commit (\u003ca href=\"https://redirect.github.com/pyasn1/pyasn1/issues/113\"\u003e#113\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pyasn1/pyasn1/commit/45bdb19eb7df4b3780fe9c912c63e99bffc39dd9\"\u003e\u003ccode\u003e45bdb19\u003c/code\u003e\u003c/a\u003e Merge commit from fork\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pyasn1/pyasn1/commit/628e36ecbb5277a3f01572ce418ef54271b165a5\"\u003e\u003ccode\u003e628e36e\u003c/code\u003e\u003c/a\u003e Merge commit from fork\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pyasn1/pyasn1/commit/e60c691cb91addb8fcefa2f537e85ede6fb1e886\"\u003e\u003ccode\u003ee60c691\u003c/code\u003e\u003c/a\u003e Merge commit from fork\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/pyasn1/pyasn1/compare/v0.6.3...v0.6.4\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `pygments` from 2.19.2 to 2.20.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pygments/pygments/releases\"\u003epygments's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e2.20.0\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eNew lexers:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eRell (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2914\"\u003e#2914\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdated lexers:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003earchetype: Fix catastrophic backtracking in GUID and ID patterns (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3064\"\u003e#3064\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eASN.1: Recognize minus sign and fix range operator (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3014\"\u003e#3014\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3060\"\u003e#3060\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eC++: Add C++26 keywords (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2955\"\u003e#2955\u003c/a\u003e), add integer literal suffixes (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2966\"\u003e#2966\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eComponentPascal: Fix \u003ccode\u003eanalyse_text\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3028\"\u003e#3028\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3032\"\u003e#3032\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eCoq renamed to Rocq (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2883\"\u003e#2883\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2908\"\u003e#2908\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eCython: Various improvements (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2932\"\u003e#2932\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2933\"\u003e#2933\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eDebian control: Improve architecture parsing (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3052\"\u003e#3052\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eDevicetree: Add support for overlay/fragments (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3021\"\u003e#3021\u003c/a\u003e), add bytestring support (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3022\"\u003e#3022\u003c/a\u003e), fix catastrophic backtracking (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3057\"\u003e#3057\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFennel: Various improvements (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2911\"\u003e#2911\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eHaskell: Handle escape sequences in character literals (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3069\"\u003e#3069\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/pygments/pygments/issues/1795\"\u003e#1795\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eJava: Add module keywords (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2955\"\u003e#2955\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eLean4: Add operators \u003ccode\u003e]'\u003c/code\u003e, \u003ccode\u003e]?\u003c/code\u003e, \u003ccode\u003e]!\u003c/code\u003e  (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2946\"\u003e#2946\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eLESS: Support single-line comments (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3005\"\u003e#3005\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eLilyPond: Update to 2.25.29 (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2974\"\u003e#2974\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eLLVM: Support C-style comments (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3023\"\u003e#3023\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2978\"\u003e#2978\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eLua(u): Fix catastrophic backtracking (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3047\"\u003e#3047\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eMacaulay2: Update to 1.25.05 (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2893\"\u003e#2893\u003c/a\u003e), 1.25.11 (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2988\"\u003e#2988\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eMathematica: Various improvements (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2957\"\u003e#2957\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003emeson: Add additional operators (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2919\"\u003e#2919\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eMySQL: Update keywords (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2970\"\u003e#2970\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eorg-Mode: Support both schedule and deadline (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2899\"\u003e#2899\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ePHP: Add \u003ccode\u003e__PROPERTY__\u003c/code\u003e magic constant (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2924\"\u003e#2924\u003c/a\u003e), add reserved keywords (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3002\"\u003e#3002\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ePostgreSQL: Add more keywords (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2985\"\u003e#2985\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eprotobuf: Fix namespace tokenization (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2929\"\u003e#2929\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ePython: Add \u003ccode\u003et\u003c/code\u003e-string support (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2973\"\u003e#2973\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3009\"\u003e#3009\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3010\"\u003e#3010\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eTablegen: Fix infinite loop (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2972\"\u003e#2972\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2940\"\u003e#2940\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eTera Term macro: Add commands introduced in v5.3 through v5.6 (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2951\"\u003e#2951\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eTOML: Support TOML 1.1.0 (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3026\"\u003e#3026\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3027\"\u003e#3027\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eTurtle: Allow empty comment lines (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2980\"\u003e#2980\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eXML: Added \u003ccode\u003e.xbrl\u003c/code\u003e as file ending (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2890\"\u003e#2890\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2891\"\u003e#2891\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDrop Python 3.8, and add Python 3.14 as a supported version (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2987\"\u003e#2987\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3012\"\u003e#3012\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eVarious improvements to \u003ccode\u003eautopygmentize\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2894\"\u003e#2894\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate \u003ccode\u003eonedark\u003c/code\u003e style to support more token types (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2977\"\u003e#2977\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate \u003ccode\u003ertt\u003c/code\u003e style to support more token types (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2895\"\u003e#2895\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eCache entry points to improve performance (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2979\"\u003e#2979\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFix \u003ccode\u003exterm-256\u003c/code\u003e color table (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3043\"\u003e#3043\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFix \u003ccode\u003ekwargs\u003c/code\u003e dictionary getting mutated on each call (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3044\"\u003e#3044\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pygments/pygments/blob/master/CHANGES\"\u003epygments's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003eVersion 2.20.0\u003c/h2\u003e\n\u003cp\u003e(released March 29th, 2026)\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eNew lexers:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eRell (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2914\"\u003e#2914\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdated lexers:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003earchetype: Fix catastrophic backtracking in GUID and ID patterns (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3064\"\u003e#3064\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eASN.1: Recognize minus sign and fix range operator (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3014\"\u003e#3014\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3060\"\u003e#3060\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eC++: Add C++26 keywords (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2955\"\u003e#2955\u003c/a\u003e), add integer literal suffixes (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2966\"\u003e#2966\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eComponentPascal: Fix \u003ccode\u003eanalyse_text\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3028\"\u003e#3028\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3032\"\u003e#3032\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eCoq renamed to Rocq (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2883\"\u003e#2883\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2908\"\u003e#2908\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eCython: Various improvements (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2932\"\u003e#2932\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2933\"\u003e#2933\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eDebian control: Improve architecture parsing (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3052\"\u003e#3052\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eDevicetree: Add support for overlay/fragments (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3021\"\u003e#3021\u003c/a\u003e), add bytestring support (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3022\"\u003e#3022\u003c/a\u003e), fix catastrophic backtracking (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3057\"\u003e#3057\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFennel: Various improvements (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2911\"\u003e#2911\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eHaskell: Handle escape sequences in character literals (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3069\"\u003e#3069\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/pygments/pygments/issues/1795\"\u003e#1795\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eJava: Add module keywords (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2955\"\u003e#2955\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eLean4: Add operators \u003ccode\u003e]'\u003c/code\u003e, \u003ccode\u003e]?\u003c/code\u003e, \u003ccode\u003e]!\u003c/code\u003e  (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2946\"\u003e#2946\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eLESS: Support single-line comments (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3005\"\u003e#3005\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eLilyPond: Update to 2.25.29 (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2974\"\u003e#2974\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eLLVM: Support C-style comments (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3023\"\u003e#3023\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2978\"\u003e#2978\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eLua(u): Fix catastrophic backtracking (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3047\"\u003e#3047\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eMacaulay2: Update to 1.25.05 (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2893\"\u003e#2893\u003c/a\u003e), 1.25.11 (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2988\"\u003e#2988\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eMathematica: Various improvements (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2957\"\u003e#2957\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003emeson: Add additional operators (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2919\"\u003e#2919\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eMySQL: Update keywords (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2970\"\u003e#2970\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eorg-Mode: Support both schedule and deadline (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2899\"\u003e#2899\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ePHP: Add \u003ccode\u003e__PROPERTY__\u003c/code\u003e magic constant (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2924\"\u003e#2924\u003c/a\u003e), add reserved keywords (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3002\"\u003e#3002\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ePostgreSQL: Add more keywords (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2985\"\u003e#2985\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eprotobuf: Fix namespace tokenization (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2929\"\u003e#2929\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ePython: Add \u003ccode\u003et\u003c/code\u003e-string support (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2973\"\u003e#2973\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3009\"\u003e#3009\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3010\"\u003e#3010\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eTablegen: Fix infinite loop (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2972\"\u003e#2972\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2940\"\u003e#2940\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eTera Term macro: Add commands introduced in v5.3 through v5.6 (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2951\"\u003e#2951\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eTOML: Support TOML 1.1.0 (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3026\"\u003e#3026\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3027\"\u003e#3027\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eTurtle: Allow empty comment lines (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2980\"\u003e#2980\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eXML: Added \u003ccode\u003e.xbrl\u003c/code\u003e as file ending (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2890\"\u003e#2890\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2891\"\u003e#2891\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDrop Python 3.8, and add Python 3.14 as a supported version (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2987\"\u003e#2987\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3012\"\u003e#3012\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eVarious improvements to \u003ccode\u003eautopygmentize\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2894\"\u003e#2894\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate \u003ccode\u003eonedark\u003c/code\u003e style to support more token types (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2977\"\u003e#2977\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate \u003ccode\u003ertt\u003c/code\u003e style to support more token types (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2895\"\u003e#2895\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eCache entry points to improve performance (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2979\"\u003e#2979\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFix \u003ccode\u003exterm-256\u003c/code\u003e color table (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3043\"\u003e#3043\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFix \u003ccode\u003ekwargs\u003c/code\u003e dictionary getting mutated on each call (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3044\"\u003e#3044\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pygments/pygments/commit/708197d82827ba2d5ca78bcbb653c7102ce86dcd\"\u003e\u003ccode\u003e708197d\u003c/code\u003e\u003c/a\u003e Fix underline length.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pygments/pygments/commit/1d4538ae8621d766ecc91ff59caf76ab75983abc\"\u003e\u003ccode\u003e1d4538a\u003c/code\u003e\u003c/a\u003e Prepare 2.20 release.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pygments/pygments/commit/2ceaee4e634eebae2d10a47fd05406871f6bac8f\"\u003e\u003ccode\u003e2ceaee4\u003c/code\u003e\u003c/a\u003e Update CHANGES.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pygments/pygments/commit/e3a3c54b58c7f80bc4db887e471d4f91c77844ed\"\u003e\u003ccode\u003ee3a3c54\u003c/code\u003e\u003c/a\u003e Fix Haskell lexer: handle escape sequences in character literals (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3069\"\u003e#3069\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pygments/pygments/commit/d7c3453e342dac319f58e4091f4ef183cc49d802\"\u003e\u003ccode\u003ed7c3453\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3071\"\u003e#3071\u003c/a\u003e from pygments/harden-html-formatter\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pygments/pygments/commit/0f97e7c37d44abfa4ddfddf44a3290fdad586034\"\u003e\u003ccode\u003e0f97e7c\u003c/code\u003e\u003c/a\u003e Harden the HTML formatter against CSS.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pygments/pygments/commit/9f981b2ba42b88ca5bdcebf12cd01efd7cd80aec\"\u003e\u003ccode\u003e9f981b2\u003c/code\u003e\u003c/a\u003e Update CHANGES.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pygments/pygments/commit/1d889151024e9a53f3702a60558b29b070306e9e\"\u003e\u003ccode\u003e1d88915\u003c/code\u003e\u003c/a\u003e Update CHANGES.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pygments/pygments/commit/c3d93adb9827fc054c3c12b47bde31c781a36a93\"\u003e\u003ccode\u003ec3d93ad\u003c/code\u003e\u003c/a\u003e Fix ASN.1 lexer: recognize minus sign and fix range operator (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3060\"\u003e#3060\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pygments/pygments/commit/4f06bcf8a5ba3f2b5bda24a26ccf041a1a65d91e\"\u003e\u003ccode\u003e4f06bcf\u003c/code\u003e\u003c/a\u003e fix bad behaving backtracking regex in CommonLispLexer\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/pygments/pygments/compare/2.19.2...2.20.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `pyjwt` from 2.13.0 to 2.15.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/jpadilla/pyjwt/releases\"\u003epyjwt's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e2.15.0\u003c/h2\u003e\n\u003cp\u003eSee the \u003ca href=\"https://github.com/jpadilla/pyjwt/blob/2.15.0/CHANGELOG.rst\"\u003e2.15.0 changelog\u003c/a\u003e for complete release details.\u003c/p\u003e\n\u003ch2\u003e2.14.0\u003c/h2\u003e\n\u003cp\u003eSee the \u003ca href=\"https://github.com/jpadilla/pyjwt/blob/2.14.0/CHANGELOG.rst\"\u003e2.14.0 changelog\u003c/a\u003e for the complete release details and related security advisories.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/jpadilla/pyjwt/blob/master/CHANGELOG.rst\"\u003epyjwt's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e\u003ccode\u003ev2.15.0 \u0026lt;https://github.com/jpadilla/pyjwt/compare/2.14.0...2.15.0\u0026gt;\u003c/code\u003e__\u003c/h2\u003e\n\u003cp\u003eSecurity\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e\n- Wrap recursion errors from deeply nested JWT payloads in ``DecodeError``\n  instead of exposing a raw ``RecursionError``.\n\u003cp\u003eAdded\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e\n- Support Python 3.15 by @kytta in `[#1202](https://github.com/jpadilla/pyjwt/issues/1202) \u0026amp;lt;https://github.com/jpadilla/pyjwt/pull/1202\u0026amp;gt;`__\n\nChanged\n\u003c/code\u003e\u003c/pre\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eJWKSetCache\u003c/code\u003e now stores the parsed \u003ccode\u003ePyJWKSet\u003c/code\u003e rather than the raw JWKS\npayload, so a cache hit no longer re-parses every key. \u003ccode\u003eJWKSetCache.put()\u003c/code\u003e\naccepts either form and raises \u003ccode\u003ePyJWKSetError\u003c/code\u003e for anything else. As a\nresult, \u003ccode\u003ePyJWKClient.get_jwk_set()\u003c/code\u003e returns the same \u003ccode\u003ePyJWKSet\u003c/code\u003e instance\nfor as long as it stays cached, rather than a freshly built one per call in\n\u003ccode\u003e[#1208](https://github.com/jpadilla/pyjwt/issues/1208) \u0026amp;lt;https://github.com/jpadilla/pyjwt/pull/1208\u0026amp;gt;\u003c/code\u003e__\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ePyJWKClient.fetch_data()\u003c/code\u003e now raises\n\u003ccode\u003ePyJWKClientError(\u0026amp;quot;The JWKS endpoint did not return a JSON object\u0026amp;quot;)\u003c/code\u003e when\nthe endpoint response is not a JSON object, instead of returning it for\n\u003ccode\u003eget_jwk_set()\u003c/code\u003e to reject. Callers reaching the JWKS through\n\u003ccode\u003eget_jwk_set()\u003c/code\u003e see the same error as before in\n\u003ccode\u003e[#1208](https://github.com/jpadilla/pyjwt/issues/1208) \u0026amp;lt;https://github.com/jpadilla/pyjwt/pull/1208\u0026amp;gt;\u003c/code\u003e__\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eFixed\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e\n- Return cached ``PyJWKSet`` values from ``PyJWKClient.get_jwk_set()`` instead\n  of raising ``PyJWKClientError(\u0026amp;quot;The JWKS endpoint did not return a JSON\n  object\u0026amp;quot;)``. ``JWKSetCache.put()`` documents ``PyJWKSet`` as the cached value,\n  so callers pre-populating the cache to avoid a network round-trip could not\n  read it back in `[#914](https://github.com/jpadilla/pyjwt/issues/914) \u0026amp;lt;https://github.com/jpadilla/pyjwt/issues/914\u0026amp;gt;`__ and\n  `[#1208](https://github.com/jpadilla/pyjwt/issues/1208) \u0026amp;lt;https://github.com/jpadilla/pyjwt/pull/1208\u0026amp;gt;`__\n- ``PyJWKClient.get_jwk_set()`` now caches the key set it returns, so a\n  ``fetch_data()`` override that filters or transforms the JWKS is no longer\n  undone by the next cache hit in\n  `[#1208](https://github.com/jpadilla/pyjwt/issues/1208) \u0026amp;lt;https://github.com/jpadilla/pyjwt/pull/1208\u0026amp;gt;`__\n- Raise the documented ``PyJWTError`` subclass instead of leaking a\n  ``TypeError`` when the ``exp``, ``nbf``, or ``iat`` claim decodes to a\n  non-numeric, non-string value such as a list, dict, or ``null``.\n- Reject OKP JWK private keys when their public ``x`` component does not\n  match the private ``d`` component.\n- Treat malformed JWK Set members as unusable keys rather than letting\n  ``AttributeError`` or ``TypeError`` escape ``PyJWKSet``. A member that is not\n\u0026amp;lt;/tr\u0026amp;gt;\u0026amp;lt;/table\u0026amp;gt; \n\u0026lt;/code\u0026gt;\u0026lt;/pre\u0026gt;\n\u0026lt;/blockquote\u0026gt;\n\u0026lt;p\u0026gt;... (truncated)\u0026lt;/p\u0026gt;\n\u0026lt;/details\u0026gt;\n\u0026lt;details\u0026gt;\n\u0026lt;summary\u0026gt;Commits\u0026lt;/summary\u0026gt;\n\n\u0026lt;ul\u0026gt;\n\u0026lt;li\u0026gt;\u0026lt;a href=\u0026quot;https://github.com/jpadilla/pyjwt/commit/1d41a6478e1562e68ff667fcd703356acf085f68\u0026quot;\u0026gt;\u0026lt;code\u0026gt;1d41a64\u0026lt;/code\u0026gt;\u0026lt;/a\u0026gt; chore: prepare 2.15.0 release\u0026lt;/li\u0026gt;\n\u0026lt;li\u0026gt;\u0026lt;a href=\u0026quot;https://github.com/jpadilla/pyjwt/commit/9bc06658f875b9b40091539140bbbdc4639161c3\u0026quot;\u0026gt;\u0026lt;code\u0026gt;9bc0665\u0026lt;/code\u0026gt;\u0026lt;/a\u0026gt; fix: make recursive payload tests deterministic\u0026lt;/li\u0026gt;\n\u0026lt;li\u0026gt;\u0026lt;a href=\u0026quot;https://github.com/jpadilla/pyjwt/commit/5fde08a6cf906aa7698de2d6391d88b73006b17b\u0026quot;\u0026gt;\u0026lt;code\u0026gt;5fde08a\u0026lt;/code\u0026gt;\u0026lt;/a\u0026gt; fix: normalize recursive JWT payload errors\u0026lt;/li\u0026gt;\n\u0026lt;li\u0026gt;\u0026lt;a href=\u0026quot;https://github.com/jpadilla/pyjwt/commit/171062d2d734315272a901100aa4b109f2fc3c19\u0026quot;\u0026gt;\u0026lt;code\u0026gt;171062d\u0026lt;/code\u0026gt;\u0026lt;/a\u0026gt; utils: mention bytes in force_bytes type error (\u0026lt;a href=\u0026quot;https://redirect.github.com/jpadilla/pyjwt/issues/1173\u0026quot;\u0026gt;#1173\u0026lt;/a\u0026gt;)\u0026lt;/li\u0026gt;\n\u0026lt;li\u0026gt;\u0026lt;a href=\u0026quot;https://github.com/jpadilla/pyjwt/commit/c9d4d5375bf464ef363506fed9eb6e7f33217ab6\u0026quot;\u0026gt;\u0026lt;code\u0026gt;c9d4d53\u0026lt;/code\u0026gt;\u0026lt;/a\u0026gt; docs/conf: drop duplicate 'and' from read() docstring (\u0026lt;a href=\u0026quot;https://redirect.github.com/jpadilla/pyjwt/issues/1174\u0026quot;\u0026gt;#1174\u0026lt;/a\u0026gt;)\u0026lt;/li\u0026gt;\n\u0026lt;li\u0026gt;\u0026lt;a href=\u0026quot;https://github.com/jpadilla/pyjwt/commit/2763752196113e1473b0ed7905aa6034aedfbe53\u0026quot;\u0026gt;\u0026lt;code\u0026gt;2763752\u0026lt;/code\u0026gt;\u0026lt;/a\u0026gt; Add support for Python 3.15 (\u0026lt;a href=\u0026quot;https://redirect.github.com/jpadilla/pyjwt/issues/1202\u0026quot;\u0026gt;#1202\u0026lt;/a\u0026gt;)\u0026lt;/li\u0026gt;\n\u0026lt;li\u0026gt;\u0026lt;a href=\u0026quot;https://github.com/jpadilla/pyjwt/commit/4adcd02722f5011c60079d3978dfc167b9a8eaa5\u0026quot;\u0026gt;\u0026lt;code\u0026gt;4adcd02\u0026lt;/code\u0026gt;\u0026lt;/a\u0026gt; Catch http.client.HTTPException in PyJWKClient.fetch_data (\u0026lt;a href=\u0026quot;https://redirect.github.com/jpadilla/pyjwt/issues/1201\u0026quot;\u0026gt;#1201\u0026lt;/a\u0026gt;)\u0026lt;/li\u0026gt;\n\u0026lt;li\u0026gt;\u0026lt;a href=\u0026quot;https://github.com/jpadilla/pyjwt/commit/9e501d993b4d3e7dba14bdb1722b1d993ac75097\u0026quot;\u0026gt;\u0026lt;code\u0026gt;9e501d9\u0026lt;/code\u0026gt;\u0026lt;/a\u0026gt; fix: correct docstring typo in _validate_jti (\u0026lt;a href=\u0026quot;https://redirect.github.com/jpadilla/pyjwt/issues/1179\u0026quot;\u0026gt;#1179\u0026lt;/a\u0026gt;)\u0026lt;/li\u0026gt;\n\u0026lt;li\u0026gt;\u0026lt;a href=\u0026quot;https://github.com/jpadilla/pyjwt/commit/4047c44d51950ffda15f40054508d3f17c43b1e2\u0026quot;\u0026gt;\u0026lt;code\u0026gt;4047c44\u0026lt;/code\u0026gt;\u0026lt;/a\u0026gt; docs: clarify JWK certificate member handling (\u0026lt;a href=\u0026quot;https://redirect.github.com/jpadilla/pyjwt/issues/1212\u0026quot;\u0026gt;#1212\u0026lt;/a\u0026gt;)\u0026lt;/li\u0026gt;\n\u0026lt;li\u0026gt;\u0026lt;a href=\u0026quot;https://github.com/jpadilla/pyjwt/commit/f4e2b59f543cc82d46d9d69922bba59e804216b9\u0026quot;\u0026gt;\u0026lt;code\u0026gt;f4e2b59\u0026lt;/code\u0026gt;\u0026lt;/a\u0026gt; [pre-commit.ci] pre-commit autoupdate (\u0026lt;a href=\u0026quot;https://redirect.github.com/jpadilla/pyjwt/issues/1210\u0026quot;\u0026gt;#1210\u0026lt;/a\u0026gt;)\u0026lt;/li\u0026gt;\n\u0026lt;li\u0026gt;Additional commits viewable in \u0026lt;a href=\u0026quot;https://github.com/jpadilla/pyjwt/compare/2.13.0...2.15.0\u0026quot;\u0026gt;compare view\u0026lt;/a\u0026gt;\u0026lt;/li\u0026gt;\n\u0026lt;/ul\u0026gt;\n\u0026lt;/details\u0026gt;\n\n\u0026lt;br /\u0026gt;\u003c/code\u003e\u003c/pre\u003e\n\nUpdates `urllib3` from 2.7.0 to 2.8.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/urllib3/urllib3/releases\"\u003eurllib3's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e2.8.0\u003c/h2\u003e\n\u003ch2\u003e🚀 urllib3 is fundraising for HTTP/2 support\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://sethmlarson.dev/urllib3-is-fundraising-for-http2-support\"\u003eurllib3 is raising ~$40,000 USD\u003c/a\u003e to release HTTP/2 support and ensure long-term sustainable maintenance of the project. If your company or organization uses Python and would benefit from HTTP/2 support in Requests, pip, cloud SDKs, and thousands of other projects \u003ca href=\"https://opencollective.com/urllib3\"\u003eplease consider contributing financially\u003c/a\u003e to ensure HTTP/2 support is developed sustainably and maintained for the long-haul.\u003c/p\u003e\n\u003cp\u003eThank you for your support.\u003c/p\u003e\n\u003ch2\u003eSecurity\u003c/h2\u003e\n\u003cp\u003eFixed the following security issues:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eThe TLS configuration for HTTPS proxies could be ignored or overridden. (High severity, GHSA-8988-9cw3-xx77)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eHTTPResponse.stream()\u003c/code\u003e and \u003ccode\u003eread_chunked()\u003c/code\u003e could buffer a chunk-size line of unbounded length in memory. (High severity, GHSA-vxq7-64xx-v4gw)\u003c/li\u003e\n\u003cli\u003eChunked Deflate streaming could enter an infinite loop. (Medium severity, GHSA-gh4c-6fx4-qh6g)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cblockquote\u003e\n\u003cp\u003e[!IMPORTANT]\nurllib3 2.8.0 fixes HTTPS proxy TLS configuration being ignored or overridden by destination settings. Configurations relying on that behavior may require changes.\u003c/p\u003e\n\u003cp\u003eConfigure proxy CA certificates and client certificates in \u003ccode\u003eproxy_ssl_context\u003c/code\u003e, and proxy identity checks with \u003ccode\u003eproxy_assert_hostname\u003c/code\u003e or \u003ccode\u003eproxy_assert_fingerprint\u003c/code\u003e. Destination client certificates and identity overrides no longer apply to HTTPS forwarding proxy connections.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e[!NOTE]\nCVE IDs had not yet been assigned to these advisories at the time of release due to a backlog at GitHub's CNA.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2\u003eDeprecations \u0026amp; Removals\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eDeprecated using an empty collection as the \u003ccode\u003eRetry\u003c/code\u003e option \u003ccode\u003eallowed_methods\u003c/code\u003e to retry any verb. (\u003ca href=\"https://redirect.github.com/urllib3/urllib3/issues/5044\"\u003e#5044\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eFeatures\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eAdded \u003ccode\u003eUrl.auth_decoded\u003c/code\u003e and \u003ccode\u003eUrl.auth_decoded_joined\u003c/code\u003e convenience properties to the result of \u003ccode\u003eparse_url()\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/urllib3/urllib3/issues/4945\"\u003e#4945\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdded \u003ccode\u003ebasic_auth_encoding\u003c/code\u003e and \u003ccode\u003eproxy_basic_auth_encoding\u003c/code\u003e parameters to \u003ccode\u003eurllib3.util.make_headers()\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/urllib3/urllib3/issues/5092\"\u003e#5092\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eBugfixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eFixed response header handling to replace obsolete folded header lines (\u003ccode\u003eobs-fold\u003c/code\u003e) with spaces in accordance with RFC 9112, preventing raw CRLF sequences from appearing in header values such as \u003ccode\u003eSet-Cookie\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/urllib3/urllib3/issues/1362\"\u003e#1362\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFixed usage of \u003ccode\u003eproxy_ssl_context\u003c/code\u003e with \u003ccode\u003eProxyManager\u003c/code\u003e when \u003ccode\u003euse_forwarding_for_https=True\u003c/code\u003e. Passing \u003ccode\u003essl_context\u003c/code\u003e instead of \u003ccode\u003eproxy_ssl_context\u003c/code\u003e for HTTPS proxies in this configuration now emits a \u003ccode\u003eFutureWarning\u003c/code\u003e and will raise an error in v3.0. (\u003ca href=\"https://redirect.github.com/urllib3/urllib3/issues/2577\"\u003e#2577\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eChanged behavior of the default \u003ccode\u003eConnectionPool.pool\u003c/code\u003e initialization. \u003ccode\u003eLifoQueue\u003c/code\u003e is now resolved from the \u003ccode\u003equeue\u003c/code\u003e module after the \u003ccode\u003eConnectionPool\u003c/code\u003e is instantiated instead of using the default cached \u003ccode\u003eQueueCls\u003c/code\u003e class property. This is done because sometimes the \u003ccode\u003equeue.LifoQueue\u003c/code\u003e is monkey-patched late in the program, such as by gevent. (\u003ca href=\"https://redirect.github.com/urllib3/urllib3/issues/3289\"\u003e#3289\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRaised \u003ccode\u003eUnrewindableBodyError\u003c/code\u003e instead of \u003ccode\u003eValueError\u003c/code\u003e when retrying a request whose body had \u003ccode\u003etell()\u003c/code\u003e but not \u003ccode\u003eseek()\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/urllib3/urllib3/issues/3779\"\u003e#3779\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDecoded percent-encoded SOCKS proxy credentials before authenticating with the proxy server. (\u003ca href=\"https://redirect.github.com/urllib3/urllib3/issues/3785\"\u003e#3785\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFixed \u003ccode\u003eHTTPResponse.drain_conn()\u003c/code\u003e to discard unread response data in 64 KiB chunks (same as the default \u003ccode\u003eamt\u003c/code\u003e when doing \u003ccode\u003eHTTPResponse.stream(...)\u003c/code\u003e). (\u003ca href=\"https://redirect.github.com/urllib3/urllib3/issues/5019\"\u003e#5019\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFixed \u003ccode\u003eis_ipaddress()\u003c/code\u003e to detect non-standard IPv4 forms accepted by \u003ccode\u003esocket.connect\u003c/code\u003e, such as hex (\u003ccode\u003e0x7f000001\u003c/code\u003e), octal (\u003ccode\u003e0177.0.0.1\u003c/code\u003e), and decimal integers (\u003ccode\u003e2130706433\u003c/code\u003e), ensuring SSL certificate verification uses the correct mode for these addresses. (\u003ca href=\"https://redirect.github.com/urllib3/urllib3/issues/5029\"\u003e#5029\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFixed \u003ccode\u003eHTTPConnectionPool.urlopen\u003c/code\u003e raising a misleading \u003ccode\u003eFullPoolError\u003c/code\u003e instead of \u003ccode\u003eValueError\u003c/code\u003e when called with an invalid \u003ccode\u003etimeout\u003c/code\u003e argument on a pool created with \u003ccode\u003eblock=True\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/urllib3/urllib3/issues/5059\"\u003e#5059\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFixed port-zero handling to preserve explicit \u003ccode\u003e:0\u003c/code\u003e values instead of substituting the default ports 80 or 443 in URL parsing, pool selection, proxy configuration, \u003ccode\u003econnection_from_url()\u003c/code\u003e, and HTTP/2 request authority. (\u003ca href=\"https://redirect.github.com/urllib3/urllib3/issues/5071\"\u003e#5071\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/urllib3/urllib3/issues/5101\"\u003e#5101\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFixed a bug where \u003ccode\u003ePoolManager\u003c/code\u003e passed the \u003ccode\u003eassert_hostname\u003c/code\u003e and \u003ccode\u003eassert_fingerprint\u003c/code\u003e parameters to HTTP connection pools. (\u003ca href=\"https://redirect.github.com/urllib3/urllib3/issues/5077\"\u003e#5077\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFixed \u003ccode\u003eHTTPConnectionPool.urlopen()\u003c/code\u003e and HTTP proxy forwarding to strip URL fragments from absolute request targets before sending requests. (\u003ca href=\"https://redirect.github.com/urllib3/urllib3/issues/5079\"\u003e#5079\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAdded safeguards to the proxy tunneling code to prevent potential security issues when handling invalid characters in the proxy host and HTTP headers. This change affects users of Python 3.10, Python 3.11, and Python 3.12 when the standard library does not contain the fix; those on newer Python versions should upgrade to 3.13.14+ or 3.14.5+ to get the same security fixes. (\u003ca href=\"https://redirect.github.com/urllib3/urllib3/issues/5091\"\u003e#5091\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFixed \u003ccode\u003eHTTPSConnection.connect()\u003c/code\u003e overriding \u003ccode\u003eProxyConfig.ssl_context\u003c/code\u003e's certificate policy and proxy identity checks with the target connection's TLS settings when forwarding through an HTTPS proxy.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eHTTPSConnection\u003c/code\u003e no longer applies target SNI, assertions, or client credentials to forwarding proxy handshakes and continues to use its \u003ccode\u003essl_context\u003c/code\u003e as a fallback when an HTTPS proxy forwards an HTTP target. (\u003ca href=\"https://redirect.github.com/urllib3/urllib3/issues/5093\"\u003e#5093\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFixed URL parsing to more strictly enforce RFC 3986 host syntax, rejecting invalid host input such as raw spaces and control characters, malformed percent-encodings, and percent-encoded control characters in HTTP(S) hosts and IPv6 zone identifiers, including proxy CONNECT tunnel targets. Host normalization now also follows RFC 3986 normalization rules for percent-encoded octets by decoding percent-encoded unreserved characters and uppercasing the hexadecimal digits of retained percent-encoded octets. (\u003ca href=\"https://redirect.github.com/urllib3/urllib3/issues/5095\"\u003e#5095\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/urllib3/urllib3/blob/main/CHANGES.rst\"\u003eurllib3's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e2.8.0 (2026-09-15)\u003c/h1\u003e\n\u003ch2\u003eSecurity\u003c/h2\u003e\n\u003cp\u003eFixed the following security issues:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eThe TLS configuration for HTTPS proxies could be ignored or overridden.\n(High severity, \u003ccode\u003eGHSA-8988-9cw3-xx77 \u0026lt;https://github.com/urllib3/urllib3/security/advisories/GHSA-8988-9cw3-xx77\u0026gt;\u003c/code\u003e__)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eHTTPResponse.stream()\u003c/code\u003e and \u003ccode\u003eread_chunked()\u003c/code\u003e could buffer a chunk-size\nline of unbounded length in memory. (High severity,\n\u003ccode\u003eGHSA-vxq7-64xx-v4gw \u0026lt;https://github.com/urllib3/urllib3/security/advisories/GHSA-vxq7-64xx-v4gw\u0026gt;\u003c/code\u003e__)\u003c/li\u003e\n\u003cli\u003eChunked Deflate streaming could enter an infinite loop. (Medium severity,\n\u003ccode\u003eGHSA-gh4c-6fx4-qh6g \u0026lt;https://github.com/urllib3/urllib3/security/advisories/GHSA-gh4c-6fx4-qh6g\u0026gt;\u003c/code\u003e__)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e.. caution::\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eurllib3 2.8.0 fixes HTTPS proxy TLS configuration being ignored or\noverridden by destination settings. Configurations relying on that\nbehavior may require changes.\n\u003cp\u003eConfigure proxy CA certificates and client certificates in\n\u003ccode\u003eproxy_ssl_context\u003c/code\u003e, and proxy identity checks with\n\u003ccode\u003eproxy_assert_hostname\u003c/code\u003e or \u003ccode\u003eproxy_assert_fingerprint\u003c/code\u003e.\nDestination client certificates and identity overrides no longer\napply to HTTPS forwarding proxy connections.\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\n\u003ch2\u003eDeprecations \u0026amp; Removals\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eDeprecated using an empty collection as the \u003ccode\u003eRetry\u003c/code\u003e option\n\u003ccode\u003eallowed_methods\u003c/code\u003e to retry any verb.\n(\u003ccode\u003e[#5044](https://github.com/urllib3/urllib3/issues/5044) \u0026lt;https://github.com/urllib3/urllib3/issues/5044\u0026gt;\u003c/code\u003e__)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eFeatures\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eAdded \u003ccode\u003eUrl.auth_decoded\u003c/code\u003e and \u003ccode\u003eUrl.auth_decoded_joined\u003c/code\u003e convenience\nproperties to the result of \u003ccode\u003eparse_url()\u003c/code\u003e.\n(\u003ccode\u003e[#4945](https://github.com/urllib3/urllib3/issues/4945) \u0026lt;https://github.com/urllib3/urllib3/issues/4945\u0026gt;\u003c/code\u003e__)\u003c/li\u003e\n\u003cli\u003eAdded \u003ccode\u003ebasic_auth_encoding\u003c/code\u003e and \u003ccode\u003eproxy_basic_auth_encoding\u003c/code\u003e parameters to\n\u003ccode\u003eurllib3.util.make_headers()\u003c/code\u003e.\n(\u003ccode\u003e[#5092](https://github.com/urllib3/urllib3/issues/5092) \u0026lt;https://github.com/urllib3/urllib3/issues/5092\u0026gt;\u003c/code\u003e__)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eBugfixes\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/urllib3/urllib3/commit/b1d30ab61fe0db8f11092805e8c5ac43e091064a\"\u003e\u003ccode\u003eb1d30ab\u003c/code\u003e\u003c/a\u003e Release 2.8.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/urllib3/urllib3/commit/9016d7e8afc68185496ef07f3c3a4a743d04922e\"\u003e\u003ccode\u003e9016d7e\u003c/code\u003e\u003c/a\u003e Skip \u003ccode\u003etest_read_chunked_with_trailing_data_does_not_hang\u003c/code\u003e for brotlicffi (\u003ca href=\"https://redirect.github.com/urllib3/urllib3/issues/5258\"\u003e#5258\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/urllib3/urllib3/commit/9101f581a8b3659af23b6ff335ae77200ca33533\"\u003e\u003ccode\u003e9101f58\u003c/code\u003e\u003c/a\u003e Fix \u003ccode\u003enox -s docs\u003c/code\u003e warning (\u003ca href=\"https://redirect.github.com/urllib3/urllib3/issues/5256\"\u003e#5256\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/urllib3/urllib3/commit/cd770b059b543be29298ea5c52afb0b1b090f5ed\"\u003e\u003ccode\u003ecd770b0\u003c/code\u003e\u003c/a\u003e Merge commit from fork\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/urllib3/urllib3/commit/ea2ad7b21a80da3632f80016526a18864586077f\"\u003e\u003ccode\u003eea2ad7b\u003c/code\u003e\u003c/a\u003e Merge commit from fork\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/urllib3/urllib3/commit/0716e31534345dc1599ea95d903c79f276239bd8\"\u003e\u003ccode\u003e0716e31\u003c/code\u003e\u003c/a\u003e Fix loading unencrypted client keys with a password in pyOpenSSL (\u003ca href=\"https://redirect.github.com/urllib3/urllib3/issues/5255\"\u003e#5255\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/urllib3/urllib3/commit/43c68c8b43a9dcb44ed2cf4ec91384ca0d46b37d\"\u003e\u003ccode\u003e43c68c8\u003c/code\u003e\u003c/a\u003e Test pickling of \u003ccode\u003eInvalidChunkLength\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/urllib3/urllib3/issues/5247\"\u003e#5247\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/urllib3/urllib3/commit/308b279b3fb28e7bee952e152ec5baeb5bfd0817\"\u003e\u003ccode\u003e308b279\u003c/code\u003e\u003c/a\u003e Share security policy between GitHub and Read the Docs (\u003ca href=\"https://redirect.github.com/urllib3/urllib3/issues/5253\"\u003e#5253\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/urllib3/urllib3/commit/53fa0731b27d4b71ab0755ea5b896422d005d706\"\u003e\u003ccode\u003e53fa073\u003c/code\u003e\u003c/a\u003e Add policy on duplicate pull requests (\u003ca href=\"https://redirect.github.com/urllib3/urllib3/issues/5252\"\u003e#5252\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/urllib3/urllib3/commit/5f2a6a843d0100d1351c3f94d58581ca98d17267\"\u003e\u003ccode\u003e5f2a6a8\u003c/code\u003e\u003c/a\u003e Assert on the ALPN extension in test_tunnel_sets_http_11_alpn (\u003ca href=\"https://redirect.github.com/urllib3/urllib3/issues/5232\"\u003e#5232\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/urllib3/urllib3/compare/2.7.0...2.8.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `virtualenv` from 21.5.1 to 21.7.13\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pypa/virtualenv/releases\"\u003evirtualenv's releases\u003c/a\u003e....\n\n_Description has been truncated_","html_url":"https://github.com/cameronsjo/image-gen/pull/39","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/cameronsjo%2Fimage-gen/issues/39","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/39/packages"},{"uuid":"5853811782","node_id":"PR_kwDORgfIwM8AAAABIdr8lQ","number":223,"state":"closed","title":"build(deps): bump the other group across 1 directory with 10 updates","user":"dependabot[bot]","labels":["dependencies","python"],"assignees":["aisecnomad"],"locked":false,"comments_count":1,"pull_request":true,"closed_at":"2026-10-15T04:41:13.000Z","author_association":null,"state_reason":null,"created_at":"2026-10-14T18:59:03.000Z","updated_at":"2026-10-15T04:41:15.000Z","time_to_close":34930,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"build(deps): bump","group_name":"other","update_count":10,"packages":[{"name":"hypothesis","old_version":"6.168.3","new_version":"6.169.0","repository_url":"https://github.com/HypothesisWorks/hypothesis"},{"name":"ast-serialize","old_version":"0.11.2","new_version":"0.12.1","repository_url":"https://github.com/mypyc/ast_serialize"},{"name":"filelock","old_version":"4.0.9","new_version":"4.1.1","repository_url":"https://github.com/tox-dev/py-filelock"},{"name":"iniconfig","old_version":"2.3.0","new_version":"2.3.1","repository_url":"https://github.com/pytest-dev/iniconfig"},{"name":"platformdirs","old_version":"4.12.2","new_version":"4.13.0","repository_url":"https://github.com/tox-dev/platformdirs"},{"name":"python-discovery","old_version":"1.6.1","new_version":"1.6.2","repository_url":"https://github.com/tox-dev/python-discovery"},{"name":"rpds-py","old_version":"2026.6.3","new_version":"2026.9.1","repository_url":"https://github.com/crate-py/rpds"},{"name":"tomli","old_version":"2.4.1","new_version":"2.5.0","repository_url":"https://github.com/hukkin/tomli"},{"name":"types-requests","old_version":"2.33.0.20260906","new_version":"2.33.0.20261006","repository_url":"https://github.com/python/typeshed"},{"name":"virtualenv","old_version":"21.14.3","new_version":"21.14.6","repository_url":"https://github.com/pypa/virtualenv"}],"path":null,"ecosystem":"pip"},"body":"Bumps the other group with 10 updates in the / directory:\n\n| Package | From | To |\n| --- | --- | --- |\n| [hypothesis](https://github.com/HypothesisWorks/hypothesis) | `6.168.3` | `6.169.0` |\n| [ast-serialize](https://github.com/mypyc/ast_serialize) | `0.11.2` | `0.12.1` |\n| [filelock](https://github.com/tox-dev/py-filelock) | `4.0.9` | `4.1.1` |\n| [iniconfig](https://github.com/pytest-dev/iniconfig) | `2.3.0` | `2.3.1` |\n| [platformdirs](https://github.com/tox-dev/platformdirs) | `4.12.2` | `4.13.0` |\n| [python-discovery](https://github.com/tox-dev/python-discovery) | `1.6.1` | `1.6.2` |\n| [rpds-py](https://github.com/crate-py/rpds) | `2026.6.3` | `2026.9.1` |\n| [tomli](https://github.com/hukkin/tomli) | `2.4.1` | `2.5.0` |\n| [types-requests](https://github.com/python/typeshed) | `2.33.0.20260906` | `2.33.0.20261006` |\n| [virtualenv](https://github.com/pypa/virtualenv) | `21.14.3` | `21.14.6` |\n\n\nUpdates `hypothesis` from 6.168.3 to 6.169.0\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/82fa40ada6bc83480a746890a40bb3d708ba8f03\"\u003e\u003ccode\u003e82fa40a\u003c/code\u003e\u003c/a\u003e Bump hypothesis version to 6.169.0 and update changelog\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/0116655b33188ec4f32c80e43b2da34afd3deceb\"\u003e\u003ccode\u003e0116655\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/HypothesisWorks/hypothesis/issues/4899\"\u003e#4899\u003c/a\u003e from Arjun-Aravind/fix/uv-download-metadata-url\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/4f7ef96b165569427553bbb9303abcdf15fad227\"\u003e\u003ccode\u003e4f7ef96\u003c/code\u003e\u003c/a\u003e claude: exclude rarely-hit realize branch from coverage\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/4d42db9a0a15a6dbf6820c09b2208cde56adea81\"\u003e\u003ccode\u003e4d42db9\u003c/code\u003e\u003c/a\u003e Update uv download-metadata URL\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/1484f6dd4c0a220f68e2698afed29e2a16a3f654\"\u003e\u003ccode\u003e1484f6d\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/HypothesisWorks/hypothesis/issues/4896\"\u003e#4896\u003c/a\u003e from Liam-DeVoe/drop-python-3.10\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/ca2a4c6e3c6b979d9fbb5ef9db614885a736d2aa\"\u003e\u003ccode\u003eca2a4c6\u003c/code\u003e\u003c/a\u003e Bump hypothesis version to 6.168.5 and update changelog\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/c1c9957de83aad3facea6610b0bccecf141632f6\"\u003e\u003ccode\u003ec1c9957\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/HypothesisWorks/hypothesis/issues/4894\"\u003e#4894\u003c/a\u003e from MarcoGorelli/django-from-field-return-type\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/e3e5fea000e2ad0032332a51cc4f2b462eafb31f\"\u003e\u003ccode\u003ee3e5fea\u003c/code\u003e\u003c/a\u003e claude: address review comments\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/7c22da6b40925beedc9f38f88d00e36c8a4da7a2\"\u003e\u003ccode\u003e7c22da6\u003c/code\u003e\u003c/a\u003e claude: simplify add_note fallback\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/f6a8067cecc738cadb52f5d3f9e75cc93f8aff9f\"\u003e\u003ccode\u003ef6a8067\u003c/code\u003e\u003c/a\u003e claude: check ghostwriter golden outputs on 3.11 instead of 3.10\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/HypothesisWorks/hypothesis/compare/v6.168.3...v6.169.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `ast-serialize` from 0.11.2 to 0.12.1\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mypyc/ast_serialize/commit/8d0a5c6d1c87e29aa37c7292149086b514ccac93\"\u003e\u003ccode\u003e8d0a5c6\u003c/code\u003e\u003c/a\u003e Bump version to 0.12.1\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mypyc/ast_serialize/commit/a7f11b17731c0c3b9afc683e977e3faf90ba6c19\"\u003e\u003ccode\u003ea7f11b1\u003c/code\u003e\u003c/a\u003e Fix parsing plain None type in a string (\u003ca href=\"https://redirect.github.com/mypyc/ast_serialize/issues/96\"\u003e#96\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mypyc/ast_serialize/commit/bcf707f0d2c59a8033d2d8734849b2233f36f70d\"\u003e\u003ccode\u003ebcf707f\u003c/code\u003e\u003c/a\u003e Bump version to 0.12.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mypyc/ast_serialize/commit/89b6e832250fbc4d80739b318237f9571d6c32cc\"\u003e\u003ccode\u003e89b6e83\u003c/code\u003e\u003c/a\u003e Allow colon in error codes (\u003ca href=\"https://redirect.github.com/mypyc/ast_serialize/issues/94\"\u003e#94\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/mypyc/ast_serialize/compare/v0.11.2...v0.12.1\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `filelock` from 4.0.9 to 4.1.1\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/py-filelock/releases\"\u003efilelock's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e4.1.1\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003efeat(python): default to Python 3.15 by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/816\"\u003etox-dev/filelock#816\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(rw): avoid macOS descriptor lookups by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/820\"\u003etox-dev/filelock#820\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(tests): bound concurrent lock progress by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/819\"\u003etox-dev/filelock#819\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003etest: make lock error checks deterministic by \u003ca href=\"https://github.com/adenzhou1350\"\u003e\u003ccode\u003e@​adenzhou1350\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/817\"\u003etox-dev/filelock#817\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(read-write): reject a hostile pid in _owner_is_gone by \u003ca href=\"https://github.com/dxbjavid\"\u003e\u003ccode\u003e@​dxbjavid\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/821\"\u003etox-dev/filelock#821\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/adenzhou1350\"\u003e\u003ccode\u003e@​adenzhou1350\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/817\"\u003etox-dev/filelock#817\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/tox-dev/filelock/compare/4.1.0...4.1.1\"\u003ehttps://github.com/tox-dev/filelock/compare/4.1.0...4.1.1\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e4.1.0\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eci: download coverage during tool setup by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/776\"\u003etox-dev/filelock#776\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(api): validate timeout and poll_interval bounds by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/781\"\u003etox-dev/filelock#781\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(read-write): accept inf and reject nan timeouts by \u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/779\"\u003etox-dev/filelock#779\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft-rw): ignore non-ASCII generation names by \u003ca href=\"https://github.com/dxbjavid\"\u003e\u003ccode\u003e@​dxbjavid\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/778\"\u003etox-dev/filelock#778\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): check start token in is_lock_held_by_us by \u003ca href=\"https://github.com/lprnmns\"\u003e\u003ccode\u003e@​lprnmns\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/774\"\u003etox-dev/filelock#774\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): clean up marker when rollback close fails by \u003ca href=\"https://github.com/harbinresearcher\"\u003e\u003ccode\u003e@​harbinresearcher\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/775\"\u003etox-dev/filelock#775\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(read-write): clamp waits to threading.TIMEOUT_MAX by \u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/780\"\u003etox-dev/filelock#780\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): treat truncated markers as malformed by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/782\"\u003etox-dev/filelock#782\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(acquire): keep every acquire wait within the timeout by \u003ca href=\"https://github.com/feiiiiii5\"\u003e\u003ccode\u003e@​feiiiiii5\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/777\"\u003etox-dev/filelock#777\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e📝 docs: fix hanging example and platform claims by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/783\"\u003etox-dev/filelock#783\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(unix): keep peer marker on ENOSYS fallback by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/785\"\u003etox-dev/filelock#785\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(async): clear the task hold after a canceled release by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/789\"\u003etox-dev/filelock#789\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e✨ feat(api): export lease types and has_fcntl by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/790\"\u003etox-dev/filelock#790\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(strict): age private records by the filesystem clock by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/792\"\u003etox-dev/filelock#792\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(async): surface executor shutdown as an error by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/793\"\u003etox-dev/filelock#793\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): expire leases on the contender's clock by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/796\"\u003etox-dev/filelock#796\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft-rw): stop an acquire that close() overtook by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/798\"\u003etox-dev/filelock#798\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(strict): record claims before linking them by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/787\"\u003etox-dev/filelock#787\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): restore a live marker a stale break moved aside by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/786\"\u003etox-dev/filelock#786\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(api): chain errors on 3.10 without exceptiongroup by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/788\"\u003etox-dev/filelock#788\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): release a dropped SoftFileLease by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/791\"\u003etox-dev/filelock#791\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(read-write): keep probe fds until the last connection closes by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/794\"\u003etox-dev/filelock#794\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e📦 build(sdist): ship docs and update SECURITY.md by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/812\"\u003etox-dev/filelock#812\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft-rw): survive a removed generation log by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/795\"\u003etox-dev/filelock#795\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): tell PID namespaces apart in the marker host by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/797\"\u003etox-dev/filelock#797\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(async): release from the finalizer and keep I/O off the loop by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/800\"\u003etox-dev/filelock#800\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(strict): name what blocks the lock path by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/804\"\u003etox-dev/filelock#804\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(read-write): reject WAL databases and link beside the db by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/805\"\u003etox-dev/filelock#805\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(read-write): track read depth per thread by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/806\"\u003etox-dev/filelock#806\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): honour mode and tighten marker grammar by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/807\"\u003etox-dev/filelock#807\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🧪 test: drop timing races from two runner-load flakes by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/809\"\u003etox-dev/filelock#809\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/filelock/blob/main/docs/changelog.rst\"\u003efilelock's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e###########\nChangelog\n###########\u003c/p\u003e\n\u003cp\u003e.. towncrier-draft-entries:: Unreleased\u003c/p\u003e\n\u003cp\u003e.. towncrier release notes start\u003c/p\u003e\n\u003chr /\u003e\n\u003cp\u003e4.1.2 (2026-10-14)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eFix read-lock acquisition on SQLite versions older than 3.33.0 by using \u003ccode\u003esqlite_master\u003c/code\u003e for the schema probe. :pr:\u003ccode\u003e770\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eRaise \u003ccode\u003eIsADirectoryError\u003c/code\u003e (or \u003ccode\u003ePermissionError\u003c/code\u003e on Windows) for a directory lock path regardless of its write\npermissions. :pr:\u003ccode\u003e822\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eFix a forked child hanging at exit on PyPy when the parent forked while an\n:class:\u003ccode\u003e~filelock.AsyncReadWriteLock\u003c/code\u003e worker thread was between two operations. :pr:\u003ccode\u003e828\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eHash all cache keys in the lock filename recipe so short path-like keys stay in the chosen directory. The example also\naccepts path-derived surrogate escapes and works before the cache directory exists. :pr:\u003ccode\u003e824\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.1.1 (2026-10-11)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eBound the shared-lock contention test by worker progress so slow CI machines can finish the workload. :pr:\u003ccode\u003e819\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eAvoid the macOS \u003ccode\u003e/dev/fd\u003c/code\u003e lookup implicated in a kernel panic by opening SQLite through a validated hard link.\nThe database directory must be writable and support hard links; alias creation failure raises \u003ccode\u003eOSError\u003c/code\u003e. :pr:\u003ccode\u003e820\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eIgnore non-ASCII PID or start-time fields and out-of-range PIDs in \u003ccode\u003eReadWriteLock\u003c/code\u003e hard-link directory names so forged\nowners cannot abort acquisition. :pr:\u003ccode\u003e821\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eUse Python 3.15 for development and automation. :pr:\u003ccode\u003e816\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.1.0 (2026-10-09)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eImport :data:\u003ccode\u003e~filelock.OwnerMode\u003c/code\u003e, :data:\u003ccode\u003e~filelock.CompromiseReason\u003c/code\u003e and :data:\u003ccode\u003e~filelock.has_fcntl\u003c/code\u003e from\n\u003ccode\u003efilelock\u003c/code\u003e. :pr:\u003ccode\u003e790\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:class:\u003ccode\u003e~filelock.AcquireReturnProxy\u003c/code\u003e is generic in the lock type, so \u003ccode\u003ewith lock.acquire() as held:\u003c/code\u003e types \u003ccode\u003eheld\u003c/code\u003e as\nthe lock's own class. :pr:\u003ccode\u003e803\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eA :class:\u003ccode\u003e~filelock.Timeout\u003c/code\u003e from a soft lock names a holder on another host or in another PID namespace, which no\ncontender ever reclaims. :pr:\u003ccode\u003e815\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:attr:\u003ccode\u003e~filelock.SoftFileLock.is_lock_held_by_us\u003c/code\u003e and :attr:\u003ccode\u003e~filelock.MarkerSoftFileLock.is_lock_held_by_us\u003c/code\u003e return\n\u003ccode\u003eFalse\u003c/code\u003e for a marker an earlier process with the same PID left behind. :pr:\u003ccode\u003e774\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:class:\u003ccode\u003e~filelock.SoftFileLock\u003c/code\u003e removes its marker when writing it fails and closing the descriptor fails too, so the\nlock path no longer stays blocked. :pr:\u003ccode\u003e775\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:meth:\u003ccode\u003e~filelock.BaseFileLock.acquire\u003c/code\u003e and :meth:\u003ccode\u003e~filelock.BaseAsyncFileLock.acquire\u003c/code\u003e no longer wait past \u003ccode\u003etimeout\u003c/code\u003e\nwhen \u003ccode\u003epoll_interval\u003c/code\u003e is longer than the time left. :pr:\u003ccode\u003e777\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:class:\u003ccode\u003e~filelock.SoftReadWriteLock\u003c/code\u003e ignores a generation-log entry whose name is not 20 ASCII digits, which used to\nstop its heartbeat thread or delete real generations. :pr:\u003ccode\u003e778\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:class:\u003ccode\u003e~filelock.ReadWriteLock\u003c/code\u003e, :class:\u003ccode\u003e~filelock.SoftReadWriteLock\u003c/code\u003e and their async wrappers treat a\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/5830a7e2c39d387ae5320bb3be1fbb2aa7742d4a\"\u003e\u003ccode\u003e5830a7e\u003c/code\u003e\u003c/a\u003e Release 4.1.1\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/a5fb607a8655035bb6d5ae4326637e25cf1af849\"\u003e\u003ccode\u003ea5fb607\u003c/code\u003e\u003c/a\u003e fix(read-write): reject a hostile pid in _owner_is_gone (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/821\"\u003e#821\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/4c6f32f2797b2883bbcb0cca1ee81211d3e09c12\"\u003e\u003ccode\u003e4c6f32f\u003c/code\u003e\u003c/a\u003e test: make lock error checks deterministic (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/817\"\u003e#817\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/f11f52357425943a6dbffd36ea1112726255f970\"\u003e\u003ccode\u003ef11f523\u003c/code\u003e\u003c/a\u003e fix(tests): bound concurrent lock progress (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/819\"\u003e#819\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/5fd0c8f2e6a778da1933204e4a95bd84db9cdd43\"\u003e\u003ccode\u003e5fd0c8f\u003c/code\u003e\u003c/a\u003e fix(rw): avoid macOS descriptor lookups (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/820\"\u003e#820\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/0c3aaabc75ca927b2530b7264a04b965d64acf55\"\u003e\u003ccode\u003e0c3aaab\u003c/code\u003e\u003c/a\u003e feat(python): default to Python 3.15 (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/816\"\u003e#816\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/6c0ecc28f898f08cd0438cd489c3eaabad79a4b7\"\u003e\u003ccode\u003e6c0ecc2\u003c/code\u003e\u003c/a\u003e Release 4.1.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/df06bbd640765ad3f1ed4a096cbe29e64b5592bb\"\u003e\u003ccode\u003edf06bbd\u003c/code\u003e\u003c/a\u003e 🐛 fix: close regressions since 4.0.12 (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/815\"\u003e#815\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/071204515d211b560d203cb68105ec06789eab46\"\u003e\u003ccode\u003e0712045\u003c/code\u003e\u003c/a\u003e 🐛 fix(read-write): refuse a database moved mid-acquire (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/808\"\u003e#808\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/73fefc1e907457dd9bc9793eeba52f183d7f9c40\"\u003e\u003ccode\u003e73fefc1\u003c/code\u003e\u003c/a\u003e 📝 docs: point canonical and og:url at versioned pages (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/813\"\u003e#813\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/tox-dev/py-filelock/compare/4.0.9...4.1.1\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `iniconfig` from 2.3.0 to 2.3.1\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pytest-dev/iniconfig/releases\"\u003einiconfig's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003eVersion 2.3.1\u003c/h2\u003e\n\u003ch2\u003eFixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eParsing values with many continuation lines is now linear instead of quadratic in time (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/78\"\u003e#78\u003c/a\u003e, regarding \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/77\"\u003e#77\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003eA leading UTF-8 BOM is now stripped when reading INI files. Files saved by Windows editors used to fail with \u003ccode\u003eParseError\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/76\"\u003e#76\u003c/a\u003e, thanks \u003ca href=\"https://github.com/Pitchfork-and-Torch\"\u003e\u003ccode\u003e@​Pitchfork-and-Torch\u003c/code\u003e\u003c/a\u003e).\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eInternal\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003einiconfig._parse.ParsedLine.value\u003c/code\u003e is now a list of lines. This is private API.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eDocs\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eThe README example now uses \u003ccode\u003eIniConfig.parse()\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/79\"\u003e#79\u003c/a\u003e, thanks \u003ca href=\"https://github.com/MbappeWU\"\u003e\u003ccode\u003e@​MbappeWU\u003c/code\u003e\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003eFixed the issue tracker link (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/74\"\u003e#74\u003c/a\u003e, thanks \u003ca href=\"https://github.com/stefan6419846\"\u003e\u003ccode\u003e@​stefan6419846\u003c/code\u003e\u003c/a\u003e).\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull diff:\u003c/strong\u003e \u003ca href=\"https://github.com/pytest-dev/iniconfig/compare/v2.3.0...v2.3.1\"\u003ehttps://github.com/pytest-dev/iniconfig/compare/v2.3.0...v2.3.1\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e[pre-commit.ci] pre-commit autoupdate by \u003ca href=\"https://github.com/pre-commit-ci\"\u003e\u003ccode\u003e@​pre-commit-ci\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/71\"\u003epytest-dev/iniconfig#71\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[pre-commit.ci] pre-commit autoupdate by \u003ca href=\"https://github.com/pre-commit-ci\"\u003e\u003ccode\u003e@​pre-commit-ci\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/72\"\u003epytest-dev/iniconfig#72\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix link to issues by \u003ca href=\"https://github.com/stefan6419846\"\u003e\u003ccode\u003e@​stefan6419846\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/74\"\u003epytest-dev/iniconfig#74\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eparse_lines: keep values as list of lines, join once by \u003ca href=\"https://github.com/RonnyPfannschmidt\"\u003e\u003ccode\u003e@​RonnyPfannschmidt\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/78\"\u003epytest-dev/iniconfig#78\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[pre-commit.ci] pre-commit autoupdate by \u003ca href=\"https://github.com/pre-commit-ci\"\u003e\u003ccode\u003e@​pre-commit-ci\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/73\"\u003epytest-dev/iniconfig#73\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003etest: expect sorted \u003cstrong\u003eall\u003c/strong\u003e after ruff autofix by \u003ca href=\"https://github.com/RonnyPfannschmidt\"\u003e\u003ccode\u003e@​RonnyPfannschmidt\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/80\"\u003epytest-dev/iniconfig#80\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003edocs: use parse API in the README example by \u003ca href=\"https://github.com/MbappeWU\"\u003e\u003ccode\u003e@​MbappeWU\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/79\"\u003epytest-dev/iniconfig#79\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eStrip leading UTF-8 BOM when reading INI files by \u003ca href=\"https://github.com/Pitchfork-and-Torch\"\u003e\u003ccode\u003e@​Pitchfork-and-Torch\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/76\"\u003epytest-dev/iniconfig#76\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echangelog: add BOM stripping (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/76\"\u003e#76\u003c/a\u003e) to 2.3.1 by \u003ca href=\"https://github.com/RonnyPfannschmidt\"\u003e\u003ccode\u003e@​RonnyPfannschmidt\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/81\"\u003epytest-dev/iniconfig#81\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/stefan6419846\"\u003e\u003ccode\u003e@​stefan6419846\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/74\"\u003epytest-dev/iniconfig#74\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/MbappeWU\"\u003e\u003ccode\u003e@​MbappeWU\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/79\"\u003epytest-dev/iniconfig#79\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/Pitchfork-and-Torch\"\u003e\u003ccode\u003e@​Pitchfork-and-Torch\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/76\"\u003epytest-dev/iniconfig#76\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pytest-dev/iniconfig/compare/v2.3.0...v2.3.1\"\u003ehttps://github.com/pytest-dev/iniconfig/compare/v2.3.0...v2.3.1\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pytest-dev/iniconfig/blob/main/CHANGELOG\"\u003einiconfig's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e2.3.1\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003efix quadratic parse time for values with many continuation lines (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/78\"\u003e#78\u003c/a\u003e, regarding \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/77\"\u003e#77\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003estrip a leading UTF-8 BOM when reading INI files, which previously raised \u003ccode\u003eParseError\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/76\"\u003e#76\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003einternal: \u003ccode\u003einiconfig._parse.ParsedLine.value\u003c/code\u003e is now a list of lines\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/316fbfaf2752d89326e1e75b45cd070f5b5ace9a\"\u003e\u003ccode\u003e316fbfa\u003c/code\u003e\u003c/a\u003e changelog: add BOM stripping (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/76\"\u003e#76\u003c/a\u003e) to 2.3.1 (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/81\"\u003e#81\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/d2dcb7289291e7e7019c183659814d42f7264b2d\"\u003e\u003ccode\u003ed2dcb72\u003c/code\u003e\u003c/a\u003e Strip leading UTF-8 BOM when reading INI files (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/76\"\u003e#76\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/40d8c03a1553953350d787e45f1cb768e2c14e6a\"\u003e\u003ccode\u003e40d8c03\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/79\"\u003e#79\u003c/a\u003e from MbappeWU/codex/docs-parse-inline-comments\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/48359c3a7c2c8648a134ea8469e802b5aa8d5030\"\u003e\u003ccode\u003e48359c3\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/80\"\u003e#80\u003c/a\u003e from pytest-dev/claude/fix-iniconfig-test-eukh2n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/b153213a011fa92f4370c83cef614cf73c987f57\"\u003e\u003ccode\u003eb153213\u003c/code\u003e\u003c/a\u003e test: expect sorted \u003cstrong\u003eall\u003c/strong\u003e after ruff RUF022 autofix\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/4fddfabc850afee28178931c62535ba1c2b30c72\"\u003e\u003ccode\u003e4fddfab\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/73\"\u003e#73\u003c/a\u003e from pytest-dev/pre-commit-ci-update-config\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/15852c2d1f9178ff960bf6c39a6f0f1495f1009e\"\u003e\u003ccode\u003e15852c2\u003c/code\u003e\u003c/a\u003e [pre-commit.ci] auto fixes from pre-commit.com hooks\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/2e68639c3f41ea5b693f89807172cf304c94fb9e\"\u003e\u003ccode\u003e2e68639\u003c/code\u003e\u003c/a\u003e [pre-commit.ci] pre-commit autoupdate\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/23c9e088a909f16d0d8dc03b5090c66964c428b0\"\u003e\u003ccode\u003e23c9e08\u003c/code\u003e\u003c/a\u003e docs: use parse API in the README example\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/e038536fbee6b5e76b180fce6694fd54661ced12\"\u003e\u003ccode\u003ee038536\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/78\"\u003e#78\u003c/a\u003e from RonnyPfannschmidt/claude/dazzling-einstein-h8zq7m\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/pytest-dev/iniconfig/compare/v2.3.0...v2.3.1\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `platformdirs` from 4.12.2 to 4.13.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/platformdirs/releases\"\u003eplatformdirs's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e4.13.0\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003efix: recognize Homebrew Cellar framework prefixes by \u003ca href=\"https://github.com/sricharanreddycheruku\"\u003e\u003ccode\u003e@​sricharanreddycheruku\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/612\"\u003etox-dev/platformdirs#612\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat(python): require 3.11 and default to 3.15 by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/613\"\u003etox-dev/platformdirs#613\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/sricharanreddycheruku\"\u003e\u003ccode\u003e@​sricharanreddycheruku\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/612\"\u003etox-dev/platformdirs#612\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/tox-dev/platformdirs/compare/4.12.4...4.13.0\"\u003ehttps://github.com/tox-dev/platformdirs/compare/4.12.4...4.13.0\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e4.12.4\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eci: download coverage during tool setup by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/609\"\u003etox-dev/platformdirs#609\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(api): keep root's site dir readable in place_*_file by \u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/610\"\u003etox-dev/platformdirs#610\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix: fall back from unreachable runtime directory with ensure_exists by \u003ca href=\"https://github.com/harbinresearcher\"\u003e\u003ccode\u003e@​harbinresearcher\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/611\"\u003etox-dev/platformdirs#611\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/harbinresearcher\"\u003e\u003ccode\u003e@​harbinresearcher\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/611\"\u003etox-dev/platformdirs#611\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/tox-dev/platformdirs/compare/4.12.3...4.12.4\"\u003ehttps://github.com/tox-dev/platformdirs/compare/4.12.3...4.12.4\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e4.12.3\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003ePlace root config and data files in the first site directory by \u003ca href=\"https://github.com/PDGGK\"\u003e\u003ccode\u003e@​PDGGK\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/607\"\u003etox-dev/platformdirs#607\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/PDGGK\"\u003e\u003ccode\u003e@​PDGGK\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/607\"\u003etox-dev/platformdirs#607\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/tox-dev/platformdirs/compare/4.12.2...4.12.3\"\u003ehttps://github.com/tox-dev/platformdirs/compare/4.12.2...4.12.3\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/platformdirs/blob/main/docs/changelog.rst\"\u003eplatformdirs's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e###########\nChangelog\n###########\u003c/p\u003e\n\u003cp\u003e.. towncrier-draft-entries:: Unreleased\u003c/p\u003e\n\u003cp\u003e.. towncrier release notes start\u003c/p\u003e\n\u003chr /\u003e\n\u003cp\u003e4.13.0 (2026-10-10)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eDetect Homebrew Python for the :class:\u003ccode\u003e~platformdirs.macos.MacOS\u003c/code\u003e site directories under :option:\u003ccode\u003epython:-S\u003c/code\u003e, which\nleaves :data:\u003ccode\u003esys.base_prefix\u003c/code\u003e on the \u003ccode\u003eCellar\u003c/code\u003e keg, and for the \u003ccode\u003epython-freethreading\u003c/code\u003e formula - by\n:user:\u003ccode\u003esricharanreddycheruku\u003c/code\u003e. :pr:\u003ccode\u003e612\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eUse Python 3.15 for development and automation. :pr:\u003ccode\u003e613\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.12.4 (2026-10-07)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eKeep site directories readable by other users when root calls\n:meth:\u003ccode\u003e~platformdirs.api.PlatformDirsABC.place_config_file\u003c/code\u003e or another \u003ccode\u003eplace_*_file\u003c/code\u003e method with\n:attr:\u003ccode\u003e~platformdirs.api.PlatformDirsABC.use_site_for_root\u003c/code\u003e - by :user:\u003ccode\u003edarrenhuai\u003c/code\u003e. :pr:\u003ccode\u003e610\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eMake :func:\u003ccode\u003e~platformdirs.user_runtime_dir\u003c/code\u003e warn and fall back from an unreachable \u003ccode\u003eXDG_RUNTIME_DIR\u003c/code\u003e under\n:attr:\u003ccode\u003e~platformdirs.api.PlatformDirsABC.ensure_exists\u003c/code\u003e instead of raising. :pr:\u003ccode\u003e611\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.12.3 (2026-10-03)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003ePlace files from \u003ccode\u003eplace_config_file\u003c/code\u003e and \u003ccode\u003eplace_data_file\u003c/code\u003e in the first site directory for root on Unix with\n\u003ccode\u003euse_site_for_root=True\u003c/code\u003e and \u003ccode\u003emultipath=True\u003c/code\u003e, where \u003ccode\u003efind_config_file\u003c/code\u003e and \u003ccode\u003efind_data_file\u003c/code\u003e look for them.\n:pr:\u003ccode\u003e607\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.12.2 (2026-09-29)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eKeep \u003ccode\u003eos.pathsep\u003c/code\u003e in \u003ccode\u003esite_applications_path\u003c/code\u003e under \u003ccode\u003emultipath=True\u003c/code\u003e on platforms with one applications\ndirectory. :pr:\u003ccode\u003e604\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.12.1 (2026-09-28)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eAvoid \u003ccode\u003ePytestAssertRewriteWarning\u003c/code\u003e when importing \u003ccode\u003eplatformdirs\u003c/code\u003e before invoking pytest. :pr:\u003ccode\u003e601\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.12.0 (2026-09-26)\u003c/p\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/f05fb4ef31f38dfc316802c5301db972fd75468e\"\u003e\u003ccode\u003ef05fb4e\u003c/code\u003e\u003c/a\u003e Release 4.13.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/b3174fdd4e80c83d72cf723fd2a7bb6cb54cbd5f\"\u003e\u003ccode\u003eb3174fd\u003c/code\u003e\u003c/a\u003e feat(python): require 3.11 and default to 3.15 (\u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/issues/613\"\u003e#613\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/d7eb4fe34231df80a6b1c7abc362aa504feddbf1\"\u003e\u003ccode\u003ed7eb4fe\u003c/code\u003e\u003c/a\u003e fix: recognize Homebrew Cellar framework prefixes (\u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/issues/612\"\u003e#612\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/19338a4fdfc0cdd6b5342ec137efd9e5613d67d2\"\u003e\u003ccode\u003e19338a4\u003c/code\u003e\u003c/a\u003e Release 4.12.4\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/f2a4fa944f3637c8e7aa1fe8e95c9adfefe8ed2c\"\u003e\u003ccode\u003ef2a4fa9\u003c/code\u003e\u003c/a\u003e fix: fall back from unreachable runtime directory with ensure_exists (\u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/issues/611\"\u003e#611\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/16429e2135fa70b314ef69fa7da4d5e746eb75c9\"\u003e\u003ccode\u003e16429e2\u003c/code\u003e\u003c/a\u003e 🐛 fix(api): keep root's site dir readable in place_*_file (\u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/issues/610\"\u003e#610\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/b9735d3c9f4a0b5ca4dafc15b53541fe3973f453\"\u003e\u003ccode\u003eb9735d3\u003c/code\u003e\u003c/a\u003e ci: download coverage during tool setup (\u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/issues/609\"\u003e#609\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/344f2497bce1fba7838ef112f2bd91e9d5f23b58\"\u003e\u003ccode\u003e344f249\u003c/code\u003e\u003c/a\u003e [pre-commit.ci] pre-commit autoupdate (\u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/issues/608\"\u003e#608\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/960ff632eb575deb6f0d5bf49519d5a2ee2098b6\"\u003e\u003ccode\u003e960ff63\u003c/code\u003e\u003c/a\u003e Release 4.12.3\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/8047ad5bf0e5fd3db9c8ce9f250f73c3d961fe19\"\u003e\u003ccode\u003e8047ad5\u003c/code\u003e\u003c/a\u003e Place root config and data files in the first site directory (\u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/issues/607\"\u003e#607\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/tox-dev/platformdirs/compare/4.12.2...4.13.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `python-discovery` from 1.6.1 to 1.6.2\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/python-discovery/releases\"\u003epython-discovery's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev1.6.2\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003efix: ignore broken sphinx-llm release by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/pull/134\"\u003etox-dev/python-discovery#134\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e👷 ci: pin ubuntu-26.04 and bump dependencies by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/pull/138\"\u003etox-dev/python-discovery#138\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eci: run old Python checks in parallel by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/pull/140\"\u003etox-dev/python-discovery#140\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat(python): default to 3.15 and match virtualenv by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/pull/142\"\u003etox-dev/python-discovery#142\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(cache): discard unusable interpreter cache entries by \u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/pull/141\"\u003etox-dev/python-discovery#141\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(query): validate PY_DISCOVERY_TIMEOUT by \u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/pull/143\"\u003etox-dev/python-discovery#143\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/pull/141\"\u003etox-dev/python-discovery#141\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/tox-dev/python-discovery/compare/1.6.1...1.6.2\"\u003ehttps://github.com/tox-dev/python-discovery/compare/1.6.1...1.6.2\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/python-discovery/blob/main/docs/changelog.rst\"\u003epython-discovery's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003eBug fixes - 1.6.2\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eDiscard malformed interpreter cache entries and query the interpreter again, including entries with missing,\nnon-string or unusable \u003ccode\u003esystem_executable\u003c/code\u003e paths - by :user:\u003ccode\u003edarrenhuai\u003c/code\u003e. (:issue:\u003ccode\u003e141\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eUse the default interpreter query timeout and warn for invalid \u003ccode\u003ePY_DISCOVERY_TIMEOUT\u003c/code\u003e values. Accept \u003ccode\u003einf\u003c/code\u003e\nor values above the subprocess wait limit to disable the timeout - by :user:\u003ccode\u003edarrenhuai\u003c/code\u003e. (:issue:\u003ccode\u003e143\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003ev1.6.1 (2026-09-18)\u003c/p\u003e\n\u003chr /\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/4fe2ade736e5191de42ca3d4a0b8bf672ffc5652\"\u003e\u003ccode\u003e4fe2ade\u003c/code\u003e\u003c/a\u003e release 1.6.2\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/60ddef109aafdd6d54aa25c8057a569c76e3dba2\"\u003e\u003ccode\u003e60ddef1\u003c/code\u003e\u003c/a\u003e fix(query): validate PY_DISCOVERY_TIMEOUT (\u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/issues/143\"\u003e#143\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/eb1eab726924245c533ad867d1b4bcc4c47b6d2a\"\u003e\u003ccode\u003eeb1eab7\u003c/code\u003e\u003c/a\u003e fix(cache): discard unusable interpreter cache entries (\u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/issues/141\"\u003e#141\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/db810b8206339892c0cd15f000b8e18860a8b913\"\u003e\u003ccode\u003edb810b8\u003c/code\u003e\u003c/a\u003e feat(python): default to 3.15 and match virtualenv (\u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/issues/142\"\u003e#142\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/614afa4adaa5fb36daf38919e3c407af71f3260b\"\u003e\u003ccode\u003e614afa4\u003c/code\u003e\u003c/a\u003e ci: run old Python checks in parallel (\u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/issues/140\"\u003e#140\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/9148aa454b276b5745d56bb2a42bdc8f26ee7f55\"\u003e\u003ccode\u003e9148aa4\u003c/code\u003e\u003c/a\u003e [pre-commit.ci] pre-commit autoupdate (\u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/issues/139\"\u003e#139\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/a69c0d9139ff0f1276d318d75d25d59cbc172bf4\"\u003e\u003ccode\u003ea69c0d9\u003c/code\u003e\u003c/a\u003e 👷 ci: pin ubuntu-26.04 and bump dependencies (\u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/issues/138\"\u003e#138\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/c8fcbf599ac401c8b1ad793187b28e45ccd1ffc8\"\u003e\u003ccode\u003ec8fcbf5\u003c/code\u003e\u003c/a\u003e build(deps): bump astral-sh/setup-uv from 10.1.0 to 10.2.0 in the github-acti...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/f0b3a2030c57a4f9217cd6ab09f837123ad0bc17\"\u003e\u003ccode\u003ef0b3a20\u003c/code\u003e\u003c/a\u003e [pre-commit.ci] pre-commit autoupdate (\u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/issues/136\"\u003e#136\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/b4eea32e584c0c1f08c9ad4b9f5850cb8c2275da\"\u003e\u003ccode\u003eb4eea32\u003c/code\u003e\u003c/a\u003e build(deps): bump astral-sh/setup-uv from 10.0.1 to 10.1.0 in the github-acti...\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/tox-dev/python-discovery/compare/1.6.1...1.6.2\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `rpds-py` from 2026.6.3 to 2026.9.1\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/crate-py/rpds/commit/fc7a1853152f23ee056c07fc97bb2a63557553ed\"\u003e\u003ccode\u003efc7a185\u003c/code\u003e\u003c/a\u003e Release rpds-py version 2026.9.1\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/crate-py/rpds/commit/d19ef61c41045976356e869a0490c40e11b701f7\"\u003e\u003ccode\u003ed19ef61\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/crate-py/rpds/issues/311\"\u003e#311\u003c/a\u003e from edgarrmondragon/pypy312\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/crate-py/rpds/commit/47ac82fa8f7303d3a72dac0d336f0a7792631f18\"\u003e\u003ccode\u003e47ac82f\u003c/code\u003e\u003c/a\u003e Bump PyO3 to 0.29.3 and start building PyPy 3.12 wheels\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/crate-py/rpds/commit/cf0900dee2eb945f38124893c306116829215b2b\"\u003e\u003ccode\u003ecf0900d\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/crate-py/rpds/issues/308\"\u003e#308\u003c/a\u003e from crate-py/dependabot/github_actions/github/codeql...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/crate-py/rpds/commit/204fd02dd2c1c7c1efa722dc151be68e865a60de\"\u003e\u003ccode\u003e204fd02\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/crate-py/rpds/issues/309\"\u003e#309\u003c/a\u003e from crate-py/dependabot/github_actions/astral-sh/set...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/crate-py/rpds/commit/264fdef59c9c85a0d9ff1ff603cfc7f15739d169\"\u003e\u003ccode\u003e264fdef\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/crate-py/rpds/issues/310\"\u003e#310\u003c/a\u003e from crate-py/pre-commit-ci-update-config\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/crate-py/rpds/commit/5ddee5c339c87c591b3ed85b848a677e5f43ddc5\"\u003e\u003ccode\u003e5ddee5c\u003c/code\u003e\u003c/a\u003e [pre-commit.ci] pre-commit autoupdate\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/crate-py/rpds/commit/9fe33188f058b7686775737bc839ec076956ec21\"\u003e\u003ccode\u003e9fe3318\u003c/code\u003e\u003c/a\u003e Bump astral-sh/setup-uv from 10.1.0 to 10.2.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/crate-py/rpds/commit/2302c70d7db939ce0fc77215923a790179a21e0f\"\u003e\u003ccode\u003e2302c70\u003c/code\u003e\u003c/a\u003e Bump github/codeql-action/upload-sarif from 4.38.0 to 4.38.1\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/crate-py/rpds/commit/93bbcbbb62008402aecfdbd8830377d1e2270514\"\u003e\u003ccode\u003e93bbcbb\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/crate-py/rpds/issues/305\"\u003e#305\u003c/a\u003e from crate-py/dependabot/github_actions/astral-sh/set...\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/crate-py/rpds/compare/v2026.6.3...v2026.9.1\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `tomli` from 2.4.1 to 2.5.0\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/hukkin/tomli/blob/master/CHANGELOG.md\"\u003etomli's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e2.5.0\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eAdded\n\u003cul\u003e\n\u003cli\u003eBinary wheels for Python 3.15\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eFixed\n\u003cul\u003e\n\u003cli\u003eSet nested inline array/table limit to 400 to fix mypyc generated binaries crashing unrecoverably in constrained environments (e.g. worker thread in a \u003ccode\u003epython:3.13-alpine\u003c/code\u003e image)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e2.3.1\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eFixed\n\u003cul\u003e\n\u003cli\u003eBackport: Limit number of parts of a TOML key to address quadratic time complexity\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/hukkin/tomli/commit/a2a578949199336ebc3884eeba4aede87da41ef2\"\u003e\u003ccode\u003ea2a5789\u003c/code\u003e\u003c/a\u003e Bump version: 2.4.1 → 2.5.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/hukkin/tomli/commit/94a60819c4f0b244829513f19f3caf64ef16b466\"\u003e\u003ccode\u003e94a6081\u003c/code\u003e\u003c/a\u003e Add 2.5.0 changelog\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/hukkin/tomli/commit/85f8748d51e42f4bb1f4969e3911fa8e52eaa7b5\"\u003e\u003ccode\u003e85f8748\u003c/code\u003e\u003c/a\u003e Update README.md\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/hukkin/tomli/commit/70fd4609dd97ea30ade101a4c8deb37ff2d694ed\"\u003e\u003ccode\u003e70fd460\u003c/code\u003e\u003c/a\u003e Allow flit_core v4\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/hukkin/tomli/commit/00d06107cad00485e1d4eb0b51a2ec3980d52c1c\"\u003e\u003ccode\u003e00d0610\u003c/code\u003e\u003c/a\u003e Update pre-commit\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/hukkin/tomli/commit/eb93c1225a5540e61a3a4054673e364fc6efe307\"\u003e\u003ccode\u003eeb93c12\u003c/code\u003e\u003c/a\u003e Improve tomllib compatibility and sync docs (\u003ca href=\"https://redirect.github.com/hukkin/tomli/issues/299\"\u003e#299\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/hukkin/tomli/commit/18d8d59db6d632ebbcfe63f1f7636145d652da21\"\u003e\u003ccode\u003e18d8d59\u003c/code\u003e\u003c/a\u003e Bump cibuildwheel for Python 3.15 wheels (\u003ca href=\"https://redirect.github.com/hukkin/tomli/issues/317\"\u003e#317\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/hukkin/tomli/commit/1e6e869aa9dbbddc492608944e82d9ad5397280f\"\u003e\u003ccode\u003e1e6e869\u003c/code\u003e\u003c/a\u003e Set smaller MAX_INLINE_NESTING to avoid python:3.13-alpine worker thread crash\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/hukkin/tomli/commit/c3299981db699cacabbd6edd0e32934f5e3e600b\"\u003e\u003ccode\u003ec329998\u003c/code\u003e\u003c/a\u003e Use Trusted Publishing\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/hukkin/tomli/commit/ba611c5a97da9226533e3c39d5c46c0b55b80acb\"\u003e\u003ccode\u003eba611c5\u003c/code\u003e\u003c/a\u003e Add zizmor security scanner to pre-commit (\u003ca href=\"https://redirect.github.com/hukkin/tomli/issues/301\"\u003e#301\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/hukkin/tomli/compare/2.4.1...2.5.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `types-requests` from 2.33.0.20260906 to 2.33.0.20261006\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/python/typeshed/commits\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `virtualenv` from 21.14.3 to 21.14.6\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pypa/virtualenv/releases\"\u003evirtualenv's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e21.14.6\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e👷 ci: pin ubuntu-26.04, clear warnings, bump deps by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3378\"\u003epypa/virtualenv#3378\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(ci): defer upgrades blocked by release age by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3379\"\u003epypa/virtualenv#3379\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eci: overlap release transfers and verification by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3382\"\u003epypa/virtualenv#3382\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(seed): guard every embed update log read, not just one by \u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3383\"\u003epypa/virtualenv#3383\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.14.5...21.14.6\"\u003ehttps://github.com/pypa/virtualenv/compare/21.14.5...21.14.6\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e21.14.5\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e🎨 style(test): mark prompt fixture locals Final by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3374\"\u003epypa/virtualenv#3374\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🎨 style: give every Final annotation its type by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3375\"\u003epypa/virtualenv#3375\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(ci): dump stacks from a thread that holds the GIL by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3377\"\u003epypa/virtualenv#3377\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eReset the embed update log when it cannot be read by \u003ca href=\"https://github.com/pasmud\"\u003e\u003ccode\u003e@​pasmud\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3376\"\u003epypa/virtualenv#3376\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.14.4...21.14.5\"\u003ehttps://github.com/pypa/virtualenv/compare/21.14.4...21.14.5\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e21.14.4\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eUpgrade embedded pip/setuptools/wheel and CI test tools by \u003ca href=\"https://github.com/github-actions\"\u003e\u003ccode\u003e@​github-actions\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3372\"\u003epypa/virtualenv#3372\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e📝 docs(changelog): note the zsh prompt fix by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3373\"\u003epypa/virtualenv#3373\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.14.3...21.14.4\"\u003ehttps://github.com/pypa/virtualenv/compare/21.14.3...21.14.4\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pypa/virtualenv/blob/main/docs/changelog.rst\"\u003evirtualenv's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003eBugfixes - 21.14.6\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eFall back to the bundled seed wheel with periodic update on (the default) when the embed update log holds JSON of the\nwrong shape, instead of downloading the wheel or, offline, failing to create the environment - by :user:\u003ccode\u003edarrenhuai\u003c/code\u003e.\n(:issue:\u003ccode\u003e3383\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003ev21.14.5 (2026-10-02)\u003c/p\u003e\n\u003chr /\u003e\n\u003ch1\u003eBugfixes - 21.14.5\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eFall back to the bundled seed wheel and remove the embed update log when the log in the app data folder holds JSON of\nthe wrong shape, instead of failing to create the environment - by :user:\u003ccode\u003epasmud\u003c/code\u003e. (:issue:\u003ccode\u003e3376\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003ev21.14.4 (2026-10-02)\u003c/p\u003e\n\u003chr /\u003e\n\u003ch1\u003eBugfixes - 21.14.4\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eFix \u003ccode\u003eactivate\u003c/code\u003e running commands from a virtual environment name or \u003ccode\u003e--prompt\u003c/code\u003e that holds \u003ccode\u003e$(...)\u003c/code\u003e, backticks or\n\u003ccode\u003e${...}\u003c/code\u003e when zsh has \u003ccode\u003ePROMPT_SUBST\u003c/code\u003e set, and show a \u003ccode\u003e%\u003c/code\u003e in the name as typed under zsh (\u003ccode\u003eGHSA-5vjq-rrrf-7h2q \u0026lt;https://github.com/pypa/virtualenv/security/advisories/GHSA-5vjq-rrrf-7h2q\u0026gt;\u003c/code\u003e_); reported by :user:\u003ccode\u003ekemrec\u003c/code\u003e.\n(:issue:\u003ccode\u003e3373\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003ev21.14.3 (2026-10-01)\u003c/p\u003e\n\u003chr /\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/9e69ac725fd4dc83726536c084ab9ca4f099c5b6\"\u003e\u003ccode\u003e9e69ac7\u003c/code\u003e\u003c/a\u003e release 21.14.6\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/464c34b696c81190cd1ad6589158f6ce59467351\"\u003e\u003ccode\u003e464c34b\u003c/code\u003e\u003c/a\u003e 🐛 fix(seed): guard every embed update log read, not just one (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3383\"\u003e#3383\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/3f56d7f4b88884296249b83889d717c41ed6e668\"\u003e\u003ccode\u003e3f56d7f\u003c/code\u003e\u003c/a\u003e ci: overlap release transfers and verification (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3382\"\u003e#3382\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/7577efd46b0e62c5edbd803ded2788eb6d48f5ca\"\u003e\u003ccode\u003e7577efd\u003c/code\u003e\u003c/a\u003e chore(deps): bump the runtime-dependencies group with 10 updates (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3381\"\u003e#3381\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/f6d172367b48d5138fcab911ff8fdd86b4e8cdaf\"\u003e\u003ccode\u003ef6d1723\u003c/code\u003e\u003c/a\u003e [pre-commit.ci] pre-commit autoupdate (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3380\"\u003e#3380\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/7c56749d7b3065f6a99b21fd61089ba692e4aaec\"\u003e\u003ccode\u003e7c56749\u003c/code\u003e\u003c/a\u003e fix(ci): defer upgrades blocked by release age (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3379\"\u003e#3379\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/95d02526dc5f2c569767d8ee572f72f571b8a6ce\"\u003e\u003ccode\u003e95d0252\u003c/code\u003e\u003c/a\u003e 👷 ci: pin ubuntu-26.04, clear warnings, bump deps (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3378\"\u003e#3378\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/571bc2041dae5ecbd250d82ec7ef482cfd3c3b69\"\u003e\u003ccode\u003e571bc20\u003c/code\u003e\u003c/a\u003e release 21.14.5\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/5b9b7de4f2f850d94deec4d5a9764e7b879e8865\"\u003e\u003ccode\u003e5b9b7de\u003c/code\u003e\u003c/a\u003e Reset the embed update log when it cannot be read (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3376\"\u003e#3376\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/9fd48c89ad6986d37d20598fd3d8bb5eee94ecba\"\u003e\u003ccode\u003e9fd48c8\u003c/code\u003e\u003c/a\u003e 🐛 fix(ci): dump stacks from a thread that holds the GIL (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3377\"\u003e#3377\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.14.3...21.14.6\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore \u003cdependency name\u003e major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself)\n- `@dependabot ignore \u003cdependency name\u003e minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself)\n- `@dependabot ignore \u003cdependency name\u003e` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself)\n- `@dependabot unignore \u003cdependency name\u003e` will remove all of the ignore conditions of the specified dependency\n- `@dependabot unignore \u003cdependency name\u003e \u003cignore condition\u003e` will remove the ignore condition of the specified dependency and ignore conditions\n\n\n\u003c/details\u003e","html_url":"https://github.com/aisecnomad/Nexus-ShadowScan/pull/223","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/aisecnomad%2FNexus-ShadowScan/issues/223","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/223/packages"},{"uuid":"5847869070","node_id":"PR_kwDOKfFlGM8AAAABIY5KHQ","number":556,"state":"open","title":"Bump virtualenv from 21.9.0 to 21.11.0","user":"dependabot[bot]","labels":["dependencies","python"],"assignees":[],"locked":false,"comments_count":2,"pull_request":true,"closed_at":null,"author_association":null,"state_reason":null,"created_at":"2026-10-14T12:34:28.000Z","updated_at":"2026-10-14T12:38:45.000Z","time_to_close":null,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"Bump","packages":[{"name":"virtualenv","old_version":"21.9.0","new_version":"21.11.0","repository_url":"https://github.com/pypa/virtualenv"}],"path":null,"ecosystem":"pip"},"body":"Bumps [virtualenv](https://github.com/pypa/virtualenv) from 21.9.0 to 21.11.0.\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pypa/virtualenv/releases\"\u003evirtualenv's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e21.11.0\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eci(pre-release): disable the uv cache by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3288\"\u003epypa/virtualenv#3288\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eci: pass expressions to run scripts via env by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3292\"\u003epypa/virtualenv#3292\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eci(release): audit egress in build and publish by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3289\"\u003epypa/virtualenv#3289\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e📝 docs: define maintainer roles and access by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3290\"\u003epypa/virtualenv#3290\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eci: resolve zizmor auditor findings by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3297\"\u003epypa/virtualenv#3297\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eci(pre-commit): freeze hook revs to commit SHAs by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3298\"\u003epypa/virtualenv#3298\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003edocs: link docs and pyvideo over https by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3300\"\u003epypa/virtualenv#3300\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003edocs(development): add a one-year roadmap by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3304\"\u003epypa/virtualenv#3304\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(seed): fail closed when PyPI digest is unknown by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3302\"\u003epypa/virtualenv#3302\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e✨ feat(release): publish SBOMs as release assets by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3299\"\u003epypa/virtualenv#3299\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003edocs(security): describe the project under the CRA by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3295\"\u003epypa/virtualenv#3295\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003edocs(template): name the trust boundary crossed by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3296\"\u003epypa/virtualenv#3296\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e♻️ refactor(sbom): type the SPDX renderer by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3307\"\u003epypa/virtualenv#3307\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e✨ feat(zipapp): publish an SBOM for the zipapp by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3310\"\u003epypa/virtualenv#3310\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e👷 ci(check): pin test tool downloads and bump them weekly by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3293\"\u003epypa/virtualenv#3293\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e📝 docs: explain what a release publishes and how to verify it by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3305\"\u003epypa/virtualenv#3305\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e👷 ci(release): verify the zipapp served by bootstrap.pypa.io by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3309\"\u003epypa/virtualenv#3309\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e👷 ci(release): mint app tokens instead of a PAT by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3301\"\u003epypa/virtualenv#3301\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e📝 docs(security): add threat model and assurance case by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3294\"\u003epypa/virtualenv#3294\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(zipapp): bundle wheels pinned by a PEP 751 lock by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3306\"\u003epypa/virtualenv#3306\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e📝 docs(security): sync threat model with merged fixes by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3312\"\u003epypa/virtualenv#3312\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(sbom): keep the build machine out of the SBOMs by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3311\"\u003epypa/virtualenv#3311\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.10.0...21.11.0\"\u003ehttps://github.com/pypa/virtualenv/compare/21.10.0...21.11.0\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e21.10.0\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003efeat: allow filelock 4.x on Python 3.10+ by \u003ca href=\"https://github.com/r3wretrhy\"\u003e\u003ccode\u003e@​r3wretrhy\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3286\"\u003epypa/virtualenv#3286\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(batch): reject paths altered by quoting by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3280\"\u003epypa/virtualenv#3280\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003etest(upgrade): verify generator convergence by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3282\"\u003epypa/virtualenv#3282\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eci(release): verify published artifacts by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3284\"\u003epypa/virtualenv#3284\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(upgrade): isolate generation credentials by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3283\"\u003epypa/virtualenv#3283\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat(sbom): identify vendored packages by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3281\"\u003epypa/virtualenv#3281\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.9.1...21.10.0\"\u003ehttps://github.com/pypa/virtualenv/compare/21.9.1...21.10.0\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e21.9.1\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e🐛 fix(upgrade): format generated notices by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3272\"\u003epypa/virtualenv#3272\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(release): preserve partial publications by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3279\"\u003epypa/virtualenv#3279\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pypa/virtualenv/blob/main/docs/changelog.rst\"\u003evirtualenv's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003eFeatures - 21.11.0\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eAttach the CycloneDX SBOM and an SPDX 2.3 rendering of it (\u003ccode\u003evirtualenv.cdx.json\u003c/code\u003e, \u003ccode\u003evirtualenv.spdx.json\u003c/code\u003e) to each\nGitHub release, and attest the SPDX document against the sdist and wheel. (:issue:\u003ccode\u003e3299\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eDescribe the zipapp in its own CycloneDX SBOM, which lists virtualenv, the embedded pip and setuptools wheels, and\neach bundled dependency with the Python versions that load it, down to a SHA-256 per file. The SBOM sits at the root\nof \u003ccode\u003evirtualenv.pyz\u003c/code\u003e, ships as the \u003ccode\u003evirtualenv.pyz.cdx.json\u003c/code\u003e release asset, and GitHub attests it against the\nzipapp. (:issue:\u003ccode\u003e3310\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch1\u003eBugfixes - 21.11.0\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eRefuse a seed wheel downloaded from the default index when virtualenv cannot get its sha256 from PyPI after three\nretries, instead of seeding it unverified. Seeding falls back to the bundled wheel unless a specific version was\nrequested. (:issue:\u003ccode\u003e3302\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eBuild the zipapp from the dependency wheels that \u003ccode\u003epylock.zipapp.toml\u003c/code\u003e pins by URL and sha256, so a release bundles\nonly files matching the committed hashes. (:issue:\u003ccode\u003e3306\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eLeave the build machine out of the wheel and zipapp SBOMs, so the wheel rebuilds byte for byte on any operating system\nand architecture given the same source, \u003ccode\u003eSOURCE_DATE_EPOCH\u003c/code\u003e, Python patch version and build backend versions. Zipapp\nentries now carry the \u003ccode\u003eSOURCE_DATE_EPOCH\u003c/code\u003e timestamp and fixed permissions instead of the build time. (:issue:\u003ccode\u003e3311\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch1\u003eImproved Documentation - 21.11.0\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eDocument the backup maintainer and the two-factor authentication and access review expectations for maintainers.\n(:issue:\u003ccode\u003e3290\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eLink the Carl Meyer talk on the home page over HTTPS - by :user:\u003ccode\u003egaborbernat\u003c/code\u003e. (:issue:\u003ccode\u003e3300\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eAdd a roadmap to the development guide listing what the project plans to do, and not do, through September 2027 - by\n:user:\u003ccode\u003egaborbernat\u003c/code\u003e. (:issue:\u003ccode\u003e3304\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eDocument what a release publishes and how to verify each file, covering the PyPI attestations, the zipapp and its\nprovenance, the CycloneDX and SPDX SBOMs of the wheel, the zipapp SBOM, and rebuilding the sdist from its tag.\n(:issue:\u003ccode\u003e3305\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003ev21.10.0 (2026-09-22)\u003c/p\u003e\n\u003chr /\u003e\n\u003ch1\u003eFeatures - 21.10.0\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eInclude versioned identities for packages vendored inside seed wheels in the embedded SBOM. (:issue:\u003ccode\u003e3281\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eAllow \u003ccode\u003efilelock\u003c/code\u003e 4.x on Python 3.10+ by relaxing the upper bound from \u003ccode\u003e\u0026lt;4\u003c/code\u003e to \u003ccode\u003e\u0026lt;5\u003c/code\u003e - by :user:\u003ccode\u003er3wretrhy\u003c/code\u003e.\n(:issue:\u003ccode\u003e3285\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch1\u003eBugfixes - 21.10.0\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eSkip Windows batch activation scripts when environment or Tcl/Tk paths contain \u003ccode\u003e^\u003c/code\u003e or \u003ccode\u003e!\u003c/code\u003e, since quoting changes\nthose paths. Other activation scripts remain available. (:issue:\u003ccode\u003e3280\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/49077e788f2b22bfc7c00616e2008b250905846b\"\u003e\u003ccode\u003e49077e7\u003c/code\u003e\u003c/a\u003e release 21.11.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/5d9dc5843f5fca7669e7998868cca450dee1bf70\"\u003e\u003ccode\u003e5d9dc58\u003c/code\u003e\u003c/a\u003e 🐛 fix(sbom): keep the build machine out of the SBOMs (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3311\"\u003e#3311\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/bcb0fa61f4d6364f5c8be923871dcfca3fccba22\"\u003e\u003ccode\u003ebcb0fa6\u003c/code\u003e\u003c/a\u003e 📝 docs(security): sync threat model with merged fixes (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3312\"\u003e#3312\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/b80a3bdfc674a995d28c1e9ce5235a5ae9ae22d9\"\u003e\u003ccode\u003eb80a3bd\u003c/code\u003e\u003c/a\u003e 🐛 fix(zipapp): bundle wheels pinned by a PEP 751 lock (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3306\"\u003e#3306\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/29fba3940ae5bb4b92d6dd63291b045f696b10ed\"\u003e\u003ccode\u003e29fba39\u003c/code\u003e\u003c/a\u003e 📝 docs(security): add threat model and assurance case (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3294\"\u003e#3294\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/4608b9dbe07d05053b3a01db3e8bed3c0601e3d6\"\u003e\u003ccode\u003e4608b9d\u003c/code\u003e\u003c/a\u003e 👷 ci(release): mint app tokens instead of a PAT (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3301\"\u003e#3301\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/d10b8e82c94014a28c0caaeea11d3a715e068a98\"\u003e\u003ccode\u003ed10b8e8\u003c/code\u003e\u003c/a\u003e 👷 ci(release): verify the zipapp served by bootstrap.pypa.io (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3309\"\u003e#3309\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/1ad97020c18bf4272e78988d46b9973c4a431181\"\u003e\u003ccode\u003e1ad9702\u003c/code\u003e\u003c/a\u003e 📝 docs: explain what a release publishes and how to verify it (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3305\"\u003e#3305\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/6f7d4424f05b08ed7709dd72b6b1b59fde330458\"\u003e\u003ccode\u003e6f7d442\u003c/code\u003e\u003c/a\u003e 👷 ci(check): pin test tool downloads and bump them weekly (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3293\"\u003e#3293\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/7af56ffa217558800ef52fe464179b915544bb6e\"\u003e\u003ccode\u003e7af56ff\u003c/code\u003e\u003c/a\u003e ✨ feat(zipapp): publish an SBOM for the zipapp (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3310\"\u003e#3310\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.9.0...21.11.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=virtualenv\u0026package-manager=pip\u0026previous-version=21.9.0\u0026new-version=21.11.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n\n\n\u003c/details\u003e","html_url":"https://github.com/senzing-garage/sz-sdk-python-core/pull/556","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/senzing-garage%2Fsz-sdk-python-core/issues/556","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/556/packages"},{"uuid":"5847725221","node_id":"PR_kwDOS8i2VM8AAAABIYxyPQ","number":145,"state":"closed","title":"Bump virtualenv from 20.31.2 to 21.14.6","user":"dependabot[bot]","labels":["dependencies"],"assignees":[],"locked":false,"comments_count":2,"pull_request":true,"closed_at":"2026-10-15T06:22:50.000Z","author_association":null,"state_reason":null,"created_at":"2026-10-14T12:24:44.000Z","updated_at":"2026-10-15T06:22:53.000Z","time_to_close":64686,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"Bump","packages":[{"name":"virtualenv","old_version":"20.31.2","new_version":"21.14.6","repository_url":"https://github.com/pypa/virtualenv"}],"path":null,"ecosystem":"pip"},"body":"Bumps [virtualenv](https://github.com/pypa/virtualenv) from 20.31.2 to 21.14.6.\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pypa/virtualenv/releases\"\u003evirtualenv's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e21.14.6\u003c/h2\u003e\n\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e👷 ci: pin ubuntu-26.04, clear warnings, bump deps by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3378\"\u003epypa/virtualenv#3378\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(ci): defer upgrades blocked by release age by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3379\"\u003epypa/virtualenv#3379\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eci: overlap release transfers and verification by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3382\"\u003epypa/virtualenv#3382\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(seed): guard every embed update log read, not just one by \u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3383\"\u003epypa/virtualenv#3383\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.14.5...21.14.6\"\u003ehttps://github.com/pypa/virtualenv/compare/21.14.5...21.14.6\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e21.14.5\u003c/h2\u003e\n\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e🎨 style(test): mark prompt fixture locals Final by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3374\"\u003epypa/virtualenv#3374\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🎨 style: give every Final annotation its type by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3375\"\u003epypa/virtualenv#3375\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(ci): dump stacks from a thread that holds the GIL by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3377\"\u003epypa/virtualenv#3377\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eReset the embed update log when it cannot be read by \u003ca href=\"https://github.com/pasmud\"\u003e\u003ccode\u003e@​pasmud\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3376\"\u003epypa/virtualenv#3376\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.14.4...21.14.5\"\u003ehttps://github.com/pypa/virtualenv/compare/21.14.4...21.14.5\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e21.14.4\u003c/h2\u003e\n\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eUpgrade embedded pip/setuptools/wheel and CI test tools by \u003ca href=\"https://github.com/github-actions\"\u003e\u003ccode\u003e@​github-actions\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3372\"\u003epypa/virtualenv#3372\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e📝 docs(changelog): note the zsh prompt fix by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3373\"\u003epypa/virtualenv#3373\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.14.3...21.14.4\"\u003ehttps://github.com/pypa/virtualenv/compare/21.14.3...21.14.4\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e21.14.3\u003c/h2\u003e\n\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e✨ feat(security): add a private vulnerability report form by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3370\"\u003epypa/virtualenv#3370\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e📝 docs(changelog): link the 21.14.0 wheel-order fix to \u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3361\"\u003e#3361\u003c/a\u003e by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3371\"\u003epypa/virtualenv#3371\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eApply the whole Requires-Python specifier set in Wheel.support_py by \u003ca href=\"https://github.com/pasmud\"\u003e\u003ccode\u003e@​pasmud\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3369\"\u003epypa/virtualenv#3369\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUpgrade embedded pip/setuptools/wheel and CI test tools by \u003ca href=\"https://github.com/github-actions\"\u003e\u003ccode\u003e@​github-actions\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3368\"\u003epypa/virtualenv#3368\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.14.2...21.14.3\"\u003ehttps://github.com/pypa/virtualenv/compare/21.14.2...21.14.3\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e21.14.2\u003c/h2\u003e\n\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pypa/virtualenv/blob/main/docs/changelog.rst\"\u003evirtualenv's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003eBugfixes - 21.14.6\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eFall back to the bundled seed wheel with periodic update on (the default) when the embed update log holds JSON of the\nwrong shape, instead of downloading the wheel or, offline, failing to create the environment - by :user:\u003ccode\u003edarrenhuai\u003c/code\u003e.\n(:issue:\u003ccode\u003e3383\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003ev21.14.5 (2026-10-02)\u003c/p\u003e\n\u003chr /\u003e\n\u003ch1\u003eBugfixes - 21.14.5\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eFall back to the bundled seed wheel and remove the embed update log when the log in the app data folder holds JSON of\nthe wrong shape, instead of failing to create the environment - by :user:\u003ccode\u003epasmud\u003c/code\u003e. (:issue:\u003ccode\u003e3376\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003ev21.14.4 (2026-10-02)\u003c/p\u003e\n\u003chr /\u003e\n\u003ch1\u003eBugfixes - 21.14.4\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eFix \u003ccode\u003eactivate\u003c/code\u003e running commands from a virtual environment name or \u003ccode\u003e--prompt\u003c/code\u003e that holds \u003ccode\u003e$(...)\u003c/code\u003e, backticks or\n\u003ccode\u003e${...}\u003c/code\u003e when zsh has \u003ccode\u003ePROMPT_SUBST\u003c/code\u003e set, and show a \u003ccode\u003e%\u003c/code\u003e in the name as typed under zsh (\u003ccode\u003eGHSA-5vjq-rrrf-7h2q \u0026lt;https://github.com/pypa/virtualenv/security/advisories/GHSA-5vjq-rrrf-7h2q\u0026gt;\u003c/code\u003e_); reported by :user:\u003ccode\u003ekemrec\u003c/code\u003e.\n(:issue:\u003ccode\u003e3373\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003ev21.14.3 (2026-10-01)\u003c/p\u003e\n\u003chr /\u003e\n\u003ch1\u003eBugfixes - 21.14.3\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eHonor \u003ccode\u003e~=\u003c/code\u003e and every clause of a seed wheel's \u003ccode\u003eRequires-Python\u003c/code\u003e when picking a wheel for the target Python, and\nskip a wheel whose \u003ccode\u003eRequires-Python\u003c/code\u003e is not a valid specifier instead of failing - by :user:\u003ccode\u003epasmud\u003c/code\u003e.\n(:issue:\u003ccode\u003e3369\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003ev21.14.2 (2026-10-01)\u003c/p\u003e\n\u003chr /\u003e\n\u003ch1\u003eBugfixes - 21.14.2\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eFix \u003ccode\u003epyvenv.cfg\u003c/code\u003e getting an absolute path in \u003ccode\u003epython-version\u003c/code\u003e, \u003ccode\u003einclude-system-site-packages\u003c/code\u003e and the other keys\nthat hold no path when the working directory has an entry named like the value, such as \u003ccode\u003e3.14\u003c/code\u003e for \u003ccode\u003evirtualenv 3.14\u003c/code\u003e or \u003ccode\u003etrue\u003c/code\u003e with \u003ccode\u003e--system-site-packages\u003c/code\u003e - by :user:\u003ccode\u003edarrenhuai\u003c/code\u003e. (:issue:\u003ccode\u003e3366\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/9e69ac725fd4dc83726536c084ab9ca4f099c5b6\"\u003e\u003ccode\u003e9e69ac7\u003c/code\u003e\u003c/a\u003e release 21.14.6\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/464c34b696c81190cd1ad6589158f6ce59467351\"\u003e\u003ccode\u003e464c34b\u003c/code\u003e\u003c/a\u003e 🐛 fix(seed): guard every embed update log read, not just one (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3383\"\u003e#3383\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/3f56d7f4b88884296249b83889d717c41ed6e668\"\u003e\u003ccode\u003e3f56d7f\u003c/code\u003e\u003c/a\u003e ci: overlap release transfers and verification (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3382\"\u003e#3382\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/7577efd46b0e62c5edbd803ded2788eb6d48f5ca\"\u003e\u003ccode\u003e7577efd\u003c/code\u003e\u003c/a\u003e chore(deps): bump the runtime-dependencies group with 10 updates (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3381\"\u003e#3381\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/f6d172367b48d5138fcab911ff8fdd86b4e8cdaf\"\u003e\u003ccode\u003ef6d1723\u003c/code\u003e\u003c/a\u003e [pre-commit.ci] pre-commit autoupdate (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3380\"\u003e#3380\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/7c56749d7b3065f6a99b21fd61089ba692e4aaec\"\u003e\u003ccode\u003e7c56749\u003c/code\u003e\u003c/a\u003e fix(ci): defer upgrades blocked by release age (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3379\"\u003e#3379\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/95d02526dc5f2c569767d8ee572f72f571b8a6ce\"\u003e\u003ccode\u003e95d0252\u003c/code\u003e\u003c/a\u003e 👷 ci: pin ubuntu-26.04, clear warnings, bump deps (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3378\"\u003e#3378\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/571bc2041dae5ecbd250d82ec7ef482cfd3c3b69\"\u003e\u003ccode\u003e571bc20\u003c/code\u003e\u003c/a\u003e release 21.14.5\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/5b9b7de4f2f850d94deec4d5a9764e7b879e8865\"\u003e\u003ccode\u003e5b9b7de\u003c/code\u003e\u003c/a\u003e Reset the embed update log when it cannot be read (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3376\"\u003e#3376\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/9fd48c89ad6986d37d20598fd3d8bb5eee94ecba\"\u003e\u003ccode\u003e9fd48c8\u003c/code\u003e\u003c/a\u003e 🐛 fix(ci): dump stacks from a thread that holds the GIL (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3377\"\u003e#3377\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/pypa/virtualenv/compare/20.31.2...21.14.6\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=virtualenv\u0026package-manager=pip\u0026previous-version=20.31.2\u0026new-version=21.14.6)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n\n\n\u003c/details\u003e","html_url":"https://github.com/yhfgyyf/vllm-deepseek-v4-sm89/pull/145","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/yhfgyyf%2Fvllm-deepseek-v4-sm89/issues/145","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/145/packages"},{"uuid":"5840471646","node_id":"PR_kwDOTtMS4M8AAAABIS_Unw","number":139,"state":"closed","title":"Bump virtualenv from 21.14.5 to 21.14.6","user":"dependabot[bot]","labels":[],"assignees":[],"locked":false,"comments_count":1,"pull_request":true,"closed_at":"2026-10-14T01:42:06.000Z","author_association":null,"state_reason":null,"created_at":"2026-10-14T01:41:55.000Z","updated_at":"2026-10-14T01:42:16.000Z","time_to_close":11,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"Bump","packages":[{"name":"virtualenv","old_version":"21.14.5","new_version":"21.14.6","repository_url":"https://github.com/pypa/virtualenv"}],"path":null,"ecosystem":"pip"},"body":"Bumps [virtualenv](https://github.com/pypa/virtualenv) from 21.14.5 to 21.14.6.\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pypa/virtualenv/releases\"\u003evirtualenv's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e21.14.6\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e👷 ci: pin ubuntu-26.04, clear warnings, bump deps by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3378\"\u003epypa/virtualenv#3378\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(ci): defer upgrades blocked by release age by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3379\"\u003epypa/virtualenv#3379\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eci: overlap release transfers and verification by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3382\"\u003epypa/virtualenv#3382\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(seed): guard every embed update log read, not just one by \u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3383\"\u003epypa/virtualenv#3383\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.14.5...21.14.6\"\u003ehttps://github.com/pypa/virtualenv/compare/21.14.5...21.14.6\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pypa/virtualenv/blob/main/docs/changelog.rst\"\u003evirtualenv's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003eBugfixes - 21.14.6\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eFall back to the bundled seed wheel with periodic update on (the default) when the embed update log holds JSON of the\nwrong shape, instead of downloading the wheel or, offline, failing to create the environment - by :user:\u003ccode\u003edarrenhuai\u003c/code\u003e.\n(:issue:\u003ccode\u003e3383\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003ev21.14.5 (2026-10-02)\u003c/p\u003e\n\u003chr /\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/9e69ac725fd4dc83726536c084ab9ca4f099c5b6\"\u003e\u003ccode\u003e9e69ac7\u003c/code\u003e\u003c/a\u003e release 21.14.6\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/464c34b696c81190cd1ad6589158f6ce59467351\"\u003e\u003ccode\u003e464c34b\u003c/code\u003e\u003c/a\u003e 🐛 fix(seed): guard every embed update log read, not just one (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3383\"\u003e#3383\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/3f56d7f4b88884296249b83889d717c41ed6e668\"\u003e\u003ccode\u003e3f56d7f\u003c/code\u003e\u003c/a\u003e ci: overlap release transfers and verification (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3382\"\u003e#3382\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/7577efd46b0e62c5edbd803ded2788eb6d48f5ca\"\u003e\u003ccode\u003e7577efd\u003c/code\u003e\u003c/a\u003e chore(deps): bump the runtime-dependencies group with 10 updates (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3381\"\u003e#3381\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/f6d172367b48d5138fcab911ff8fdd86b4e8cdaf\"\u003e\u003ccode\u003ef6d1723\u003c/code\u003e\u003c/a\u003e [pre-commit.ci] pre-commit autoupdate (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3380\"\u003e#3380\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/7c56749d7b3065f6a99b21fd61089ba692e4aaec\"\u003e\u003ccode\u003e7c56749\u003c/code\u003e\u003c/a\u003e fix(ci): defer upgrades blocked by release age (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3379\"\u003e#3379\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/95d02526dc5f2c569767d8ee572f72f571b8a6ce\"\u003e\u003ccode\u003e95d0252\u003c/code\u003e\u003c/a\u003e 👷 ci: pin ubuntu-26.04, clear warnings, bump deps (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3378\"\u003e#3378\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.14.5...21.14.6\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=virtualenv\u0026package-manager=pip\u0026previous-version=21.14.5\u0026new-version=21.14.6)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n\n\n\u003c/details\u003e","html_url":"https://github.com/huawei-zxs/aiohttp/pull/139","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/huawei-zxs%2Faiohttp/issues/139","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/139/packages"},{"uuid":"5834589787","node_id":"PR_kwDOUXDMF88AAAABIOTIrg","number":17,"state":"open","title":"Bump the python group across 1 directory with 46 updates","user":"dependabot[bot]","labels":["dependencies","python:uv"],"assignees":[],"locked":false,"comments_count":1,"pull_request":true,"closed_at":null,"author_association":null,"state_reason":null,"created_at":"2026-10-13T17:14:52.000Z","updated_at":"2026-10-14T20:33:08.000Z","time_to_close":null,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"Bump","group_name":"python","update_count":46,"packages":[{"name":"django","old_version":"6.0.8","new_version":"6.1.2","repository_url":"https://github.com/django/django"},{"name":"django-allauth","old_version":"65.19.2","new_version":"65.19.7","repository_url":"https://github.com/sponsors/pennersr"},{"name":"djangorestframework","old_version":"3.18.1","new_version":"3.18.3","repository_url":"https://github.com/encode/django-rest-framework"},{"name":"hiredis","old_version":"3.4.1","new_version":"3.4.2","repository_url":"https://github.com/redis/hiredis-py"},{"name":"coverage","old_version":"7.16.0","new_version":"7.16.2","repository_url":"https://github.com/coveragepy/coveragepy"},{"name":"django-stubs","old_version":"6.1.0","new_version":"6.1.2","repository_url":"https://github.com/typeddjango/django-stubs"},{"name":"django-upgrade","old_version":"1.32.0","new_version":"1.33.0","repository_url":"https://github.com/adamchainz/django-upgrade"},{"name":"djlint","old_version":"1.46.1","new_version":"1.46.4","repository_url":"https://github.com/djlint/djLint"},{"name":"mypy","old_version":"2.3.1","new_version":"2.4.0","repository_url":"https://github.com/python/mypy"},{"name":"ruff","old_version":"0.16.6","new_version":"0.17.0","repository_url":"https://github.com/astral-sh/ruff"},{"name":"werkzeug","old_version":"3.1.8","new_version":"3.1.9","repository_url":"https://github.com/pallets/werkzeug"},{"name":"ast-serialize","old_version":"0.11.2","new_version":"0.12.1","repository_url":"https://github.com/mypyc/ast_serialize"},{"name":"charset-normalizer","old_version":"3.5.1","new_version":"3.5.2","repository_url":"https://github.com/jawah/charset_normalizer"},{"name":"cryptography","old_version":"50.0.1","new_version":"50.0.2","repository_url":"https://github.com/pyca/cryptography"},{"name":"django-allauth","old_version":"65.19.2","new_version":"65.19.7","repository_url":"https://github.com/sponsors/pennersr"},{"name":"django-stubs","old_version":"6.1.0","new_version":"6.1.2","repository_url":"https://github.com/typeddjango/django-stubs"},{"name":"django-stubs-ext","old_version":"6.1.0","new_version":"6.1.2","repository_url":"https://github.com/typeddjango/django-stubs"},{"name":"docutils","old_version":"0.22.4","new_version":"0.23","repository_url":"https://github.com/rtfd/recommonmark"},{"name":"executing","old_version":"2.2.1","new_version":"2.3.0","repository_url":"https://github.com/alexmojaki/executing"},{"name":"faker","old_version":"40.38.0","new_version":"40.43.0","repository_url":"https://github.com/joke2k/faker"},{"name":"identify","old_version":"2.6.19","new_version":"2.6.20","repository_url":"https://github.com/pre-commit/identify"},{"name":"idna","old_version":"3.19","new_version":"3.20","repository_url":"https://github.com/kjd/idna"},{"name":"iniconfig","old_version":"2.3.0","new_version":"2.3.1","repository_url":"https://github.com/pytest-dev/iniconfig"},{"name":"json5","old_version":"0.15.0","new_version":"0.17.3","repository_url":"https://github.com/dpranke/pyjson5"},{"name":"librt","old_version":"0.15.0","new_version":"0.16.0","repository_url":"https://github.com/mypyc/librt"},{"name":"markupsafe","old_version":"3.0.3","new_version":"3.0.4","repository_url":"https://github.com/pallets/markupsafe"},{"name":"nodeenv","old_version":"1.10.0","new_version":"1.11.0","repository_url":"https://github.com/ekalinin/nodeenv"},{"name":"platformdirs","old_version":"4.11.8","new_version":"4.12.4","repository_url":"https://github.com/tox-dev/platformdirs"},{"name":"psycopg","old_version":"3.3.5","new_version":"3.3.6","repository_url":"https://github.com/psycopg/psycopg"},{"name":"psycopg-binary","old_version":"3.3.5","new_version":"3.3.6","repository_url":"https://github.com/psycopg/psycopg"},{"name":"psycopg-c","old_version":"3.3.5","new_version":"3.3.6","repository_url":"https://github.com/psycopg/psycopg"},{"name":"pycparser","old_version":"3.0","new_version":"3.11","repository_url":"https://github.com/eliben/pycparser"},{"name":"python-discovery","old_version":"1.6.0","new_version":"1.6.2","repository_url":"https://github.com/tox-dev/python-discovery"},{"name":"rcssmin","old_version":"1.2.2","new_version":"1.3.0","repository_url":"https://github.com/ndparker/rcssmin"},{"name":"regex","old_version":"2026.9.10","new_version":"2026.9.29","repository_url":"https://github.com/mrabarnett/mrab-regex"},{"name":"rjsmin","old_version":"1.2.5","new_version":"1.3.0","repository_url":"https://github.com/ndparker/rjsmin"},{"name":"rpds-py","old_version":"2026.6.3","new_version":"2026.9.1","repository_url":"https://github.com/crate-py/rpds"},{"name":"starlette","old_version":"1.6.0","new_version":"1.7.0","repository_url":"https://github.com/Kludex/starlette"},{"name":"tzdata","old_version":"2026.4","new_version":"2026.5","repository_url":"https://github.com/python/tzdata"},{"name":"urllib3","old_version":"2.7.0","new_version":"2.8.0","repository_url":"https://github.com/urllib3/urllib3"},{"name":"uvicorn","old_version":"0.52.4","new_version":"0.54.0","repository_url":"https://github.com/Kludex/uvicorn"},{"name":"virtualenv","old_version":"21.7.9","new_version":"21.14.6","repository_url":"https://github.com/pypa/virtualenv"},{"name":"watchfiles","old_version":"1.2.0","new_version":"1.3.0","repository_url":"https://github.com/samuelcolvin/watchfiles"},{"name":"wcwidth","old_version":"0.8.3","new_version":"0.9.2","repository_url":"https://github.com/jquast/wcwidth"},{"name":"websockets","old_version":"17.1","new_version":"17.2","repository_url":"https://github.com/python-websockets/websockets"},{"name":"werkzeug","old_version":"3.1.8","new_version":"3.1.9","repository_url":"https://github.com/pallets/werkzeug"}],"path":null,"ecosystem":"pip"},"body":"Bumps the python group with 46 updates in the / directory:\n\n| Package | From | To |\n| --- | --- | --- |\n| [django](https://github.com/django/django) | `6.0.8` | `6.1.2` |\n| [django-allauth[mfa]](https://github.com/sponsors/pennersr) | `65.19.2` | `65.19.7` |\n| [djangorestframework](https://github.com/encode/django-rest-framework) | `3.18.1` | `3.18.3` |\n| [hiredis](https://github.com/redis/hiredis-py) | `3.4.1` | `3.4.2` |\n| [coverage](https://github.com/coveragepy/coveragepy) | `7.16.0` | `7.16.2` |\n| [django-stubs[compatible-mypy]](https://github.com/typeddjango/django-stubs) | `6.1.0` | `6.1.2` |\n| [django-upgrade](https://github.com/adamchainz/django-upgrade) | `1.32.0` | `1.33.0` |\n| [djlint](https://github.com/djlint/djLint) | `1.46.1` | `1.46.4` |\n| [mypy](https://github.com/python/mypy) | `2.3.1` | `2.4.0` |\n| [ruff](https://github.com/astral-sh/ruff) | `0.16.6` | `0.17.0` |\n| [werkzeug[watchdog]](https://github.com/pallets/werkzeug) | `3.1.8` | `3.1.9` |\n| [ast-serialize](https://github.com/mypyc/ast_serialize) | `0.11.2` | `0.12.1` |\n| [charset-normalizer](https://github.com/jawah/charset_normalizer) | `3.5.1` | `3.5.2` |\n| [cryptography](https://github.com/pyca/cryptography) | `50.0.1` | `50.0.2` |\n| [django-allauth](https://github.com/sponsors/pennersr) | `65.19.2` | `65.19.7` |\n| [django-stubs](https://github.com/typeddjango/django-stubs) | `6.1.0` | `6.1.2` |\n| [django-stubs-ext](https://github.com/typeddjango/django-stubs) | `6.1.0` | `6.1.2` |\n| [docutils](https://github.com/rtfd/recommonmark) | `0.22.4` | `0.23` |\n| [executing](https://github.com/alexmojaki/executing) | `2.2.1` | `2.3.0` |\n| [faker](https://github.com/joke2k/faker) | `40.38.0` | `40.43.0` |\n| [identify](https://github.com/pre-commit/identify) | `2.6.19` | `2.6.20` |\n| [idna](https://github.com/kjd/idna) | `3.19` | `3.20` |\n| [iniconfig](https://github.com/pytest-dev/iniconfig) | `2.3.0` | `2.3.1` |\n| [json5](https://github.com/dpranke/pyjson5) | `0.15.0` | `0.17.3` |\n| [librt](https://github.com/mypyc/librt) | `0.15.0` | `0.16.0` |\n| [markupsafe](https://github.com/pallets/markupsafe) | `3.0.3` | `3.0.4` |\n| [nodeenv](https://github.com/ekalinin/nodeenv) | `1.10.0` | `1.11.0` |\n| [platformdirs](https://github.com/tox-dev/platformdirs) | `4.11.8` | `4.12.4` |\n| [psycopg](https://github.com/psycopg/psycopg) | `3.3.5` | `3.3.6` |\n| [psycopg-binary](https://github.com/psycopg/psycopg) | `3.3.5` | `3.3.6` |\n| [psycopg-c](https://github.com/psycopg/psycopg) | `3.3.5` | `3.3.6` |\n| [pycparser](https://github.com/eliben/pycparser) | `3.0` | `3.11` |\n| [python-discovery](https://github.com/tox-dev/python-discovery) | `1.6.0` | `1.6.2` |\n| [rcssmin](https://github.com/ndparker/rcssmin) | `1.2.2` | `1.3.0` |\n| [regex](https://github.com/mrabarnett/mrab-regex) | `2026.9.10` | `2026.9.29` |\n| [rjsmin](https://github.com/ndparker/rjsmin) | `1.2.5` | `1.3.0` |\n| [rpds-py](https://github.com/crate-py/rpds) | `2026.6.3` | `2026.9.1` |\n| [starlette](https://github.com/Kludex/starlette) | `1.6.0` | `1.7.0` |\n| [tzdata](https://github.com/python/tzdata) | `2026.4` | `2026.5` |\n| [urllib3](https://github.com/urllib3/urllib3) | `2.7.0` | `2.8.0` |\n| [uvicorn](https://github.com/Kludex/uvicorn) | `0.52.4` | `0.54.0` |\n| [virtualenv](https://github.com/pypa/virtualenv) | `21.7.9` | `21.14.6` |\n| [watchfiles](https://github.com/samuelcolvin/watchfiles) | `1.2.0` | `1.3.0` |\n| [wcwidth](https://github.com/jquast/wcwidth) | `0.8.3` | `0.9.2` |\n| [websockets](https://github.com/python-websockets/websockets) | `17.1` | `17.2` |\n| [werkzeug](https://github.com/pallets/werkzeug) | `3.1.8` | `3.1.9` |\n\n\nUpdates `django` from 6.0.8 to 6.1.2\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/django/django/commit/2212534bae393714e1e51db2341d4fd5545e19f6\"\u003e\u003ccode\u003e2212534\u003c/code\u003e\u003c/a\u003e [6.1.x] Bumped version for 6.1.2 release.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/django/django/commit/75d401a1491e04a907ed745c128836d51c982c0f\"\u003e\u003ccode\u003e75d401a\u003c/code\u003e\u003c/a\u003e [6.1.x] Refs CVE-2026-15830 -- Fixed WKB geometry collection limit bypasses.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/django/django/commit/cce6c57ed30ea83725f9d6abb2fe5ee932bab107\"\u003e\u003ccode\u003ecce6c57\u003c/code\u003e\u003c/a\u003e [6.1.x] Fixed CVE-2026-87975 -- Prevented forging actions in model formsets w...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/django/django/commit/4e77ef1e69c94780006b82795aa7db101996c3af\"\u003e\u003ccode\u003e4e77ef1\u003c/code\u003e\u003c/a\u003e [6.1.x] Fixed CVE-2026-87890 -- Blocked bytes in spatial lookups.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/django/django/commit/de56deeabd4c48dfb5193f0001469d80102fb367\"\u003e\u003ccode\u003ede56dee\u003c/code\u003e\u003c/a\u003e [6.1.x] Fixed CVE-2026-84429 -- Simplified parse_header_parameters by leverag...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/django/django/commit/7e878b0f8bd42260903e6a0d38996a93b0474a0b\"\u003e\u003ccode\u003e7e878b0\u003c/code\u003e\u003c/a\u003e [6.1.x] Fixed CVE-2026-77050 -- Prevented memory exhaustion in get_supported_...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/django/django/commit/d8cf296d9668e146067337c6f2259be6ea2c7370\"\u003e\u003ccode\u003ed8cf296\u003c/code\u003e\u003c/a\u003e [6.1.x] Fixed \u003ca href=\"https://redirect.github.com/django/django/issues/37322\"\u003e#37322\u003c/a\u003e -- Avoided transforms on spatial fields with srid=None.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/django/django/commit/71084d68d3be55307be6698a7cff93244f98ad88\"\u003e\u003ccode\u003e71084d6\u003c/code\u003e\u003c/a\u003e [6.1.x] Fixed \u003ca href=\"https://redirect.github.com/django/django/issues/37377\"\u003e#37377\u003c/a\u003e -- Fixed JSONField __in crash/wrong result for Value() p...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/django/django/commit/e34d77639cebc30b13bbbb82b04f97ba0da82cb4\"\u003e\u003ccode\u003ee34d776\u003c/code\u003e\u003c/a\u003e [6.1.x] Fixed \u003ca href=\"https://redirect.github.com/django/django/issues/37386\"\u003e#37386\u003c/a\u003e -- Observed delete_confirmation_max_display=0 for inlines.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/django/django/commit/25872ef34ee19f49887509138218fc08320f526c\"\u003e\u003ccode\u003e25872ef\u003c/code\u003e\u003c/a\u003e [6.1.x] Fixed \u003ca href=\"https://redirect.github.com/django/django/issues/37361\"\u003e#37361\u003c/a\u003e -- Fixed permission renames for chained RenameModel oper...\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/django/django/compare/6.0.8...6.1.2\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `django-allauth[mfa]` from 65.19.2 to 65.19.7\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/sponsors/pennersr/commits\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `djangorestframework` from 3.18.1 to 3.18.3\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/encode/django-rest-framework/releases\"\u003edjangorestframework's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e3.18.3\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003ch3\u003eBug fixes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eRestore \u003ccode\u003eorder_by_precedence\u003c/code\u003e from 3.18.1 to fix broken return value by \u003ca href=\"https://github.com/browniebroke\"\u003e\u003ccode\u003e@​browniebroke\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/encode/django-rest-framework/pull/10066\"\u003eencode/django-rest-framework#10066\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/encode/django-rest-framework/compare/3.18.2...3.18.3\"\u003ehttps://github.com/encode/django-rest-framework/compare/3.18.2...3.18.3\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e3.18.2\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003ch3\u003eSecurity\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eGHSA-33wh-fxxf-88vv: Harden content negotiation against large \u003ccode\u003eAccept\u003c/code\u003e headers by \u003ca href=\"https://github.com/jisung-02\"\u003e\u003ccode\u003e@​jisung-02\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://github.com/encode/django-rest-framework/commit/148ab65\"\u003e148ab65\u003c/a\u003e. Thanks \u003ca href=\"https://github.com/jisung-02\"\u003e\u003ccode\u003e@​jisung-02\u003c/code\u003e\u003c/a\u003e for the report.\u003c/li\u003e\n\u003cli\u003eGHSA-3547-9m27-7rxg: Refuse non-text encoding charsets by \u003ca href=\"https://github.com/syrull\"\u003e\u003ccode\u003e@​syrull\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://github.com/encode/django-rest-framework/commit/3c26345\"\u003e3c26345\u003c/a\u003e. Thanks \u003ca href=\"https://github.com/syrull\"\u003e\u003ccode\u003e@​syrull\u003c/code\u003e\u003c/a\u003e and \u003ca href=\"https://github.com/jisung-02\"\u003e\u003ccode\u003e@​jisung-02\u003c/code\u003e\u003c/a\u003e who both reported the problem.\u003c/li\u003e\n\u003cli\u003eGHSA-xw6w-gcfp-cf8m: Make \u003ccode\u003eTokenProxy\u003c/code\u003e deletion actually delete the token by \u003ca href=\"https://github.com/syrull\"\u003e\u003ccode\u003e@​syrull\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://github.com/encode/django-rest-framework/commit/af3fabf\"\u003eaf3fabf\u003c/a\u003e. Thanks \u003ca href=\"https://github.com/syrull\"\u003e\u003ccode\u003e@​syrull\u003c/code\u003e\u003c/a\u003e for the report.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eFeatures\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAdd support for Python 3.15 by \u003ca href=\"https://github.com/p-r-a-v-i-n\"\u003e\u003ccode\u003e@​p-r-a-v-i-n\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/encode/django-rest-framework/pull/10025\"\u003eencode/django-rest-framework#10025\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eBug fixes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eFix \u003ccode\u003eblank=True\u003c/code\u003e fields in unique constraints being treated as required by \u003ca href=\"https://github.com/MehrazRumman\"\u003e\u003ccode\u003e@​MehrazRumman\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/encode/django-rest-framework/pull/10039\"\u003eencode/django-rest-framework#10039\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix \u003ccode\u003eUniqueConstraint\u003c/code\u003e validation with conditional fields by \u003ca href=\"https://github.com/majidkhazaei\"\u003e\u003ccode\u003e@​majidkhazaei\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/encode/django-rest-framework/pull/10021\"\u003eencode/django-rest-framework#10021\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/olitreadwell\"\u003e\u003ccode\u003e@​olitreadwell\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/encode/django-rest-framework/pull/10038\"\u003eencode/django-rest-framework#10038\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/majidkhazaei\"\u003e\u003ccode\u003e@​majidkhazaei\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/encode/django-rest-framework/pull/10021\"\u003eencode/django-rest-framework#10021\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/rblotsky\"\u003e\u003ccode\u003e@​rblotsky\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/encode/django-rest-framework/pull/10045\"\u003eencode/django-rest-framework#10045\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mrchatam\"\u003e\u003ccode\u003e@​mrchatam\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/encode/django-rest-framework/pull/10042\"\u003eencode/django-rest-framework#10042\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/haimingZZ\"\u003e\u003ccode\u003e@​haimingZZ\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/encode/django-rest-framework/pull/10052\"\u003eencode/django-rest-framework#10052\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jisung-02\"\u003e\u003ccode\u003e@​jisung-02\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://github.com/encode/django-rest-framework/commit/148ab65\"\u003e148ab65\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/syrull\"\u003e\u003ccode\u003e@​syrull\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://github.com/encode/django-rest-framework/commit/3c26345\"\u003e3c26345\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/encode/django-rest-framework/compare/3.18.1...3.18.2\"\u003ehttps://github.com/encode/django-rest-framework/compare/3.18.1...3.18.2\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/encode/django-rest-framework/commit/1af5b55758ac514c492ed3a5fc1a6fb244cdb257\"\u003e\u003ccode\u003e1af5b55\u003c/code\u003e\u003c/a\u003e Prepare release 3.18.3 (\u003ca href=\"https://redirect.github.com/encode/django-rest-framework/issues/10067\"\u003e#10067\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/encode/django-rest-framework/commit/e140de794d11149a09c04a3ee7cc4815946148f8\"\u003e\u003ccode\u003ee140de7\u003c/code\u003e\u003c/a\u003e Restore order_by_precedence from 3.18.1 (\u003ca href=\"https://redirect.github.com/encode/django-rest-framework/issues/10066\"\u003e#10066\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/encode/django-rest-framework/commit/7195f7e4c51527054623ea55fc4491786acc91f8\"\u003e\u003ccode\u003e7195f7e\u003c/code\u003e\u003c/a\u003e Bump the pre-commit group across 1 directory with 2 updates (\u003ca href=\"https://redirect.github.com/encode/django-rest-framework/issues/10063\"\u003e#10063\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/encode/django-rest-framework/commit/69694a17d0b6ac14b4ea4d77916b73c68dc5a3e8\"\u003e\u003ccode\u003e69694a1\u003c/code\u003e\u003c/a\u003e Prepare release 3.18.2 (\u003ca href=\"https://redirect.github.com/encode/django-rest-framework/issues/10065\"\u003e#10065\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/encode/django-rest-framework/commit/af3fabfd517307fbc5d500fba1ab8f6e25f220b0\"\u003e\u003ccode\u003eaf3fabf\u003c/code\u003e\u003c/a\u003e Merge commit from fork\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/encode/django-rest-framework/commit/3c2634599b26a9f789b03045118dbc276117611a\"\u003e\u003ccode\u003e3c26345\u003c/code\u003e\u003c/a\u003e Merge commit from fork\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/encode/django-rest-framework/commit/148ab6523922d5a0c110f76615935e5220b63029\"\u003e\u003ccode\u003e148ab65\u003c/code\u003e\u003c/a\u003e Merge commit from fork\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/encode/django-rest-framework/commit/3d18900ead34e9491f94597617a12fdd47161e97\"\u003e\u003ccode\u003e3d18900\u003c/code\u003e\u003c/a\u003e Fix CI that broke due to latest Django bugfix (\u003ca href=\"https://redirect.github.com/encode/django-rest-framework/issues/10064\"\u003e#10064\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/encode/django-rest-framework/commit/d6c45646edc9c6644ea159f7f786da598bc1ab66\"\u003e\u003ccode\u003ed6c4564\u003c/code\u003e\u003c/a\u003e Improve teardown of test modifying INSTALLED_APPS (\u003ca href=\"https://redirect.github.com/encode/django-rest-framework/issues/10056\"\u003e#10056\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/encode/django-rest-framework/commit/41764f1f8cfb6d40b77b58c97cf9aeaab57c6b5c\"\u003e\u003ccode\u003e41764f1\u003c/code\u003e\u003c/a\u003e Bump codecov/codecov-action in the github-actions group (\u003ca href=\"https://redirect.github.com/encode/django-rest-framework/issues/10058\"\u003e#10058\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/encode/django-rest-framework/compare/3.18.1...3.18.3\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `hiredis` from 3.4.1 to 3.4.2\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/hiredis-py/releases\"\u003ehiredis's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e3.4.2\u003c/h2\u003e\n\u003cp\u003eThis is a bugfix release. Users of hiredis-py 3.4.x that receive RESP3 push notifications — pub/sub deliveries or client-side cache invalidations — are encouraged to upgrade.\u003c/p\u003e\n\u003ch1\u003e🐛 Bug Fixes\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eRelease the list each push notification is sized from (\u003ca href=\"https://redirect.github.com/redis/hiredis-py/issues/239\"\u003e#239\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003ccode\u003ePushNotificationType_New\u003c/code\u003e pre-sized every \u003ccode\u003ePushNotification\u003c/code\u003e with a list that \u003ccode\u003ePyList_SetSlice\u003c/code\u003e only borrows, and the reference was never dropped. Each RESP3 push notification therefore stranded one list object for the lifetime of the process. Because push notifications carry pub/sub deliveries and client-side caching invalidations, the leak grew with \u003cem\u003emessage volume\u003c/em\u003e rather than with the number of connections, making it unbounded for a long-lived subscriber — roughly 20 MB per 200,000 four-element notifications, and more for larger ones. Dropping the reference also removes an allocation from the parse path, which makes parsing a small notification about 10% faster.\u003c/p\u003e\n\u003cp\u003eThe same change checks \u003ccode\u003ePyList_New\u003c/code\u003e for failure and guards \u003ccode\u003etryParentize\u003c/code\u003e against a \u003ccode\u003eNULL\u003c/code\u003e reply, so an allocation failure is now reported as an error instead of writing elements past the end of a zero-length notification.\u003c/p\u003e\n\u003cp\u003eRESP2 array replies were never affected.\u003c/p\u003e\n\u003ch2\u003eContributors\u003c/h2\u003e\n\u003cp\u003eThanks to \u003ca href=\"https://github.com/mmick78\"\u003e\u003ccode\u003e@​mmick78\u003c/code\u003e\u003c/a\u003e for finding and fixing this.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/hiredis-py/commit/b1b29513f005fbd2554711c1ed051a04b424283c\"\u003e\u003ccode\u003eb1b2951\u003c/code\u003e\u003c/a\u003e [3.4] Release the list each push notification is sized from, release 3.4.2 (#...\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/redis/hiredis-py/compare/v3.4.1...v3.4.2\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `coverage` from 7.16.0 to 7.16.2\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/coveragepy/coveragepy/releases\"\u003ecoverage's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e7.16.2\u003c/h2\u003e\n\u003ch2\u003eVersion 7.16.2 — 2026-09-27\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eFix: on Python 3.14 and later, a \u003ccode\u003efor\u003c/code\u003e loop completing immediately before a function return could mistakenly report an uncovered branch. This is now fixed, closing \u003ca href=\"https://redirect.github.com/coveragepy/coveragepy/issues/2168\"\u003eissue 2168\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003eFix: on Python 3.14 and later, the \u003ccode\u003eelse\u003c/code\u003e clause of a \u003ccode\u003etry\u003c/code\u003e whose body is a \u003ccode\u003ewith\u003c/code\u003e statement could incorrectly be reported as covered when the \u003ccode\u003ewith\u003c/code\u003e raised. This is now fixed, closing \u003ca href=\"https://redirect.github.com/coveragepy/coveragepy/issues/2289\"\u003eissue 2289\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003eFix: with \u003ccode\u003edynamic_context = test_function\u003c/code\u003e, test methods written as \u003ccode\u003e@staticmethod\u003c/code\u003e or \u003ccode\u003e@classmethod\u003c/code\u003e were not given a context of their own. Now they are, on Python 3.11 and later. Closes \u003ca href=\"https://redirect.github.com/coveragepy/coveragepy/issues/1923\"\u003eissue 1923\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e:arrow_right:  PyPI page: \u003ca href=\"https://pypi.org/project/coverage/7.16.2\"\u003ecoverage 7.16.2\u003c/a\u003e.\n:arrow_right:  To install: \u003ccode\u003epython3 -m pip install coverage==7.16.2\u003c/code\u003e\u003c/p\u003e\n\u003ch2\u003e7.16.1\u003c/h2\u003e\n\u003ch2\u003eVersion 7.16.1 — 2026-09-13\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eFix: when the body of an irrefutable \u003ccode\u003ecase\u003c/code\u003e (like \u003ccode\u003ecase _:\u003c/code\u003e) is entirely excluded, the \u003ccode\u003ecase\u003c/code\u003e line is now excluded too, just as an excluded \u003ccode\u003eelse:\u003c/code\u003e body removes the \u003ccode\u003eelse:\u003c/code\u003e line. Previously the \u003ccode\u003ecase\u003c/code\u003e line was left behind and reported as missing. Closes \u003ca href=\"https://redirect.github.com/coveragepy/coveragepy/issues/1563\"\u003eissue 1563\u003c/a\u003e with \u003ca href=\"https://redirect.github.com/coveragepy/coveragepy/pull/2269\"\u003epull 2269\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003eFix: using \u003ca href=\"https://coverage.readthedocs.io/en/latest/api_coveragedata.html#coverage.CoverageData.update\"\u003eCoverageData.update()\u003c/a\u003e twice on an in-memory database would fail, as described in \u003ca href=\"https://redirect.github.com/coveragepy/coveragepy/issues/2279\"\u003eissue 2279\u003c/a\u003e. This is now fixed.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e:arrow_right:  PyPI page: \u003ca href=\"https://pypi.org/project/coverage/7.16.1\"\u003ecoverage 7.16.1\u003c/a\u003e.\n:arrow_right:  To install: \u003ccode\u003epython3 -m pip install coverage==7.16.1\u003c/code\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/coveragepy/coveragepy/blob/main/CHANGES.rst\"\u003ecoverage's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003eVersion 7.16.2 — 2026-09-27\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eFix: on Python 3.14 and later, a \u003ccode\u003efor\u003c/code\u003e loop completing immediately before a\nfunction return could mistakenly report an uncovered branch. This is now\nfixed, closing \u003ccode\u003eissue 2168\u003c/code\u003e_.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFix: on Python 3.14 and later, the \u003ccode\u003eelse\u003c/code\u003e clause of a \u003ccode\u003etry\u003c/code\u003e whose body is\na \u003ccode\u003ewith\u003c/code\u003e statement could incorrectly be reported as covered when the\n\u003ccode\u003ewith\u003c/code\u003e raised.  This is now fixed, closing \u003ccode\u003eissue 2289\u003c/code\u003e_.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFix: with \u003ccode\u003edynamic_context = test_function\u003c/code\u003e, test methods written as\n\u003ccode\u003e@staticmethod\u003c/code\u003e or \u003ccode\u003e@classmethod\u003c/code\u003e were not given a context of their own.\nNow they are, on Python 3.11 and later.  Closes \u003ccode\u003eissue 1923\u003c/code\u003e_.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e.. _issue 1923: \u003ca href=\"https://redirect.github.com/coveragepy/coveragepy/issues/1923\"\u003ecoveragepy/coveragepy#1923\u003c/a\u003e\n.. _issue 2168: \u003ca href=\"https://redirect.github.com/coveragepy/coveragepy/issues/2168\"\u003ecoveragepy/coveragepy#2168\u003c/a\u003e\n.. _issue 2289: \u003ca href=\"https://redirect.github.com/coveragepy/coveragepy/issues/2289\"\u003ecoveragepy/coveragepy#2289\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e.. _changes_7-16-1:\u003c/p\u003e\n\u003ch2\u003eVersion 7.16.1 — 2026-09-13\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eFix: when the body of an irrefutable \u003ccode\u003ecase\u003c/code\u003e (like \u003ccode\u003ecase _:\u003c/code\u003e) is entirely\nexcluded, the \u003ccode\u003ecase\u003c/code\u003e line is now excluded too, just as an excluded\n\u003ccode\u003eelse:\u003c/code\u003e body removes the \u003ccode\u003eelse:\u003c/code\u003e line.  Previously the \u003ccode\u003ecase\u003c/code\u003e line was\nleft behind and reported as missing.  Closes \u003ccode\u003eissue 1563\u003c/code\u003e_ with \u003ccode\u003epull 2269\u003c/code\u003e_.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFix: using :meth:\u003ccode\u003e.CoverageData.update\u003c/code\u003e twice on an in-memory database would\nfail, as described in \u003ccode\u003eissue 2279\u003c/code\u003e_. This is now fixed.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e.. _issue 1563: \u003ca href=\"https://redirect.github.com/coveragepy/coveragepy/issues/1563\"\u003ecoveragepy/coveragepy#1563\u003c/a\u003e\n.. _pull 2269: \u003ca href=\"https://redirect.github.com/coveragepy/coveragepy/pull/2269\"\u003ecoveragepy/coveragepy#2269\u003c/a\u003e\n.. _issue 2279: \u003ca href=\"https://redirect.github.com/coveragepy/coveragepy/issues/2279\"\u003ecoveragepy/coveragepy#2279\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e.. _changes_7-16-0:\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/coveragepy/coveragepy/commit/5643ae7c682bbd56ee1ac2b11556145ab8c2cab0\"\u003e\u003ccode\u003e5643ae7\u003c/code\u003e\u003c/a\u003e docs: prep for 7.16.2\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/coveragepy/coveragepy/commit/a3e969fc6ce8273538702a2336d8c2674f8017d8\"\u003e\u003ccode\u003ea3e969f\u003c/code\u003e\u003c/a\u003e fix: dynamic_context for \u003ca href=\"https://github.com/staticmethod\"\u003e\u003ccode\u003e@​staticmethod\u003c/code\u003e\u003c/a\u003e and \u003ca href=\"https://github.com/classmethod\"\u003e\u003ccode\u003e@​classmethod\u003c/code\u003e\u003c/a\u003e tests (issue 1923) (#...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/coveragepy/coveragepy/commit/8ad72362f03e59643865d15ffadd002529a777a9\"\u003e\u003ccode\u003e8ad7236\u003c/code\u003e\u003c/a\u003e fix: stop counting the try/else line when a with statement raises (\u003ca href=\"https://redirect.github.com/coveragepy/coveragepy/issues/2301\"\u003e#2301\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/coveragepy/coveragepy/commit/c6dab1fc387d161fe5938ce9421a7a38ca81ae7f\"\u003e\u003ccode\u003ec6dab1f\u003c/code\u003e\u003c/a\u003e fix(debug): debug output doesn't mis-handle odd line separators \u003ca href=\"https://redirect.github.com/coveragepy/coveragepy/issues/2296\"\u003e#2296\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/coveragepy/coveragepy/commit/08fbc3229adc8e7681a0d9134d3d5beb1684ae54\"\u003e\u003ccode\u003e08fbc32\u003c/code\u003e\u003c/a\u003e style: Protocols should use \u003ccode\u003e...\u003c/code\u003e for method bodies\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/coveragepy/coveragepy/commit/bc7b0e386388148687241cadcab56ac3e17aea9c\"\u003e\u003ccode\u003ebc7b0e3\u003c/code\u003e\u003c/a\u003e refactor: positional-only args are better than pragmas\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/coveragepy/coveragepy/commit/52afd6be360c3b949d69ff83aca873c119a7959a\"\u003e\u003ccode\u003e52afd6b\u003c/code\u003e\u003c/a\u003e Document parallel tox coverage data files (\u003ca href=\"https://redirect.github.com/coveragepy/coveragepy/issues/2284\"\u003e#2284\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/coveragepy/coveragepy/commit/f653aaec4c58f89375716389e4ca17dd056d2069\"\u003e\u003ccode\u003ef653aae\u003c/code\u003e\u003c/a\u003e fix: loop completion arcs on Python 3.14 (\u003ca href=\"https://redirect.github.com/coveragepy/coveragepy/issues/2281\"\u003e#2281\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/coveragepy/coveragepy/commit/cc1ced4d4c8ef7674a824002aa5157d1f37acd78\"\u003e\u003ccode\u003ecc1ced4\u003c/code\u003e\u003c/a\u003e test: PyPy still compiles comprehensions as functions\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/coveragepy/coveragepy/commit/85a9088395e89840cb11c1c86735ba1f7a62d50d\"\u003e\u003ccode\u003e85a9088\u003c/code\u003e\u003c/a\u003e chore: make upgrade\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/coveragepy/coveragepy/compare/7.16.0...7.16.2\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `django-stubs[compatible-mypy]` from 6.1.0 to 6.1.2\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/typeddjango/django-stubs/releases\"\u003edjango-stubs[compatible-mypy]'s releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e6.1.2\u003c/h2\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eSupport \u003ccode\u003emypy@2.4\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eLoosen \u003ccode\u003eWidget.format_value\u003c/code\u003e and remove override ignores by \u003ca href=\"https://github.com/brianhelba\"\u003e\u003ccode\u003e@​brianhelba\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/pull/3643\"\u003etypeddjango/django-stubs#3643\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003email: Accept smtp timeout as float by \u003ca href=\"https://github.com/9128305\"\u003e\u003ccode\u003e@​9128305\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/pull/3656\"\u003etypeddjango/django-stubs#3656\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix lookup expected type for transform chains (e.g. start_date__year__in) by \u003ca href=\"https://github.com/manysuq\"\u003e\u003ccode\u003e@​manysuq\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/pull/3655\"\u003etypeddjango/django-stubs#3655\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAllow a sequence of ActionLocation in admin.action's location by \u003ca href=\"https://github.com/knyghty\"\u003e\u003ccode\u003e@​knyghty\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/pull/3661\"\u003etypeddjango/django-stubs#3661\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/9128305\"\u003e\u003ccode\u003e@​9128305\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/pull/3656\"\u003etypeddjango/django-stubs#3656\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/typeddjango/django-stubs/compare/6.1.1...6.1.2\"\u003ehttps://github.com/typeddjango/django-stubs/compare/6.1.1...6.1.2\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e6.1.1\u003c/h2\u003e\n\u003ch2\u003eHighlight\u003c/h2\u003e\n\u003cp\u003eThis release does some changes around \u003ccode\u003eManager\u003c/code\u003e / \u003ccode\u003eRelatedManager\u003c/code\u003e and the auto generated \u003ccode\u003eobjects\u003c/code\u003e attribute to work better with typechecker like pyright / ty / pyrefly and be more strict about the fact that \u003ccode\u003eMyModel().objects\u003c/code\u003e is not valid.\u003c/p\u003e\n\u003cp\u003eHowever, to support that, existing broad annotations of related managers need to be narrowed or access to these related managers will be flagged as an error. For ex:\u003c/p\u003e\n\u003cpre lang=\"diff\"\u003e\u003ccode\u003efrom django.db import models\r\nfrom django_stubs_ext.db.models.manager import ManyRelatedManager, RelatedManager\r\n\u003cp\u003eclass Article(models.Model):\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ecategory_set: Manager[Category]\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003ecategory_set: RelatedManager[Category]\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003etags: Manager[Tag, ArticleTag]\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003etags: ManyRelatedManager[Tag, ArticleTag]\n\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eIf you use the mypy plugin, you should also be able to drop these annotation completely in most cases. The plugin infers these types automatically.\u003c/p\u003e\n\u003cp\u003eSee \u003ca href=\"https://github.com/typeddjango/django-stubs#do-i-need-to-annotate-reverse-relations\"\u003ehttps://github.com/typeddjango/django-stubs#do-i-need-to-annotate-reverse-relations\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eFix revealed type for DistanceField and AreaField by \u003ca href=\"https://github.com/WhyNotHugo\"\u003e\u003ccode\u003e@​WhyNotHugo\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/pull/3587\"\u003etypeddjango/django-stubs#3587\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAllow database variants in on_delete for related fields. by \u003ca href=\"https://github.com/felixxm\"\u003e\u003ccode\u003e@​felixxm\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/pull/3591\"\u003etypeddjango/django-stubs#3591\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix bogus name-defined error for cross-module as_manager overrides by \u003ca href=\"https://github.com/BenA-SA\"\u003e\u003ccode\u003e@​BenA-SA\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/pull/3597\"\u003etypeddjango/django-stubs#3597\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix monkeypatch() erasing parametrization of real Generic subclasses by \u003ca href=\"https://github.com/mylittletraf\"\u003e\u003ccode\u003e@​mylittletraf\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/pull/3610\"\u003etypeddjango/django-stubs#3610\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eDon't build a ManyRelatedManager from a placeholder _Through by \u003ca href=\"https://github.com/codebreach\"\u003e\u003ccode\u003e@​codebreach\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/pull/3608\"\u003etypeddjango/django-stubs#3608\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAnnotate \u003ccode\u003eFileField.save_form_data\u003c/code\u003e by \u003ca href=\"https://github.com/brianhelba\"\u003e\u003ccode\u003e@​brianhelba\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/pull/3606\"\u003etypeddjango/django-stubs#3606\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eDisallow \u003ccode\u003eNone\u003c/code\u003e passed to \u003ccode\u003eFileField.generate_filename\u003c/code\u003e by \u003ca href=\"https://github.com/brianhelba\"\u003e\u003ccode\u003e@​brianhelba\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/pull/3607\"\u003etypeddjango/django-stubs#3607\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdd overloads for \u003ccode\u003eassertTemplateUsed\u003c/code\u003e and \u003ccode\u003eassertTemplateNotUsed\u003c/code\u003e by \u003ca href=\"https://github.com/brianhelba\"\u003e\u003ccode\u003e@​brianhelba\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/pull/3564\"\u003etypeddjango/django-stubs#3564\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdd defaults to the form type parameters of generic editing views by \u003ca href=\"https://github.com/brianhelba\"\u003e\u003ccode\u003e@​brianhelba\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/pull/3615\"\u003etypeddjango/django-stubs#3615\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eResolve objects through the metaclass and ban manager access on instances by \u003ca href=\"https://github.com/UnknownPlatypus\"\u003e\u003ccode\u003e@​UnknownPlatypus\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/pull/3593\"\u003etypeddjango/django-stubs#3593\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eType \u003ccode\u003esetter\u003c/code\u003e in \u003ccode\u003ehashers.check_password\u003c/code\u003e better by \u003ca href=\"https://github.com/Kakadus\"\u003e\u003ccode\u003e@​Kakadus\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/pull/3621\"\u003etypeddjango/django-stubs#3621\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRelax \u003ccode\u003eAbstractBaseUser.natural_key\u003c/code\u003e return type by \u003ca href=\"https://github.com/Kakadus\"\u003e\u003ccode\u003e@​Kakadus\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/pull/3622\"\u003etypeddjango/django-stubs#3622\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix \u003ccode\u003e@admin.display\u003c/code\u003e overload to specify \u003ccode\u003efunction\u003c/code\u003e by \u003ca href=\"https://github.com/ngnpope\"\u003e\u003ccode\u003e@​ngnpope\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/pull/3620\"\u003etypeddjango/django-stubs#3620\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/typeddjango/django-stubs/commit/fa03b48b8cdfe336065f5ad8eb51fbcc40c6b1d2\"\u003e\u003ccode\u003efa03b48\u003c/code\u003e\u003c/a\u003e Version 6.1.2 release (\u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/issues/3681\"\u003e#3681\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/typeddjango/django-stubs/commit/3568355bc144517b793f360884ea500f8c4c8352\"\u003e\u003ccode\u003e3568355\u003c/code\u003e\u003c/a\u003e Update dependency mypy to \u0026gt;=1.13,\u0026lt;2.5 (\u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/issues/3680\"\u003e#3680\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/typeddjango/django-stubs/commit/46cd7de1d2f48ecf9727992e4c7ce114d3f98b8f\"\u003e\u003ccode\u003e46cd7de\u003c/code\u003e\u003c/a\u003e Update dependency pyrefly to v1.3.2 (\u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/issues/3677\"\u003e#3677\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/typeddjango/django-stubs/commit/de0b49c8fb5d82bb2d5ab86ab4e4a92430a3893b\"\u003e\u003ccode\u003ede0b49c\u003c/code\u003e\u003c/a\u003e [pre-commit.ci] pre-commit autoupdate (\u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/issues/3675\"\u003e#3675\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/typeddjango/django-stubs/commit/c7b59a09461784a6ec07704fcfc67391f7e8000d\"\u003e\u003ccode\u003ec7b59a0\u003c/code\u003e\u003c/a\u003e Update dependency ty to v0.0.83 (\u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/issues/3671\"\u003e#3671\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/typeddjango/django-stubs/commit/e3a1189abb30e181d2e68fd6dd3cb868505dd584\"\u003e\u003ccode\u003ee3a1189\u003c/code\u003e\u003c/a\u003e Update astral-sh/setup-uv action to v10.2.0 (\u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/issues/3672\"\u003e#3672\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/typeddjango/django-stubs/commit/f0a186a2e272abcfdbd01e3f774c46afff9cd208\"\u003e\u003ccode\u003ef0a186a\u003c/code\u003e\u003c/a\u003e Update int128/hide-comment-action action to v1.75.0 (\u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/issues/3669\"\u003e#3669\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/typeddjango/django-stubs/commit/63161efeb94263520bed6fb6fb1023844b4b5872\"\u003e\u003ccode\u003e63161ef\u003c/code\u003e\u003c/a\u003e [pre-commit.ci] pre-commit autoupdate (\u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/issues/3667\"\u003e#3667\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/typeddjango/django-stubs/commit/dc0185492a5a26c64d8fc67278580ea5eb911c3f\"\u003e\u003ccode\u003edc01854\u003c/code\u003e\u003c/a\u003e Update dependency psycopg to v3.3.6 (\u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/issues/3668\"\u003e#3668\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/typeddjango/django-stubs/commit/d563832a021a84d56592e2828d054e56572421cb\"\u003e\u003ccode\u003ed563832\u003c/code\u003e\u003c/a\u003e Update dependency ty to v0.0.82 (\u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/issues/3665\"\u003e#3665\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/typeddjango/django-stubs/compare/6.1.0...6.1.2\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `django-upgrade` from 1.32.0 to 1.33.0\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/adamchainz/django-upgrade/blob/main/docs/changelog.rst\"\u003edjango-upgrade's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e1.33.0 (2026-10-02)\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eReduce garbage collection frequency while fixing files, yielding a performance improvement of 2-7%, depending on Python version.\nMeasured on the source code of Django, Saleor, Wagtail, and Zulip, with no changes to make, the median speedups were ~7% on Python 3.11, ~3% on Python 3.13, and ~2% on Python 3.14, with no change in peak memory usage.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003ePR [#735](https://github.com/adamchainz/django-upgrade/issues/735) \u0026lt;https://github.com/adamchainz/django-upgrade/pull/735\u0026gt;\u003c/code\u003e__.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSpeed up the AST traversal by skipping fields that never contain nodes for fixers, such as expression contexts, yielding a further performance improvement of 3-7% on the same projects.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003ePR [#736](https://github.com/adamchainz/django-upgrade/issues/736) \u0026lt;https://github.com/adamchainz/django-upgrade/pull/736\u0026gt;\u003c/code\u003e__.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOnly call fixers for function calls, names, and attributes with names they handle, yielding a further performance improvement of 23-29% on the same projects.\nCombined with the above changes, django-upgrade is now 27-38% faster on these projects.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003ePR [#737](https://github.com/adamchainz/django-upgrade/issues/737) \u0026lt;https://github.com/adamchainz/django-upgrade/pull/737\u0026gt;\u003c/code\u003e__.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/adamchainz/django-upgrade/commit/5ccd385680292c5e5b10bedf0a3e509b5e6e9da8\"\u003e\u003ccode\u003e5ccd385\u003c/code\u003e\u003c/a\u003e Version 1.33.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/adamchainz/django-upgrade/commit/1d134cf353066b9cb281d45e88efd01c75f0de27\"\u003e\u003ccode\u003e1d134cf\u003c/code\u003e\u003c/a\u003e Add links to changelog notes\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/adamchainz/django-upgrade/commit/8dc2dbac056bf44b3487e68dfa57e45d84a56766\"\u003e\u003ccode\u003e8dc2dba\u003c/code\u003e\u003c/a\u003e Dispatch fixer callbacks by name (\u003ca href=\"https://redirect.github.com/adamchainz/django-upgrade/issues/737\"\u003e#737\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/adamchainz/django-upgrade/commit/7c4ff49d3870c6b746cf2ca11c89aaadff359ee8\"\u003e\u003ccode\u003e7c4ff49\u003c/code\u003e\u003c/a\u003e Speed up AST traversal in \u003ccode\u003evisit()\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/adamchainz/django-upgrade/issues/736\"\u003e#736\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/adamchainz/django-upgrade/commit/f2edbc3b0eaa517f1c36732c475007c700356191\"\u003e\u003ccode\u003ef2edbc3\u003c/code\u003e\u003c/a\u003e Reduce garbage collection frequency while fixing (\u003ca href=\"https://redirect.github.com/adamchainz/django-upgrade/issues/735\"\u003e#735\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/adamchainz/django-upgrade/commit/4580ebd9bf9fb9bcb89c3f61aceff21c4a9c74ab\"\u003e\u003ccode\u003e4580ebd\u003c/code\u003e\u003c/a\u003e Upgrade dependencies (\u003ca href=\"https://redirect.github.com/adamchainz/django-upgrade/issues/734\"\u003e#734\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/adamchainz/django-upgrade/commit/0c01d574b5cda79327614493c20fbefaf6f9fc49\"\u003e\u003ccode\u003e0c01d57\u003c/code\u003e\u003c/a\u003e [pre-commit.ci] pre-commit autoupdate (\u003ca href=\"https://redirect.github.com/adamchainz/django-upgrade/issues/732\"\u003e#732\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/adamchainz/django-upgrade/commit/592d36791b845dba8d0333f5c1f05289baf5a075\"\u003e\u003ccode\u003e592d367\u003c/code\u003e\u003c/a\u003e Upgrade dependencies (\u003ca href=\"https://redirect.github.com/adamchainz/django-upgrade/issues/731\"\u003e#731\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/adamchainz/django-upgrade/compare/1.32.0...1.33.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `djlint` from 1.46.1 to 1.46.4\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/djlint/djLint/releases\"\u003edjlint's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev1.46.4\u003c/h2\u003e\n\u003ch3\u003eFix\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eA line that opens a template block now indents the lines inside it when the rest of the line looks like a single-line html tag. Before, html in a string argument, as in \u003ccode\u003e{% call modal(\u0026quot;\u0026lt;strong\u0026gt;\u0026quot; ~ n ~ \u0026quot;\u0026lt;/strong\u0026gt;\u0026quot;) %}\u003c/code\u003e, or inline html right after the opening tag, as in \u003ccode\u003e{% if a %}\u0026lt;b\u0026gt;x\u0026lt;/b\u0026gt;\u003c/code\u003e, left the block's contents at its own level, and its closing tag ended up one level too far out.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev1.46.3\u003c/h2\u003e\n\u003ch3\u003ePerformance\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eA long run of unclosed \u003ccode\u003e{{\u003c/code\u003e or \u003ccode\u003e{%\u003c/code\u003e no longer makes linting and formatting quadratic. Each was read again from every opener to the end of the line or the file, so eight thousand \u003ccode\u003e{{\u003c/code\u003e on one line took over half a minute to lint and as long again to format, and twenty thousand in one attribute value took \u003ccode\u003eH054\u003c/code\u003e alone 80 seconds; each now takes well under a second. A second opener is taken to mean the first one never closed, which is how the tokenizer already read them. \u003ccode\u003eT038\u003c/code\u003e still reads an unclosed \u003ccode\u003e{%\u003c/code\u003e up to the next \u003ccode\u003e%}\u003c/code\u003e, as django does, so a run of those stays slow there.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eFix\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eA \u003ccode\u003e\u0026gt;\u003c/code\u003e inside a string of a template tag no longer ends the html tag around it when the string reuses the attribute's quote, as in \u003ccode\u003eclass=\u0026quot;{{ classes|default:\u0026quot;[\u0026amp;\u0026gt;a]:flex\u0026quot; }}\u0026quot;\u003c/code\u003e. Before, the linter lost the rest of the tag, so \u003ccode\u003eH037\u003c/code\u003e missed a repeated attribute after it, and the formatter put a line break inside the string.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eH054\u003c/code\u003e no longer reads an attribute out of a \u003ccode\u003e{# #}\u003c/code\u003e comment in another attribute's value, as in \u003ccode\u003e\u0026lt;a title=\u0026quot;{# \u0026quot; href #}\u0026quot;\u0026gt;\u003c/code\u003e, and leaves an input alone when an \u003ccode\u003e{% if %}\u003c/code\u003e writes its type and another tag writes the value, as in \u003ccode\u003e{% if shown %}type=\u0026quot;{% if hidden %}hidden{% else %}text{% endif %}\u0026quot;{% endif %}\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eA \u003ccode\u003e{#\u003c/code\u003e inside a \u003ccode\u003e{{ }}\u003c/code\u003e or \u003ccode\u003e{% %}\u003c/code\u003e tag, as in \u003ccode\u003e{{ \u0026quot;{# x\u0026quot; }}\u003c/code\u003e or an ICU message such as \u003ccode\u003e{n, plural, one {# item} other {# items}}\u003c/code\u003e, no longer opens a comment that runs to the next \u003ccode\u003e#}\u003c/code\u003e in the file. Before, the linter skipped everything in between, so \u003ccode\u003eT038\u003c/code\u003e reported the \u003ccode\u003e{% if %}\u003c/code\u003e before it as unclosed and \u003ccode\u003eT041\u003c/code\u003e missed an \u003ccode\u003e{% extends %}\u003c/code\u003e after it, and the formatter left the lines in between unformatted. A tag ends at its first closing delimiter, which is where django ends it.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev1.46.2\u003c/h2\u003e\n\u003ch3\u003eDocs\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eEach option on the configuration page now carries the release that brought it, so a reader held to an older djLint can tell at a glance what is there to reach for. The page's filter searches the versions too.\u003c/li\u003e\n\u003cli\u003edjLint publishes its own json schema at \u003ca href=\"https://djlint.com/schema/djlint.json\"\u003ehttps://djlint.com/schema/djlint.json\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003ePackaging\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eThe minimum required regex version is lowered from 2022.6.2 back to 2021.8.21, the first release that ships wheels for Python 3.10, which is djLint's own minimum.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/djlint/djLint/blob/master/CHANGELOG.md\"\u003edjlint's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e[1.46.4] - 2026-10-01\u003c/h2\u003e\n\u003ch3\u003eFix\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eA line that opens a template block now indents the lines inside it when the rest of the line looks like a single-line html tag. Before, html in a string argument, as in \u003ccode\u003e{% call modal(\u0026quot;\u0026lt;strong\u0026gt;\u0026quot; ~ n ~ \u0026quot;\u0026lt;/strong\u0026gt;\u0026quot;) %}\u003c/code\u003e, or inline html right after the opening tag, as in \u003ccode\u003e{% if a %}\u0026lt;b\u0026gt;x\u0026lt;/b\u0026gt;\u003c/code\u003e, left the block's contents at its own level, and its closing tag ended up one level too far out.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e[1.46.3] - 2026-09-28\u003c/h2\u003e\n\u003ch3\u003ePerformance\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eA long run of unclosed \u003ccode\u003e{{\u003c/code\u003e or \u003ccode\u003e{%\u003c/code\u003e no longer makes linting and formatting quadratic. Each was read again from every opener to the end of the line or the file, so eight thousand \u003ccode\u003e{{\u003c/code\u003e on one line took over half a minute to lint and as long again to format, and twenty thousand in one attribute value took \u003ccode\u003eH054\u003c/code\u003e alone 80 seconds; each now takes well under a second. A second opener is taken to mean the first one never closed, which is how the tokenizer already read them. \u003ccode\u003eT038\u003c/code\u003e still reads an unclosed \u003ccode\u003e{%\u003c/code\u003e up to the next \u003ccode\u003e%}\u003c/code\u003e, as django does, so a run of those stays slow there.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eFix\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eA \u003ccode\u003e\u0026gt;\u003c/code\u003e inside a string of a template tag no longer ends the html tag around it when the string reuses the attribute's quote, as in \u003ccode\u003eclass=\u0026quot;{{ classes|default:\u0026quot;[\u0026amp;\u0026gt;a]:flex\u0026quot; }}\u0026quot;\u003c/code\u003e. Before, the linter lost the rest of the tag, so \u003ccode\u003eH037\u003c/code\u003e missed a repeated attribute after it, and the formatter put a line break inside the string.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eH054\u003c/code\u003e no longer reads an attribute out of a \u003ccode\u003e{# #}\u003c/code\u003e comment in another attribute's value, as in \u003ccode\u003e\u0026lt;a title=\u0026quot;{# \u0026quot; href #}\u0026quot;\u0026gt;\u003c/code\u003e, and leaves an input alone when an \u003ccode\u003e{% if %}\u003c/code\u003e writes its type and another tag writes the value, as in \u003ccode\u003e{% if shown %}type=\u0026quot;{% if hidden %}hidden{% else %}text{% endif %}\u0026quot;{% endif %}\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eA \u003ccode\u003e{#\u003c/code\u003e inside a \u003ccode\u003e{{ }}\u003c/code\u003e or \u003ccode\u003e{% %}\u003c/code\u003e tag, as in \u003ccode\u003e{{ \u0026quot;{# x\u0026quot; }}\u003c/code\u003e or an ICU message such as \u003ccode\u003e{n, plural, one {# item} other {# items}}\u003c/code\u003e, no longer opens a comment that runs to the next \u003ccode\u003e#}\u003c/code\u003e in the file. Before, the linter skipped everything in between, so \u003ccode\u003eT038\u003c/code\u003e reported the \u003ccode\u003e{% if %}\u003c/code\u003e before it as unclosed and \u003ccode\u003eT041\u003c/code\u003e missed an \u003ccode\u003e{% extends %}\u003c/code\u003e after it, and the formatter left the lines in between unformatted. A tag ends at its first closing delimiter, which is where django ends it.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e[1.46.2] - 2026-09-19\u003c/h2\u003e\n\u003ch3\u003eDocs\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eEach option on the configuration page now carries the release that brought it, so a reader held to an older djLint can tell at a glance what is there to reach for. The page's filter searches the versions too.\u003c/li\u003e\n\u003cli\u003edjLint publishes its own json schema at \u003ca href=\"https://djlint.com/schema/djlint.json\"\u003ehttps://djlint.com/schema/djlint.json\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003ePackaging\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eThe minimum required regex version is lowered from 2022.6.2 back to 2021.8.21, the first release that ships wheels for Python 3.10, which is djLint's own minimum.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/djlint/djLint/commit/97266b950ee135d6ef89c9ace9d88baadced6f67\"\u003e\u003ccode\u003e97266b9\u003c/code\u003e\u003c/a\u003e chore(deps): update pre-commit hook tombi-toml/tombi-pre-commit to v1.5.6 (\u003ca href=\"https://redirect.github.com/djlint/djLint/issues/2\"\u003e#2\u003c/a\u003e...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/djlint/djLint/commit/5f40a434241d69428152cada7a63f3e25d19582e\"\u003e\u003ccode\u003e5f40a43\u003c/code\u003e\u003c/a\u003e v1.46.4\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/djlint/djLint/commit/47128e081ee74481e5c7386f3e3739158c3c09b1\"\u003e\u003ccode\u003e47128e0\u003c/code\u003e\u003c/a\u003e fix: indent under a block opener that holds inline html\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/djlint/djLint/commit/afe85bc3358ddc5d7ceb1af9ecf12bbb6491047e\"\u003e\u003ccode\u003eafe85bc\u003c/code\u003e\u003c/a\u003e chore(deps): lock file maintenance (\u003ca href=\"https://redirect.github.com/djlint/djLint/issues/2583\"\u003e#2583\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/djlint/djLint/commit/257c30fb1ddf311eb9b82658cc0d5adad4c90857\"\u003e\u003ccode\u003e257c30f\u003c/code\u003e\u003c/a\u003e chore(deps): lock file maintenance (\u003ca href=\"https://redirect.github.com/djlint/djLint/issues/2582\"\u003e#2582\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/djlint/djLint/commit/f1db0c54ccd6bc1934640e09cf977a640adcb0e5\"\u003e\u003ccode\u003ef1db0c5\u003c/code\u003e\u003c/a\u003e chore(deps): lock file maintenance (\u003ca href=\"https://redirect.github.com/djlint/djLint/issues/2581\"\u003e#2581\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/djlint/djLint/commit/0fe43b78ec51686f2db7167e311d4293fd0680cd\"\u003e\u003ccode\u003e0fe43b7\u003c/code\u003e\u003c/a\u003e chore(deps): lock file maintenance (\u003ca href=\"https://redirect.github.com/djlint/djLint/issues/2580\"\u003e#2580\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/djlint/djLint/commit/df19d81c59b0b15585e5ae3144952a2903646210\"\u003e\u003ccode\u003edf19d81\u003c/code\u003e\u003c/a\u003e v1.46.3\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/djlint/djLint/commit/83a1c0fc483e7ba7e3efd5a39bced6c681007ae7\"\u003e\u003ccode\u003e83a1c0f\u003c/code\u003e\u003c/a\u003e perf: stop reading a template tag at the next opener\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/djlint/djLint/commit/6ab9892a68620a0bdcc4e2ff964f84069689e65a\"\u003e\u003ccode\u003e6ab9892\u003c/code\u003e\u003c/a\u003e perf: read a run of unclosed template openers once\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/djlint/djLint/compare/v1.46.1...v1.46.4\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `mypy` from 2.3.1 to 2.4.0\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/python/mypy/blob/master/CHANGELOG.md\"\u003emypy's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003eMypy Release Notes\u003c/h1\u003e\n\u003ch2\u003eNext Release\u003c/h2\u003e\n\u003ch2\u003eMypy 2.4\u003c/h2\u003e\n\u003cp\u003eWe've just uploaded mypy 2.4.0 to the Python Package Index (\u003ca href=\"https://pypi.org/project/mypy/\"\u003ePyPI\u003c/a\u003e).\nMypy is a static type checker for Python. This release includes new features, performance\nimprovements and bug fixes. You can install it as follows:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003epython3 -m pip install -U mypy\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eYou can read the full documentation for this release on \u003ca href=\"http://mypy.readthedocs.io\"\u003eRead the Docs\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003ePython 3.15 Support\u003c/h3\u003e\n\u003cp\u003eMypy 2.4 supports running on Python 3.15 and type checking most Python\n3.15 features. This includes the new builtin \u003ccode\u003esentinel\u003c/code\u003e type for\nsentinel values (PEP 661), which mypy now supports (see below for\ndetails). Lazy imports (PEP 810) and unpacking in comprehensions\n(PEP 798) are also supported. Closed TypedDicts (PEP 728) have been\nsupported since mypy 2.2, but the \u003ccode\u003eextra_items\u003c/code\u003e TypedDict argument,\nalso introduced in PEP 728, is still unsupported. Support for\n\u003ccode\u003eextra_items\u003c/code\u003e will be added in a future mypy release.\u003c/p\u003e\n\u003ch3\u003eNative Parser Enabled by Default\u003c/h3\u003e\n\u003cp\u003eMypy now uses the new native parser by default. It's based on the Ruff\nparser, and it's significantly faster than the legacy parser, which\nuses the stdlib \u003ccode\u003east\u003c/code\u003e module. The native parser also has other\nbenefits:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eYou can target newer Python versions and use recent Python syntax\neven when running mypy on an older Python version. For example, you\ncan use \u003ccode\u003e--python-version 3.15\u003c/code\u003e when running mypy on Python 3.14.\u003c/li\u003e\n\u003cli\u003eStub files can use syntax that is newer than the target Python\nversion. For example, stubs can use the PEP 695 generic class syntax\n(\u003ccode\u003eclass Box[T]: ...\u003c/code\u003e) when running on or targeting Python 3.10.\u003c/li\u003e\n\u003cli\u003eParallel type checking requires the native parser.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe legacy parser is still available through \u003ccode\u003e--no-native-parser\u003c/code\u003e, or\n\u003ccode\u003enative_parser = False\u003c/code\u003e in the config file (\u003ccode\u003enative_parser = false\u003c/code\u003e\nunder \u003ccode\u003e[tool.mypy]\u003c/code\u003e in pyproject.toml). We are planning to remove the\nlegacy parser in early 2027. If you run into a problem with the native\nparser, please report it on the\n\u003ca href=\"https://github.com/python/mypy/issues\"\u003eissue tracker\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eUnlike the legacy parser, the native parser doesn't support type\ncomments for variables defined by \u003ccode\u003efor\u003c/code\u003e and \u003ccode\u003ewith\u003c/code\u003e statements. These\ntype comments are silently ignored, and the types of the variables are\u003c/p\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/935ba8afba7ceacca0651579450c74339f343016\"\u003e\u003ccode\u003e935ba8a\u003c/code\u003e\u003c/a\u003e Bump version to 2.4.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/334a678967dc6bcda3d3f8cb82e253dd61fa2be9\"\u003e\u003ccode\u003e334a678\u003c/code\u003e\u003c/a\u003e Add link for PR 22066 in mypy 2.4 changelog (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22082\"\u003e#22082\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/fe69660bcdaa76cccb1aedbb4b9c1c7627215571\"\u003e\u003ccode\u003efe69660\u003c/code\u003e\u003c/a\u003e Finalize mypy 2.4 changelog (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22080\"\u003e#22080\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/541fd87ac53581fb3c511b277fd780ec4e869c95\"\u003e\u003ccode\u003e541fd87\u003c/code\u003e\u003c/a\u003e Various mypy 2.4 changelog updates (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22077\"\u003e#22077\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/b231182c0b2993918f74594236bda7d3ec6fcbe5\"\u003e\u003ccode\u003eb231182\u003c/code\u003e\u003c/a\u003e Update native parser docs (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22078\"\u003e#22078\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/04fe42ce217f120a4de2c1fd62b71ef77452d699\"\u003e\u003ccode\u003e04fe42c\u003c/code\u003e\u003c/a\u003e Initial Changelog for Mypy 2.4 (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22071\"\u003e#22071\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/06174941bca0e88567441ee3cb0ffaef0dd22e2c\"\u003e\u003ccode\u003e0617494\u003c/code\u003e\u003c/a\u003e Quick fix for non UTF-8 encodings with new parser (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22066\"\u003e#22066\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/b2f9b60eae5ac7cd9c6a60650b128815bb703daf\"\u003e\u003ccode\u003eb2f9b60\u003c/code\u003e\u003c/a\u003e Bump librt to 0.16.0 (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22067\"\u003e#22067\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/9d798dcb9589f9bd62e625a97d8db23ad9a678fa\"\u003e\u003ccode\u003e9d798dc\u003c/code\u003e\u003c/a\u003e Sync typeshed (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22054\"\u003e#22054\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/0861bb6450d6d3658e44dbca9cd2ba478faf3c1d\"\u003e\u003ccode\u003e0861bb6\u003c/code\u003e\u003c/a\u003e Reduce max protocol stack size to 20 (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22053\"\u003e#22053\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/python/mypy/compare/v2.3.1...v2.4.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `ruff` from 0.16.6 to 0.17.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/astral-sh/ruff/releases\"\u003eruff's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e0.17.0\u003c/h2\u003e\n\u003ch2\u003eRelease Notes\u003c/h2\u003e\n\u003cp\u003eReleased on 2026-10-09.\u003c/p\u003e\n\u003cp\u003eThe executables in our macOS and Windows release archives and \u003ccode\u003eruff\u003c/code\u003e wheels are now code-signed. macOS executables are signed with an Apple Developer ID certificate and notarized by Apple. Windows executables have timestamped Authenticode signatures from Azure Artifact Signing. This enables verification of the release publisher and binary integrity, supports publisher-based allowlisting, and should reduce security warnings and antivirus false positives.\u003c/p\u003e\n\u003ch3\u003eBreaking changes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate the default and latest Python versions for 3.15 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28792\"\u003e#28792\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eRuff now defaults to Python 3.11 instead of 3.10 when no Python version is configured through \u003ca href=\"https://docs.astral.sh/ruff/settings/#target-version\"\u003e\u003ccode\u003etarget-version\u003c/code\u003e\u003c/a\u003e or \u003ca href=\"https://docs.astral.sh/ruff/configuration/#inferring-the-python-version\"\u003e\u003ccode\u003erequires-python\u003c/code\u003e\u003c/a\u003e. When checking for syntax errors without a configured Python version, Ruff now defaults to Python 3.15 instead of 3.14.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate the default rule set (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28786\"\u003e#28786\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eSeveral of the \u003ccode\u003eflake8-datetimez\u003c/code\u003e rules (\u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-without-tzinfo/\"\u003e\u003ccode\u003eDTZ001\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-now-without-tzinfo/\"\u003e\u003ccode\u003eDTZ005\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-fromtimestamp/\"\u003e\u003ccode\u003eDTZ006\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-strptime-without-zone/\"\u003e\u003ccode\u003eDTZ007\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://docs.astral.sh/ruff/rules/call-date-today/\"\u003e\u003ccode\u003eDTZ011\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://docs.astral.sh/ruff/rules/call-date-fromtimestamp/\"\u003e\u003ccode\u003eDTZ012\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://docs.astral.sh/ruff/rules/datetime-min-max/\"\u003e\u003ccode\u003eDTZ901\u003c/code\u003e\u003c/a\u003e) are no longer enabled by default, while \u003ca href=\"https://docs.astral.sh/ruff/rules/undefined-local-with-nested-import-star-usage/\"\u003e\u003ccode\u003eundefined-local-with-nested-import-star-usage\u003c/code\u003e\u003c/a\u003e (\u003ccode\u003eF406\u003c/code\u003e), which corresponds to a syntax error, is now enabled by default.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate Rust crate quick-junit to 0.8.0 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/27295\"\u003e#27295\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eJUnit output now uses a \u003ccode\u003eskipped\u003c/code\u003e attribute instead of \u003ccode\u003edisabled\u003c/code\u003e on \u003ccode\u003e\u0026lt;testsuite\u0026gt;\u003c/code\u003e elements and includes a \u003ccode\u003eskipped\u003c/code\u003e attribute on the root \u003ccode\u003e\u0026lt;testsuites\u0026gt;\u003c/code\u003e element.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e[\u003ccode\u003eflake8-import-conventions\u003c/code\u003e] Add \u003ccode\u003edatetime as dt\u003c/code\u003e as a conventional alias (\u003ccode\u003eICN001\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28790\"\u003e#28790\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSupport Unicode dummy variable names (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28722\"\u003e#28722\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eThe default \u003ca href=\"https://docs.astral.sh/ruff/settings/#lint_dummy-variable-rgx\"\u003e\u003ccode\u003elint.dummy-variable-rgx\u003c/code\u003e\u003c/a\u003e now recognizes underscore-prefixed Unicode names, such as \u003ccode\u003e_次\u003c/code\u003e, as dummy variables.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate to Unicode 17 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/21229\"\u003e#21229\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28784\"\u003e#28784\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eRuff now uses Unicode 17 data for identifier normalization and named character escapes (\u003ccode\u003e\u0026quot;\\N{...}\u0026quot;\u003c/code\u003e).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAlways show unsafe and display-only fixes in the CLI (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/27810\"\u003e#27810\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eThe default \u003ccode\u003efull\u003c/code\u003e output format now shows unsafe fixes and suggestions requiring manual review, regardless of the \u003ca href=\"https://docs.astral.sh/ruff/settings/#unsafe-fixes\"\u003e\u003ccode\u003eunsafe-fixes\u003c/code\u003e\u003c/a\u003e setting. Actually applying unsafe fixes still requires explicit opt-in.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRemove the Python dependency from conda-forge builds (\u003ca href=\"https://redirect.github.com/conda-forge/ruff-feedstock/pull/361\"\u003econda-forge/ruff-feedstock#361\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eThe conda-forge build no longer depends on Python, now supports linux-riscv64, win-arm64, and linux-ppc64le platforms, and now includes shell completions. However, no longer depending on Python means that \u003ccode\u003epython -m ruff\u003c/code\u003e and \u003ccode\u003eimport ruff\u003c/code\u003e will no longer work. Use \u003ccode\u003eruff\u003c/code\u003e directly from \u003ccode\u003ePATH\u003c/code\u003e instead. PyPI installations and those from the standalone installer are unaffected.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRemove support for ruff-lsp (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28750\"\u003e#28750\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eSupport for \u003ccode\u003eruff-lsp\u003c/code\u003e, the legacy Python language server \u003ca href=\"https://github.com/astral-sh/ruff/releases/tag/0.9.5\"\u003edeprecated in Ruff v0.9.5\u003c/a\u003e, has been removed. The Ruff VS Code extension now always uses the native language server; \u003ccode\u003eruff.nativeServer\u003c/code\u003e is deprecated and ignored. See the \u003ca href=\"https://docs.astral.sh/ruff/editors/migration/\"\u003emigration guide\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eStabilization\u003c/h3\u003e\n\u003cp\u003eThe following rules have been stabilized and are no longer in preview:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://docs.astral.sh/ruff/rules/lazy-import-mismatch\"\u003e\u003ccode\u003elazy-import-mismatch\u003c/code\u003e\u003c/a\u003e (\u003ccode\u003eTID254\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://docs.astral.sh/ruff/rules/lazy-import-immediately-resolved\"\u003e\u003ccode\u003elazy-import-immediately-resolved\u003c/code\u003e\u003c/a\u003e (\u003ccode\u003eTID255\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://docs.astral.sh/ruff/rules/os-path-commonprefix\"\u003e\u003ccode\u003eos-path-commonprefix\u003c/code\u003e\u003c/a\u003e (\u003ccode\u003eRUF071\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md\"\u003eruff's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e0.17.0\u003c/h2\u003e\n\u003cp\u003eReleased on 2026-10-09.\u003c/p\u003e\n\u003cp\u003eThe executables in our macOS and Windows release archives and \u003ccode\u003eruff\u003c/code\u003e wheels are now code-signed.\nmacOS executables are signed with an Apple Developer ID certificate and notarized by Apple. Windows\nexecutables have timestamped Authenticode signatures from Azure Artifact Signing. This enables\nverification of the release publisher and binary integrity, supports publisher-based allowlisting,\nand should reduce security warnings and antivirus false positives.\u003c/p\u003e\n\u003ch3\u003eBreaking changes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate the default and latest Python versions for 3.15 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28792\"\u003e#28792\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eRuff now defaults to Python 3.11 instead of 3.10 when no Python version is configured through\n\u003ca href=\"https://docs.astral.sh/ruff/settings/#target-version\"\u003e\u003ccode\u003etarget-version\u003c/code\u003e\u003c/a\u003e or\n\u003ca href=\"https://docs.astral.sh/ruff/configuration/#inferring-the-python-version\"\u003e\u003ccode\u003erequires-python\u003c/code\u003e\u003c/a\u003e. When\nchecking for syntax errors without a configured Python version, Ruff now defaults to Python 3.15\ninstead of 3.14.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate the default rule set (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28786\"\u003e#28786\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eSeveral of the \u003ccode\u003eflake8-datetimez\u003c/code\u003e rules\n(\u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-without-tzinfo/\"\u003e\u003ccode\u003eDTZ001\u003c/code\u003e\u003c/a\u003e,\n\u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-now-without-tzinfo/\"\u003e\u003ccode\u003eDTZ005\u003c/code\u003e\u003c/a\u003e,\n\u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-fromtimestamp/\"\u003e\u003ccode\u003eDTZ006\u003c/code\u003e\u003c/a\u003e,\n\u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-strptime-without-zone/\"\u003e\u003ccode\u003eDTZ007\u003c/code\u003e\u003c/a\u003e,\n\u003ca href=\"https://docs.astral.sh/ruff/rules/call-date-today/\"\u003e\u003ccode\u003eDTZ011\u003c/code\u003e\u003c/a\u003e,\n\u003ca href=\"https://docs.astral.sh/ruff/rules/call-date-fromtimestamp/\"\u003e\u003ccode\u003eDTZ012\u003c/code\u003e\u003c/a\u003e, and\n\u003ca href=\"https://docs.astral.sh/ruff/rules/datetime-min-max/\"\u003e\u003ccode\u003eDTZ901\u003c/code\u003e\u003c/a\u003e) are no longer enabled by default,\nwhile \u003ca href=\"https://docs.astral.sh/ruff/rules/undefined-local-with-nested-import-star-usage/\"\u003e\u003ccode\u003eundefined-local-with-nested-import-star-usage\u003c/code\u003e\u003c/a\u003e\n(\u003ccode\u003eF406\u003c/code\u003e), which corresponds to a syntax error, is now enabled by default.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate Rust crate quick-junit to 0.8.0 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/27295\"\u003e#27295\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eJUnit output now uses a \u003ccode\u003eskipped\u003c/code\u003e attribute instead of \u003ccode\u003edisabled\u003c/code\u003e on \u003ccode\u003e\u0026lt;testsuite\u0026gt;\u003c/code\u003e elements and\nincludes a \u003ccode\u003eskipped\u003c/code\u003e attribute on the root \u003ccode\u003e\u0026lt;testsuites\u0026gt;\u003c/code\u003e element.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e[\u003ccode\u003eflake8-import-conventions\u003c/code\u003e] Add \u003ccode\u003edatetime as dt\u003c/code\u003e as a conventional alias (\u003ccode\u003eICN001\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28790\"\u003e#28790\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSupport Unicode dummy variable names (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28722\"\u003e#28722\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eThe default \u003ca href=\"https://docs.astral.sh/ruff/settings/#lint_dummy-variable-rgx\"\u003e\u003ccode\u003elint.dummy-variable-rgx\u003c/code\u003e\u003c/a\u003e\nnow recognizes underscore-prefixed Unicode names, such as \u003ccode\u003e_次\u003c/code\u003e, as dummy variables.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate to Unicode 17 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/21229\"\u003e#21229\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28784\"\u003e#28784\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eRuff now uses Unicode 17 data for identifier normalization and named character escapes (\u003ccode\u003e\u0026quot;\\N{...}\u0026quot;\u003c/code\u003e).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAlways show unsafe and display-only fixes in the CLI (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/27810\"\u003e#27810\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/5b27c1ccfaa230fb195855f5cf3404a21e3379cd\"\u003e\u003ccode\u003e5b27c1c\u003c/code\u003e\u003c/a\u003e Bump version to 0.17.0 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/29259\"\u003e#29259\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/8f362bf4cb5dbad095ac416602496705d41fc843\"\u003e\u003ccode\u003e8f362bf\u003c/code\u003e\u003c/a\u003e Integrate vendored Unicode names into Ruff\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/88a50d695c1142294bb4c780fad47d3306173885\"\u003e\u003ccode\u003e88a50d6\u003c/code\u003e\u003c/a\u003e Revert upstream Unicode loose matching\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/276832aa91f2086a6ec880884fcdd987991cddf2\"\u003e\u003ccode\u003e276832a\u003c/code\u003e\u003c/a\u003e Revert upstream Unicode alias normalization\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/26911caa2800758779965510d2f222b438abbb38\"\u003e\u003ccode\u003e26911ca\u003c/code\u003e\u003c/a\u003e Vendor unicode_names2 from upstream\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/27e3797508d1a7ad69e4900d51e38d78785aaf73\"\u003e\u003ccode\u003e27e3797\u003c/code\u003e\u003c/a\u003e [\u003ccode\u003eruff\u003c/code\u003e] Stabilize \u003ccode\u003eos-path-commonprefix\u003c/code\u003e (\u003ccode\u003eRUF071\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/28764\"\u003e#28764\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/bbb52c1267cf39aba67e54c2b5800878d23073a9\"\u003e\u003ccode\u003ebbb52c1\u003c/code\u003e\u003c/a\u003e [\u003ccode\u003eflake8-tidy-imports\u003c/code\u003e] Stabilize \u003ccode\u003elazy-import-immediately-resolved\u003c/code\u003e (`TID255...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/5aa9cbd3a49d32b24ac21fa7797ca87a330792a2\"\u003e\u003ccode\u003e5aa9cbd\u003c/code\u003e\u003c/a\u003e [\u003ccode\u003eflake8-tidy-imports\u003c/code\u003e] Stabilize \u003ccode\u003elazy-import-mismatch\u003c/code\u003e (\u003ccode\u003eTID254\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/28760\"\u003e#28760\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/dba1bc893aedfeea2064c4e8e764135f0d44dc3f\"\u003e\u003ccode\u003edba1bc8\u003c/code\u003e\u003c/a\u003e [\u003ccode\u003eflake8-import-conventions\u003c/code\u003e] Add \u003ccode\u003edatetime as dt\u003c/code\u003e as a conventional alias (`...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/ef23c9c39eb3029bab0139c3ea7ae6d95c4131e0\"\u003e\u003ccode\u003eef23c9c\u003c/code\u003e\u003c/a\u003e Update default and latest Python versions for 3.15 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/28792\"\u003e#28792\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/astral-sh/ruff/compare/0.16.6...0.17.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `werkzeug[watchdog]` from 3.1.8 to 3.1.9\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pallets/werkzeug/releases\"\u003ewerkzeug[watchdog]'s releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e3.1.9\u003c/h2\u003e\n\u003cp\u003eThis is the Werkzeug 3.1.9 security fix release, which fixes security issues and bugs but does not otherwise change behavior and should not result in breaking changes compared to the latest feature release.\u003c/p\u003e\n\u003cp\u003ePyPI: \u003ca href=\"https://pypi.org/project/Werkzeug/3.1.9/\"\u003ehttps://pypi.org/project/Werkzeug/3.1.9/\u003c/a\u003e\nChanges: \u003ca href=\"https://werkzeug.palletsprojects.com/page/changes/#version-3-1-9\"\u003ehttps://werkzeug.palletsprojects.com/page/changes/#version-3-1-9\u003c/a\u003e\nMilestone: \u003ca href=\"https://github.com/pallets/werkzeug/milestone/46?closed=1\"\u003ehttps://github.com/pallets/werkzeug/milestone/46?closed=1\u003c/a\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003esafe_join\u003c/code\u003e on Windows does not allow special devices names with empty ADS markers on NTFS. \u003ca href=\"https://github.com/pallets/werkzeug/security/advisories/GHSA-g6x2-hccm-hh4m\"\u003ehttps://github.com/pallets/werkzeug/security/advisories/GHSA-g6x2-hccm-hh4m\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eProfilerMiddleware\u003c/code\u003e uses \u003ccode\u003eprofiling.tracing\u003c/code\u003e on Python 3.15. \u003ca href=\"https://redirect.github.com/pallets/werkzeug/issues/3207\"\u003e#3207\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003euri_to_iri\u003c/code\u003e and \u003ccode\u003eiri_to_uri\u003c/code\u003e preserve empty username, password, and port 0. \u003ca href=\"https://redirect.github.com/pallets/werkzeug/issues/3189\"\u003e#3189\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eImprove performance of \u003ccode\u003eparse_options_header\u003c/code\u003e. \u003ca href=\"https://redirect.github.com/pallets/werkzeug/issues/3231\"\u003e#3231\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eImprove performance of \u003ccode\u003eparse_etags\u003c/code\u003e. \u003ca href=\"https://redirect.github.com/pallets/werkzeug/issues/3231\"\u003e#3231\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eImprove performance of \u003ccode\u003eparse_cookie\u003c/code\u003e. \u003ca href=\"https://redirect.github.com/pallets/werkzeug/issues/3231\"\u003e#3231\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eget_host\u003c/code\u003e also checks that the port is in the valid range. \u003ca href=\"https://redirect.github.com/pallets/werkzeug/issues/3236\"\u003e#3236\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eThe \u003ccode\u003eint\u003c/code\u003e URL converter returns a 404 instead of 500 error when the value is longer than \u003ccode\u003esys.get_int_max_str_digits()\u003c/code\u003e. \u003ca href=\"https://redirect.github.com/pallets/werkzeug/issues/3237\"\u003e#3237\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eImprove debugger PIN generation from cgroup data inside Podman. \u003ca href=\"https://redirect.github.com/pallets/werkzeug/issues/3245\"\u003e#3245\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eAuthorization\u003c/code\u003e parsing \u003ccode\u003ebasic\u003c/code\u003e auth disallows non-base64 characters.  \u003ca href=\"https://redirect.github.com/pallets/werkzeug/issues/3248\"\u003e#3248\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eapplication/x-www-form-urlencoded\u003c/code\u003e form data is no longer limited to \u003ccode\u003emax_form_memory_size\u003c/code\u003e...\n\n_Description has been truncated_","html_url":"https://github.com/christ-ph/projetFinal/pull/17","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/christ-ph%2FprojetFinal/issues/17","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/17/packages"},{"uuid":"5825908296","node_id":"PR_kwDOAMpNN88AAAABIHUhyw","number":14049,"state":"open","title":"Bump virtualenv from 21.14.5 to 21.14.6","user":"dependabot[bot]","labels":["dependencies"],"assignees":[],"locked":false,"comments_count":2,"pull_request":true,"closed_at":null,"author_association":null,"state_reason":null,"created_at":"2026-10-13T06:51:29.000Z","updated_at":"2026-10-13T08:34:24.000Z","time_to_close":null,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"Bump","packages":[{"name":"virtualenv","old_version":"21.14.5","new_version":"21.14.6","repository_url":"https://github.com/pypa/virtualenv"}],"path":null,"ecosystem":"pip"},"body":"Bumps [virtualenv](https://github.com/pypa/virtualenv) from 21.14.5 to 21.14.6.\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pypa/virtualenv/releases\"\u003evirtualenv's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e21.14.6\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e👷 ci: pin ubuntu-26.04, clear warnings, bump deps by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3378\"\u003epypa/virtualenv#3378\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(ci): defer upgrades blocked by release age by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3379\"\u003epypa/virtualenv#3379\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eci: overlap release transfers and verification by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3382\"\u003epypa/virtualenv#3382\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(seed): guard every embed update log read, not just one by \u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3383\"\u003epypa/virtualenv#3383\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.14.5...21.14.6\"\u003ehttps://github.com/pypa/virtualenv/compare/21.14.5...21.14.6\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pypa/virtualenv/blob/main/docs/changelog.rst\"\u003evirtualenv's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003eBugfixes - 21.14.6\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eFall back to the bundled seed wheel with periodic update on (the default) when the embed update log holds JSON of the\nwrong shape, instead of downloading the wheel or, offline, failing to create the environment - by :user:\u003ccode\u003edarrenhuai\u003c/code\u003e.\n(:issue:\u003ccode\u003e3383\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003ev21.14.5 (2026-10-02)\u003c/p\u003e\n\u003chr /\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/9e69ac725fd4dc83726536c084ab9ca4f099c5b6\"\u003e\u003ccode\u003e9e69ac7\u003c/code\u003e\u003c/a\u003e release 21.14.6\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/464c34b696c81190cd1ad6589158f6ce59467351\"\u003e\u003ccode\u003e464c34b\u003c/code\u003e\u003c/a\u003e 🐛 fix(seed): guard every embed update log read, not just one (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3383\"\u003e#3383\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/3f56d7f4b88884296249b83889d717c41ed6e668\"\u003e\u003ccode\u003e3f56d7f\u003c/code\u003e\u003c/a\u003e ci: overlap release transfers and verification (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3382\"\u003e#3382\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/7577efd46b0e62c5edbd803ded2788eb6d48f5ca\"\u003e\u003ccode\u003e7577efd\u003c/code\u003e\u003c/a\u003e chore(deps): bump the runtime-dependencies group with 10 updates (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3381\"\u003e#3381\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/f6d172367b48d5138fcab911ff8fdd86b4e8cdaf\"\u003e\u003ccode\u003ef6d1723\u003c/code\u003e\u003c/a\u003e [pre-commit.ci] pre-commit autoupdate (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3380\"\u003e#3380\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/7c56749d7b3065f6a99b21fd61089ba692e4aaec\"\u003e\u003ccode\u003e7c56749\u003c/code\u003e\u003c/a\u003e fix(ci): defer upgrades blocked by release age (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3379\"\u003e#3379\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/95d02526dc5f2c569767d8ee572f72f571b8a6ce\"\u003e\u003ccode\u003e95d0252\u003c/code\u003e\u003c/a\u003e 👷 ci: pin ubuntu-26.04, clear warnings, bump deps (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3378\"\u003e#3378\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.14.5...21.14.6\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=virtualenv\u0026package-manager=pip\u0026previous-version=21.14.5\u0026new-version=21.14.6)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n\n\n\u003c/details\u003e","html_url":"https://github.com/aio-libs/aiohttp/pull/14049","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/aio-libs%2Faiohttp/issues/14049","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/14049/packages"},{"uuid":"5823283779","node_id":"PR_kwDOQG1kCc8AAAABIFQNhA","number":87,"state":"closed","title":"deps(deps): bump the python-minor-patch group with 9 updates","user":"dependabot[bot]","labels":[],"assignees":["ay-mich"],"locked":false,"comments_count":1,"pull_request":true,"closed_at":"2026-10-13T02:07:32.000Z","author_association":null,"state_reason":null,"created_at":"2026-10-13T02:07:18.000Z","updated_at":"2026-10-13T02:07:42.000Z","time_to_close":14,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"deps(deps): bump","group_name":"python-minor-patch","update_count":9,"packages":[{"name":"pydantic","old_version":"2.13.5","new_version":"2.14.0","repository_url":"https://github.com/pydantic/pydantic"},{"name":"ruff","old_version":"0.16.10","new_version":"0.17.0","repository_url":"https://github.com/astral-sh/ruff"},{"name":"filelock","old_version":"4.0.9","new_version":"4.1.0","repository_url":"https://github.com/tox-dev/py-filelock"},{"name":"iniconfig","old_version":"2.3.0","new_version":"2.3.1","repository_url":"https://github.com/pytest-dev/iniconfig"},{"name":"markupsafe","old_version":"3.0.3","new_version":"3.0.4","repository_url":"https://github.com/pallets/markupsafe"},{"name":"platformdirs","old_version":"4.12.2","new_version":"4.12.4","repository_url":"https://github.com/tox-dev/platformdirs"},{"name":"pycparser","old_version":"3.0","new_version":"3.11","repository_url":"https://github.com/eliben/pycparser"},{"name":"pydantic-core","old_version":"2.49.0","new_version":"2.50.0","repository_url":"https://github.com/pydantic/pydantic"},{"name":"virtualenv","old_version":"21.14.3","new_version":"21.14.6","repository_url":"https://github.com/pypa/virtualenv"}],"path":null,"ecosystem":"pip"},"body":"Bumps the python-minor-patch group with 9 updates:\n\n| Package | From | To |\n| --- | --- | --- |\n| [pydantic](https://github.com/pydantic/pydantic) | `2.13.5` | `2.14.0` |\n| [ruff](https://github.com/astral-sh/ruff) | `0.16.10` | `0.17.0` |\n| [filelock](https://github.com/tox-dev/py-filelock) | `4.0.9` | `4.1.0` |\n| [iniconfig](https://github.com/pytest-dev/iniconfig) | `2.3.0` | `2.3.1` |\n| [markupsafe](https://github.com/pallets/markupsafe) | `3.0.3` | `3.0.4` |\n| [platformdirs](https://github.com/tox-dev/platformdirs) | `4.12.2` | `4.12.4` |\n| [pycparser](https://github.com/eliben/pycparser) | `3.0` | `3.11` |\n| [pydantic-core](https://github.com/pydantic/pydantic) | `2.49.0` | `2.50.0` |\n| [virtualenv](https://github.com/pypa/virtualenv) | `21.14.3` | `21.14.6` |\n\nUpdates `pydantic` from 2.13.5 to 2.14.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pydantic/pydantic/releases\"\u003epydantic's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev2.14.0 2026-10-08\u003c/h2\u003e\n\u003ch3\u003eWhat's Changed\u003c/h3\u003e\n\u003cp\u003eThe highlights of the v2.14 release are available in the \u003ca href=\"https://pydantic.dev/articles/pydantic-v2-14-release\"\u003eblog post\u003c/a\u003e.\nSeveral minor changes (considered non-breaking changes according to our \u003ca href=\"https://pydantic.dev/docs/validation/2.14/get-started/version-policy/#pydantic-v2\"\u003eversioning policy\u003c/a\u003e) are also included in this release. Make sure to look into them before upgrading.\u003c/p\u003e\n\u003cp\u003eThis release drops support for Python 3.9 and adds support for Python 3.15.\u003c/p\u003e\n\u003ch4\u003eNew Features\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eAdd support for \u003ccode\u003emultiple_of\u003c/code\u003e constraint in \u003ccode\u003efraction\u003c/code\u003e and \u003ccode\u003etimedelta\u003c/code\u003e core schemas by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13873\"\u003e#13873\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003e__namespace__\u003c/code\u003e parameter to \u003ccode\u003ecreate_model()\u003c/code\u003e by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13895\"\u003e#13895\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4\u003eChanges\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eAdd an \u003ccode\u003eordered-dict\u003c/code\u003e core schema by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13796\"\u003e#13796\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdd a \u003ccode\u003ecounter\u003c/code\u003e core schema by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13824\"\u003e#13824\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eDo not mutate \u003ccode\u003emodel_config\u003c/code\u003e attribute by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13825\"\u003e#13825\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eReject newlines in \u003ccode\u003eNameEmail\u003c/code\u003e validation by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13897\"\u003e#13897\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4\u003eFixes\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eCall enum constructors in both validation modes by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13792\"\u003e#13792\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix documentation examples not raising and remove unused \u003ccode\u003estring_sub_type\u003c/code\u003e unused error code by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13821\"\u003e#13821\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eCatch \u003ccode\u003eOverflowError\u003c/code\u003e during \u003ccode\u003eByteSize\u003c/code\u003e validation by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13850\"\u003e#13850\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRequire \u003ccode\u003emultiple_of\u003c/code\u003e constraints to be positive by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13862\"\u003e#13862\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAlways pop field name and model type stacks during schema generation by \u003ca href=\"https://github.com/saquibjawedbit\"\u003e\u003ccode\u003e@​saquibjawedbit\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13859\"\u003e#13859\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eHandle \u003ccode\u003eTypeError\u003c/code\u003e gracefully during docstring extraction by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13874\"\u003e#13874\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix config propagation of stdlib dataclasses and \u003ccode\u003eTypedDict\u003c/code\u003es in JSON Schema by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13891\"\u003e#13891\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eDon't apply \u003ccode\u003eser_json_timedelta\u003c/code\u003e to all datetime types in serialization inference by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13892\"\u003e#13892\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eEncode JSON Schema defaults with a consistent configuration by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13893\"\u003e#13893\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ePropagate \u003ccode\u003einit\u003c/code\u003e and \u003ccode\u003ekw_only=False\u003c/code\u003e from \u003ccode\u003eField()\u003c/code\u003e to stdlib dataclass fields by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13898\"\u003e#13898\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRespect propagated extra config in the JSON Schema of stdlib dataclasses by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13899\"\u003e#13899\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eHandle OS errors during \u003ccode\u003eZoneInfo\u003c/code\u003e validation by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13912\"\u003e#13912\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eHandle exceptions during \u003ccode\u003eDecimal\u003c/code\u003e validation by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13940\"\u003e#13940\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRebuild incomplete types during serialization inference by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13922\"\u003e#13922\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eReject large exponents in \u003ccode\u003eFraction\u003c/code\u003e validation by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13944\"\u003e#13944\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAvoid validating URL prefix multiple times in multi host URLs by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13945\"\u003e#13945\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pydantic/pydantic/compare/v2.13.0...v2.14.0\"\u003ehttps://github.com/pydantic/pydantic/compare/v2.13.0...v2.14.0\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003ev2.14.0b2 2026-09-09\u003c/h2\u003e\n\u003ch3\u003eWhat's Changed\u003c/h3\u003e\n\u003cp\u003eThis pre-release adds full support for Python 3.15 specific features, such as support for \u003ca href=\"https://docs.python.org/3.15/library/stdtypes.html#frozendict\"\u003e\u003ccode\u003efrozendict\u003c/code\u003e\u003c/a\u003e, making use of \u003ca href=\"https://docs.python.org/3.15/library/typing.html#typing.TypeForm\"\u003e\u003ccode\u003eTypeForm\u003c/code\u003e\u003c/a\u003e and stabilizing the \u003ca href=\"https://pydantic.dev/docs/validation/latest/concepts/types/#missing-sentinel\"\u003e\u003ccode\u003eMISSING\u003c/code\u003e sentinel\u003c/a\u003e type.\u003c/p\u003e\n\u003ch4\u003eNew Features\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eAllow any \u003ccode\u003eCoreSchema\u003c/code\u003e to be used as serialization by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13680\"\u003e#13680\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdd support for \u003ca href=\"https://docs.python.org/3.15/library/stdtypes.html#frozendict\"\u003e\u003ccode\u003efrozendict\u003c/code\u003e\u003c/a\u003e type by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13634\"\u003e#13634\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pydantic/pydantic/blob/main/HISTORY.md\"\u003epydantic's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev2.14.0 (2026-10-08)\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/pydantic/pydantic/releases/tag/v2.14.0\"\u003eGitHub release\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eWhat's Changed\u003c/h3\u003e\n\u003cp\u003eThe highlights of the v2.14 release are available in the \u003ca href=\"https://pydantic.dev/articles/pydantic-v2-14-release\"\u003eblog post\u003c/a\u003e.\nSeveral minor changes (considered non-breaking changes according to our \u003ca href=\"https://pydantic.dev/docs/validation/2.14/get-started/version-policy/#pydantic-v2\"\u003eversioning policy\u003c/a\u003e)\nare also included in this release. Make sure to look into them before upgrading.\u003c/p\u003e\n\u003cp\u003eThis release drops support for Python 3.9 and adds support for Python 3.15.\u003c/p\u003e\n\u003ch4\u003eNew Features\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eAdd support for \u003ccode\u003emultiple_of\u003c/code\u003e constraint in \u003ccode\u003efraction\u003c/code\u003e and \u003ccode\u003etimedelta\u003c/code\u003e core schemas by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13873\"\u003e#13873\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003e__namespace__\u003c/code\u003e parameter to \u003ccode\u003ecreate_model()\u003c/code\u003e by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13895\"\u003e#13895\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4\u003eChanges\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eAdd an \u003ccode\u003eordered-dict\u003c/code\u003e core schema by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13796\"\u003e#13796\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdd a \u003ccode\u003ecounter\u003c/code\u003e core schema by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13824\"\u003e#13824\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eDo not mutate \u003ccode\u003emodel_config\u003c/code\u003e attribute by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13825\"\u003e#13825\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eReject newlines in \u003ccode\u003eNameEmail\u003c/code\u003e validation by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13897\"\u003e#13897\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4\u003eFixes\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eCall enum constructors in both validation modes by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13792\"\u003e#13792\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix documentation examples not raising and remove unused \u003ccode\u003estring_sub_type\u003c/code\u003e unused error code by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13821\"\u003e#13821\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eCatch \u003ccode\u003eOverflowError\u003c/code\u003e during \u003ccode\u003eByteSize\u003c/code\u003e validation by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13850\"\u003e#13850\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRequire \u003ccode\u003emultiple_of\u003c/code\u003e constraints to be positive by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13862\"\u003e#13862\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAlways pop field name and model type stacks during schema generation by \u003ca href=\"https://github.com/saquibjawedbit\"\u003e\u003ccode\u003e@​saquibjawedbit\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13859\"\u003e#13859\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eHandle \u003ccode\u003eTypeError\u003c/code\u003e gracefully during docstring extraction by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13874\"\u003e#13874\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix config propagation of stdlib dataclasses and \u003ccode\u003eTypedDict\u003c/code\u003es in JSON Schema by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13891\"\u003e#13891\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eDon't apply \u003ccode\u003eser_json_timedelta\u003c/code\u003e to all datetime types in serialization inference by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13892\"\u003e#13892\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eEncode JSON Schema defaults with a consistent configuration by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13893\"\u003e#13893\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ePropagate \u003ccode\u003einit\u003c/code\u003e and \u003ccode\u003ekw_only=False\u003c/code\u003e from \u003ccode\u003eField()\u003c/code\u003e to stdlib dataclass fields by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13898\"\u003e#13898\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRespect propagated extra config in the JSON Schema of stdlib dataclasses by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13899\"\u003e#13899\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eHandle OS errors during \u003ccode\u003eZoneInfo\u003c/code\u003e validation by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13912\"\u003e#13912\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eHandle exceptions during \u003ccode\u003eDecimal\u003c/code\u003e validation by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13940\"\u003e#13940\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRebuild incomplete types during serialization inference by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13922\"\u003e#13922\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eReject large exponents in \u003ccode\u003eFraction\u003c/code\u003e validation by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13944\"\u003e#13944\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAvoid validating URL prefix multiple times in multi host URLs by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13945\"\u003e#13945\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eNew Contributors\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/saquibjawedbit\"\u003e\u003ccode\u003e@​saquibjawedbit\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13859\"\u003e#13859\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev2.14.0b2 (2026-09-09)\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/pydantic/pydantic/releases/tag/v2.14.0b2\"\u003eGitHub release\u003c/a\u003e\u003c/p\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pydantic/pydantic/commit/fcdefa7198c4fc94a22eecf1a5b7926e20b9fc8a\"\u003e\u003ccode\u003efcdefa7\u003c/code\u003e\u003c/a\u003e Correct v2.14.0 release date (\u003ca href=\"https://redirect.github.com/pydantic/pydantic/issues/13952\"\u003e#13952\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pydantic/pydantic/commit/c821eaccf9873357477a1e7d2d4d12dd4e161c8a\"\u003e\u003ccode\u003ec821eac\u003c/code\u003e\u003c/a\u003e Revert \u0026quot;Respect config in \u003ccode\u003eTypeAdapter.json_schemas()\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/pydantic/pydantic/issues/13890\"\u003e#13890\u003c/a\u003e)\u0026quot; (\u003ca href=\"https://redirect.github.com/pydantic/pydantic/issues/13951\"\u003e#13951\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pydantic/pydantic/commit/a656b75d58a80f5033f376f7af17092606bbfde2\"\u003e\u003ccode\u003ea656b75\u003c/code\u003e\u003c/a\u003e Prepare release v2.14.0 (\u003ca href=\"https://redirect.github.com/pydantic/pydantic/issues/13948\"\u003e#13948\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pydantic/pydantic/commit/b4028f9d87e34750e53be0ba011d70f3c0fcc94e\"\u003e\u003ccode\u003eb4028f9\u003c/code\u003e\u003c/a\u003e Avoid validating URL prefix multiple times in multi host URLs (\u003ca href=\"https://redirect.github.com/pydantic/pydantic/issues/13945\"\u003e#13945\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pydantic/pydantic/commit/69ed168e9ad465eef4c8d81efb152a93b604daf5\"\u003e\u003ccode\u003e69ed168\u003c/code\u003e\u003c/a\u003e Reject large exponents in \u003ccode\u003eFraction\u003c/code\u003e validation (\u003ca href=\"https://redirect.github.com/pydantic/pydantic/issues/13944\"\u003e#13944\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pydantic/pydantic/commit/895c0c285c5cb4c0c7c7a4619a80941c12f2c75f\"\u003e\u003ccode\u003e895c0c2\u003c/code\u003e\u003c/a\u003e Fix datetime parsing in custom validator examples (\u003ca href=\"https://redirect.github.com/pydantic/pydantic/issues/13931\"\u003e#13931\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pydantic/pydantic/commit/d2cbaaab74ba4a26bb66f604199ec9793aab6177\"\u003e\u003ccode\u003ed2cbaaa\u003c/code\u003e\u003c/a\u003e Bump virtualenv from 20.36.1 to 21.7.13 (\u003ca href=\"https://redirect.github.com/pydantic/pydantic/issues/13943\"\u003e#13943\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pydantic/pydantic/commit/3fbc25ab2bd4f370f478102652f20aea1f5de0b0\"\u003e\u003ccode\u003e3fbc25a\u003c/code\u003e\u003c/a\u003e Bump \u003ccode\u003epydantic-core\u003c/code\u003e dependencies (\u003ca href=\"https://redirect.github.com/pydantic/pydantic/issues/13942\"\u003e#13942\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pydantic/pydantic/commit/027b5c714791d5f6e86faea4110ef26f4776648c\"\u003e\u003ccode\u003e027b5c7\u003c/code\u003e\u003c/a\u003e Rebuild incomplete types during serialization inference (\u003ca href=\"https://redirect.github.com/pydantic/pydantic/issues/13922\"\u003e#13922\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pydantic/pydantic/commit/2706d1f6cdd0ca5b941fd5170ecf0254f933e1f6\"\u003e\u003ccode\u003e2706d1f\u003c/code\u003e\u003c/a\u003e Handle exceptions during \u003ccode\u003eDecimal\u003c/code\u003e validation (\u003ca href=\"https://redirect.github.com/pydantic/pydantic/issues/13940\"\u003e#13940\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/pydantic/pydantic/compare/v2.13.5...v2.14.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `ruff` from 0.16.10 to 0.17.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/astral-sh/ruff/releases\"\u003eruff's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e0.17.0\u003c/h2\u003e\n\u003ch2\u003eRelease Notes\u003c/h2\u003e\n\u003cp\u003eReleased on 2026-10-09.\u003c/p\u003e\n\u003cp\u003eThe executables in our macOS and Windows release archives and \u003ccode\u003eruff\u003c/code\u003e wheels are now code-signed. macOS executables are signed with an Apple Developer ID certificate and notarized by Apple. Windows executables have timestamped Authenticode signatures from Azure Artifact Signing. This enables verification of the release publisher and binary integrity, supports publisher-based allowlisting, and should reduce security warnings and antivirus false positives.\u003c/p\u003e\n\u003ch3\u003eBreaking changes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate the default and latest Python versions for 3.15 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28792\"\u003e#28792\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eRuff now defaults to Python 3.11 instead of 3.10 when no Python version is configured through \u003ca href=\"https://docs.astral.sh/ruff/settings/#target-version\"\u003e\u003ccode\u003etarget-version\u003c/code\u003e\u003c/a\u003e or \u003ca href=\"https://docs.astral.sh/ruff/configuration/#inferring-the-python-version\"\u003e\u003ccode\u003erequires-python\u003c/code\u003e\u003c/a\u003e. When checking for syntax errors without a configured Python version, Ruff now defaults to Python 3.15 instead of 3.14.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate the default rule set (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28786\"\u003e#28786\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eSeveral of the \u003ccode\u003eflake8-datetimez\u003c/code\u003e rules (\u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-without-tzinfo/\"\u003e\u003ccode\u003eDTZ001\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-now-without-tzinfo/\"\u003e\u003ccode\u003eDTZ005\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-fromtimestamp/\"\u003e\u003ccode\u003eDTZ006\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-strptime-without-zone/\"\u003e\u003ccode\u003eDTZ007\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://docs.astral.sh/ruff/rules/call-date-today/\"\u003e\u003ccode\u003eDTZ011\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://docs.astral.sh/ruff/rules/call-date-fromtimestamp/\"\u003e\u003ccode\u003eDTZ012\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://docs.astral.sh/ruff/rules/datetime-min-max/\"\u003e\u003ccode\u003eDTZ901\u003c/code\u003e\u003c/a\u003e) are no longer enabled by default, while \u003ca href=\"https://docs.astral.sh/ruff/rules/undefined-local-with-nested-import-star-usage/\"\u003e\u003ccode\u003eundefined-local-with-nested-import-star-usage\u003c/code\u003e\u003c/a\u003e (\u003ccode\u003eF406\u003c/code\u003e), which corresponds to a syntax error, is now enabled by default.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate Rust crate quick-junit to 0.8.0 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/27295\"\u003e#27295\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eJUnit output now uses a \u003ccode\u003eskipped\u003c/code\u003e attribute instead of \u003ccode\u003edisabled\u003c/code\u003e on \u003ccode\u003e\u0026lt;testsuite\u0026gt;\u003c/code\u003e elements and includes a \u003ccode\u003eskipped\u003c/code\u003e attribute on the root \u003ccode\u003e\u0026lt;testsuites\u0026gt;\u003c/code\u003e element.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e[\u003ccode\u003eflake8-import-conventions\u003c/code\u003e] Add \u003ccode\u003edatetime as dt\u003c/code\u003e as a conventional alias (\u003ccode\u003eICN001\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28790\"\u003e#28790\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSupport Unicode dummy variable names (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28722\"\u003e#28722\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eThe default \u003ca href=\"https://docs.astral.sh/ruff/settings/#lint_dummy-variable-rgx\"\u003e\u003ccode\u003elint.dummy-variable-rgx\u003c/code\u003e\u003c/a\u003e now recognizes underscore-prefixed Unicode names, such as \u003ccode\u003e_次\u003c/code\u003e, as dummy variables.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate to Unicode 17 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/21229\"\u003e#21229\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28784\"\u003e#28784\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eRuff now uses Unicode 17 data for identifier normalization and named character escapes (\u003ccode\u003e\u0026quot;\\N{...}\u0026quot;\u003c/code\u003e).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAlways show unsafe and display-only fixes in the CLI (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/27810\"\u003e#27810\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eThe default \u003ccode\u003efull\u003c/code\u003e output format now shows unsafe fixes and suggestions requiring manual review, regardless of the \u003ca href=\"https://docs.astral.sh/ruff/settings/#unsafe-fixes\"\u003e\u003ccode\u003eunsafe-fixes\u003c/code\u003e\u003c/a\u003e setting. Actually applying unsafe fixes still requires explicit opt-in.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRemove the Python dependency from conda-forge builds (\u003ca href=\"https://redirect.github.com/conda-forge/ruff-feedstock/pull/361\"\u003econda-forge/ruff-feedstock#361\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eThe conda-forge build no longer depends on Python, now supports linux-riscv64, win-arm64, and linux-ppc64le platforms, and now includes shell completions. However, no longer depending on Python means that \u003ccode\u003epython -m ruff\u003c/code\u003e and \u003ccode\u003eimport ruff\u003c/code\u003e will no longer work. Use \u003ccode\u003eruff\u003c/code\u003e directly from \u003ccode\u003ePATH\u003c/code\u003e instead. PyPI installations and those from the standalone installer are unaffected.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRemove support for ruff-lsp (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28750\"\u003e#28750\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eSupport for \u003ccode\u003eruff-lsp\u003c/code\u003e, the legacy Python language server \u003ca href=\"https://github.com/astral-sh/ruff/releases/tag/0.9.5\"\u003edeprecated in Ruff v0.9.5\u003c/a\u003e, has been removed. The Ruff VS Code extension now always uses the native language server; \u003ccode\u003eruff.nativeServer\u003c/code\u003e is deprecated and ignored. See the \u003ca href=\"https://docs.astral.sh/ruff/editors/migration/\"\u003emigration guide\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eStabilization\u003c/h3\u003e\n\u003cp\u003eThe following rules have been stabilized and are no longer in preview:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://docs.astral.sh/ruff/rules/lazy-import-mismatch\"\u003e\u003ccode\u003elazy-import-mismatch\u003c/code\u003e\u003c/a\u003e (\u003ccode\u003eTID254\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://docs.astral.sh/ruff/rules/lazy-import-immediately-resolved\"\u003e\u003ccode\u003elazy-import-immediately-resolved\u003c/code\u003e\u003c/a\u003e (\u003ccode\u003eTID255\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://docs.astral.sh/ruff/rules/os-path-commonprefix\"\u003e\u003ccode\u003eos-path-commonprefix\u003c/code\u003e\u003c/a\u003e (\u003ccode\u003eRUF071\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md\"\u003eruff's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e0.17.0\u003c/h2\u003e\n\u003cp\u003eReleased on 2026-10-09.\u003c/p\u003e\n\u003cp\u003eThe executables in our macOS and Windows release archives and \u003ccode\u003eruff\u003c/code\u003e wheels are now code-signed.\nmacOS executables are signed with an Apple Developer ID certificate and notarized by Apple. Windows\nexecutables have timestamped Authenticode signatures from Azure Artifact Signing. This enables\nverification of the release publisher and binary integrity, supports publisher-based allowlisting,\nand should reduce security warnings and antivirus false positives.\u003c/p\u003e\n\u003ch3\u003eBreaking changes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate the default and latest Python versions for 3.15 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28792\"\u003e#28792\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eRuff now defaults to Python 3.11 instead of 3.10 when no Python version is configured through\n\u003ca href=\"https://docs.astral.sh/ruff/settings/#target-version\"\u003e\u003ccode\u003etarget-version\u003c/code\u003e\u003c/a\u003e or\n\u003ca href=\"https://docs.astral.sh/ruff/configuration/#inferring-the-python-version\"\u003e\u003ccode\u003erequires-python\u003c/code\u003e\u003c/a\u003e. When\nchecking for syntax errors without a configured Python version, Ruff now defaults to Python 3.15\ninstead of 3.14.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate the default rule set (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28786\"\u003e#28786\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eSeveral of the \u003ccode\u003eflake8-datetimez\u003c/code\u003e rules\n(\u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-without-tzinfo/\"\u003e\u003ccode\u003eDTZ001\u003c/code\u003e\u003c/a\u003e,\n\u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-now-without-tzinfo/\"\u003e\u003ccode\u003eDTZ005\u003c/code\u003e\u003c/a\u003e,\n\u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-fromtimestamp/\"\u003e\u003ccode\u003eDTZ006\u003c/code\u003e\u003c/a\u003e,\n\u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-strptime-without-zone/\"\u003e\u003ccode\u003eDTZ007\u003c/code\u003e\u003c/a\u003e,\n\u003ca href=\"https://docs.astral.sh/ruff/rules/call-date-today/\"\u003e\u003ccode\u003eDTZ011\u003c/code\u003e\u003c/a\u003e,\n\u003ca href=\"https://docs.astral.sh/ruff/rules/call-date-fromtimestamp/\"\u003e\u003ccode\u003eDTZ012\u003c/code\u003e\u003c/a\u003e, and\n\u003ca href=\"https://docs.astral.sh/ruff/rules/datetime-min-max/\"\u003e\u003ccode\u003eDTZ901\u003c/code\u003e\u003c/a\u003e) are no longer enabled by default,\nwhile \u003ca href=\"https://docs.astral.sh/ruff/rules/undefined-local-with-nested-import-star-usage/\"\u003e\u003ccode\u003eundefined-local-with-nested-import-star-usage\u003c/code\u003e\u003c/a\u003e\n(\u003ccode\u003eF406\u003c/code\u003e), which corresponds to a syntax error, is now enabled by default.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate Rust crate quick-junit to 0.8.0 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/27295\"\u003e#27295\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eJUnit output now uses a \u003ccode\u003eskipped\u003c/code\u003e attribute instead of \u003ccode\u003edisabled\u003c/code\u003e on \u003ccode\u003e\u0026lt;testsuite\u0026gt;\u003c/code\u003e elements and\nincludes a \u003ccode\u003eskipped\u003c/code\u003e attribute on the root \u003ccode\u003e\u0026lt;testsuites\u0026gt;\u003c/code\u003e element.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e[\u003ccode\u003eflake8-import-conventions\u003c/code\u003e] Add \u003ccode\u003edatetime as dt\u003c/code\u003e as a conventional alias (\u003ccode\u003eICN001\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28790\"\u003e#28790\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSupport Unicode dummy variable names (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28722\"\u003e#28722\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eThe default \u003ca href=\"https://docs.astral.sh/ruff/settings/#lint_dummy-variable-rgx\"\u003e\u003ccode\u003elint.dummy-variable-rgx\u003c/code\u003e\u003c/a\u003e\nnow recognizes underscore-prefixed Unicode names, such as \u003ccode\u003e_次\u003c/code\u003e, as dummy variables.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate to Unicode 17 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/21229\"\u003e#21229\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28784\"\u003e#28784\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eRuff now uses Unicode 17 data for identifier normalization and named character escapes (\u003ccode\u003e\u0026quot;\\N{...}\u0026quot;\u003c/code\u003e).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAlways show unsafe and display-only fixes in the CLI (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/27810\"\u003e#27810\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/5b27c1ccfaa230fb195855f5cf3404a21e3379cd\"\u003e\u003ccode\u003e5b27c1c\u003c/code\u003e\u003c/a\u003e Bump version to 0.17.0 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/29259\"\u003e#29259\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/8f362bf4cb5dbad095ac416602496705d41fc843\"\u003e\u003ccode\u003e8f362bf\u003c/code\u003e\u003c/a\u003e Integrate vendored Unicode names into Ruff\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/88a50d695c1142294bb4c780fad47d3306173885\"\u003e\u003ccode\u003e88a50d6\u003c/code\u003e\u003c/a\u003e Revert upstream Unicode loose matching\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/276832aa91f2086a6ec880884fcdd987991cddf2\"\u003e\u003ccode\u003e276832a\u003c/code\u003e\u003c/a\u003e Revert upstream Unicode alias normalization\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/26911caa2800758779965510d2f222b438abbb38\"\u003e\u003ccode\u003e26911ca\u003c/code\u003e\u003c/a\u003e Vendor unicode_names2 from upstream\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/27e3797508d1a7ad69e4900d51e38d78785aaf73\"\u003e\u003ccode\u003e27e3797\u003c/code\u003e\u003c/a\u003e [\u003ccode\u003eruff\u003c/code\u003e] Stabilize \u003ccode\u003eos-path-commonprefix\u003c/code\u003e (\u003ccode\u003eRUF071\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/28764\"\u003e#28764\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/bbb52c1267cf39aba67e54c2b5800878d23073a9\"\u003e\u003ccode\u003ebbb52c1\u003c/code\u003e\u003c/a\u003e [\u003ccode\u003eflake8-tidy-imports\u003c/code\u003e] Stabilize \u003ccode\u003elazy-import-immediately-resolved\u003c/code\u003e (`TID255...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/5aa9cbd3a49d32b24ac21fa7797ca87a330792a2\"\u003e\u003ccode\u003e5aa9cbd\u003c/code\u003e\u003c/a\u003e [\u003ccode\u003eflake8-tidy-imports\u003c/code\u003e] Stabilize \u003ccode\u003elazy-import-mismatch\u003c/code\u003e (\u003ccode\u003eTID254\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/28760\"\u003e#28760\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/dba1bc893aedfeea2064c4e8e764135f0d44dc3f\"\u003e\u003ccode\u003edba1bc8\u003c/code\u003e\u003c/a\u003e [\u003ccode\u003eflake8-import-conventions\u003c/code\u003e] Add \u003ccode\u003edatetime as dt\u003c/code\u003e as a conventional alias (`...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/ef23c9c39eb3029bab0139c3ea7ae6d95c4131e0\"\u003e\u003ccode\u003eef23c9c\u003c/code\u003e\u003c/a\u003e Update default and latest Python versions for 3.15 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/28792\"\u003e#28792\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/astral-sh/ruff/compare/0.16.10...0.17.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `filelock` from 4.0.9 to 4.1.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/py-filelock/releases\"\u003efilelock's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e4.1.0\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eci: download coverage during tool setup by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/776\"\u003etox-dev/filelock#776\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(api): validate timeout and poll_interval bounds by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/781\"\u003etox-dev/filelock#781\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(read-write): accept inf and reject nan timeouts by \u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/779\"\u003etox-dev/filelock#779\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft-rw): ignore non-ASCII generation names by \u003ca href=\"https://github.com/dxbjavid\"\u003e\u003ccode\u003e@​dxbjavid\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/778\"\u003etox-dev/filelock#778\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): check start token in is_lock_held_by_us by \u003ca href=\"https://github.com/lprnmns\"\u003e\u003ccode\u003e@​lprnmns\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/774\"\u003etox-dev/filelock#774\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): clean up marker when rollback close fails by \u003ca href=\"https://github.com/harbinresearcher\"\u003e\u003ccode\u003e@​harbinresearcher\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/775\"\u003etox-dev/filelock#775\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(read-write): clamp waits to threading.TIMEOUT_MAX by \u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/780\"\u003etox-dev/filelock#780\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): treat truncated markers as malformed by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/782\"\u003etox-dev/filelock#782\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(acquire): keep every acquire wait within the timeout by \u003ca href=\"https://github.com/feiiiiii5\"\u003e\u003ccode\u003e@​feiiiiii5\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/777\"\u003etox-dev/filelock#777\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e📝 docs: fix hanging example and platform claims by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/783\"\u003etox-dev/filelock#783\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(unix): keep peer marker on ENOSYS fallback by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/785\"\u003etox-dev/filelock#785\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(async): clear the task hold after a canceled release by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/789\"\u003etox-dev/filelock#789\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e✨ feat(api): export lease types and has_fcntl by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/790\"\u003etox-dev/filelock#790\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(strict): age private records by the filesystem clock by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/792\"\u003etox-dev/filelock#792\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(async): surface executor shutdown as an error by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/793\"\u003etox-dev/filelock#793\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): expire leases on the contender's clock by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/796\"\u003etox-dev/filelock#796\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft-rw): stop an acquire that close() overtook by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/798\"\u003etox-dev/filelock#798\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(strict): record claims before linking them by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/787\"\u003etox-dev/filelock#787\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): restore a live marker a stale break moved aside by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/786\"\u003etox-dev/filelock#786\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(api): chain errors on 3.10 without exceptiongroup by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/788\"\u003etox-dev/filelock#788\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): release a dropped SoftFileLease by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/791\"\u003etox-dev/filelock#791\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(read-write): keep probe fds until the last connection closes by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/794\"\u003etox-dev/filelock#794\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e📦 build(sdist): ship docs and update SECURITY.md by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/812\"\u003etox-dev/filelock#812\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft-rw): survive a removed generation log by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/795\"\u003etox-dev/filelock#795\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): tell PID namespaces apart in the marker host by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/797\"\u003etox-dev/filelock#797\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(async): release from the finalizer and keep I/O off the loop by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/800\"\u003etox-dev/filelock#800\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(strict): name what blocks the lock path by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/804\"\u003etox-dev/filelock#804\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(read-write): reject WAL databases and link beside the db by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/805\"\u003etox-dev/filelock#805\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(read-write): track read depth per thread by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/806\"\u003etox-dev/filelock#806\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): honour mode and tighten marker grammar by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/807\"\u003etox-dev/filelock#807\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🧪 test: drop timing races from two runner-load flakes by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/809\"\u003etox-dev/filelock#809\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(descriptor): reject poll intervals above TIMEOUT_MAX by \u003ca href=\"https://github.com/sricharanreddycheruku\"\u003e\u003ccode\u003e@​sricharanreddycheruku\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/802\"\u003etox-dev/filelock#802\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(api): validate lock options up front by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/803\"\u003etox-dev/filelock#803\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft-rw): publish the head through gen/HEAD by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/799\"\u003etox-dev/filelock#799\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(api): release thread holds, guard reentry by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/810\"\u003etox-dev/filelock#810\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🧪 test(lease): give the age-out test a real-time margin by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/814\"\u003etox-dev/filelock#814\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e📝 docs: point canonical and og:url at versioned pages by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/813\"\u003etox-dev/filelock#813\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(read-write): refuse a database moved mid-acquire by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/808\"\u003etox-dev/filelock#808\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix: close regressions since 4.0.12 by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/815\"\u003etox-dev/filelock#815\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/779\"\u003etox-dev/filelock#779\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/harbinresearcher\"\u003e\u003ccode\u003e@​harbinresearcher\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/775\"\u003etox-dev/filelock#775\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/sricharanreddycheruku\"\u003e\u003ccode\u003e@​sricharanreddycheruku\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/802\"\u003etox-dev/filelock#802\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/tox-dev/filelock/compare/4.0.12...4.1.0\"\u003ehttps://github.com/tox-dev/filelock/compare/4.0.12...4.1.0\u003c/a\u003e\u003c/p\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/filelock/blob/main/docs/changelog.rst\"\u003efilelock's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e###########\nChangelog\n###########\u003c/p\u003e\n\u003cp\u003e.. towncrier-draft-entries:: Unreleased\u003c/p\u003e\n\u003cp\u003e.. towncrier release notes start\u003c/p\u003e\n\u003chr /\u003e\n\u003cp\u003e4.1.1 (2026-10-11)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eBound the shared-lock contention test by worker progress so slow CI machines can finish the workload. :pr:\u003ccode\u003e819\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eAvoid the macOS \u003ccode\u003e/dev/fd\u003c/code\u003e lookup implicated in a kernel panic by opening SQLite through a validated hard link.\nThe database directory must be writable and support hard links; alias creation failure raises \u003ccode\u003eOSError\u003c/code\u003e. :pr:\u003ccode\u003e820\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eIgnore non-ASCII PID or start-time fields and out-of-range PIDs in \u003ccode\u003eReadWriteLock\u003c/code\u003e hard-link directory names so forged\nowners cannot abort acquisition. :pr:\u003ccode\u003e821\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eUse Python 3.15 for development and automation. :pr:\u003ccode\u003e816\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.1.0 (2026-10-09)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eImport :data:\u003ccode\u003e~filelock.OwnerMode\u003c/code\u003e, :data:\u003ccode\u003e~filelock.CompromiseReason\u003c/code\u003e and :data:\u003ccode\u003e~filelock.has_fcntl\u003c/code\u003e from\n\u003ccode\u003efilelock\u003c/code\u003e. :pr:\u003ccode\u003e790\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:class:\u003ccode\u003e~filelock.AcquireReturnProxy\u003c/code\u003e is generic in the lock type, so \u003ccode\u003ewith lock.acquire() as held:\u003c/code\u003e types \u003ccode\u003eheld\u003c/code\u003e as\nthe lock's own class. :pr:\u003ccode\u003e803\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eA :class:\u003ccode\u003e~filelock.Timeout\u003c/code\u003e from a soft lock names a holder on another host or in another PID namespace, which no\ncontender ever reclaims. :pr:\u003ccode\u003e815\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:attr:\u003ccode\u003e~filelock.SoftFileLock.is_lock_held_by_us\u003c/code\u003e and :attr:\u003ccode\u003e~filelock.MarkerSoftFileLock.is_lock_held_by_us\u003c/code\u003e return\n\u003ccode\u003eFalse\u003c/code\u003e for a marker an earlier process with the same PID left behind. :pr:\u003ccode\u003e774\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:class:\u003ccode\u003e~filelock.SoftFileLock\u003c/code\u003e removes its marker when writing it fails and closing the descriptor fails too, so the\nlock path no longer stays blocked. :pr:\u003ccode\u003e775\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:meth:\u003ccode\u003e~filelock.BaseFileLock.acquire\u003c/code\u003e and :meth:\u003ccode\u003e~filelock.BaseAsyncFileLock.acquire\u003c/code\u003e no longer wait past \u003ccode\u003etimeout\u003c/code\u003e\nwhen \u003ccode\u003epoll_interval\u003c/code\u003e is longer than the time left. :pr:\u003ccode\u003e777\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:class:\u003ccode\u003e~filelock.SoftReadWriteLock\u003c/code\u003e ignores a generation-log entry whose name is not 20 ASCII digits, which used to\nstop its heartbeat thread or delete real generations. :pr:\u003ccode\u003e778\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:class:\u003ccode\u003e~filelock.ReadWriteLock\u003c/code\u003e, :class:\u003ccode\u003e~filelock.SoftReadWriteLock\u003c/code\u003e and their async wrappers treat a\n:data:\u003ccode\u003emath.inf\u003c/code\u003e timeout like \u003ccode\u003e-1\u003c/code\u003e and raise :class:\u003ccode\u003eValueError\u003c/code\u003e for a blocking \u003ccode\u003enan\u003c/code\u003e one. :pr:\u003ccode\u003e779\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:class:\u003ccode\u003e~filelock.ReadWriteLock\u003c/code\u003e and :class:\u003ccode\u003e~filelock.SoftReadWriteLock\u003c/code\u003e accept a timeout above\n:data:\u003ccode\u003ethreading.TIMEOUT_MAX\u003c/code\u003e instead of raising :class:\u003ccode\u003eOverflowError\u003c/code\u003e. :pr:\u003ccode\u003e780\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:meth:\u003ccode\u003e~filelock.BaseFileLock.acquire\u003c/code\u003e raises :class:\u003ccode\u003eValueError\u003c/code\u003e for a blocking \u003ccode\u003enan\u003c/code\u003e timeout or a \u003ccode\u003epoll_interval\u003c/code\u003e\nabove :data:\u003ccode\u003ethreading.TIMEOUT_MAX\u003c/code\u003e, and treats a :data:\u003ccode\u003emath.inf\u003c/code\u003e timeout like \u003ccode\u003e-1\u003c/code\u003e. :pr:\u003ccode\u003e781\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:class:\u003ccode\u003e~filelock.SoftFileLock\u003c/code\u003e and :class:\u003ccode\u003e~filelock.MarkerSoftFileLock\u003c/code\u003e treat a marker cut before its final newline as\nmalformed, so a crash-truncated record self-heals and a read mid-write no longer breaks a live lock. :pr:\u003ccode\u003e782\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:class:\u003ccode\u003e~filelock.UnixFileLock\u003c/code\u003e no longer deletes another process's live marker when it falls back to a soft lock on\n\u003ccode\u003eENOSYS\u003c/code\u003e, and on macOS a lock path ending in a separator raises :class:\u003ccode\u003eFileNotFoundError\u003c/code\u003e instead of retrying. :pr:\u003ccode\u003e785\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:class:\u003ccode\u003e~filelock.SoftFileLock\u003c/code\u003e and :class:\u003ccode\u003e~filelock.SoftFileLease\u003c/code\u003e put back a live successor's marker that a racing\nstale break moved aside, so a third contender no longer acquires beside the successor. :pr:\u003ccode\u003e786\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:class:\u003ccode\u003e~filelock.StrictSoftFileLock\u003c/code\u003e removes every claim a failed acquire published, counts an \u003ccode\u003eEEXIST\u003c/code\u003e link that\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/6c0ecc28f898f08cd0438cd489c3eaabad79a4b7\"\u003e\u003ccode\u003e6c0ecc2\u003c/code\u003e\u003c/a\u003e Release 4.1.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/df06bbd640765ad3f1ed4a096cbe29e64b5592bb\"\u003e\u003ccode\u003edf06bbd\u003c/code\u003e\u003c/a\u003e 🐛 fix: close regressions since 4.0.12 (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/815\"\u003e#815\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/071204515d211b560d203cb68105ec06789eab46\"\u003e\u003ccode\u003e0712045\u003c/code\u003e\u003c/a\u003e 🐛 fix(read-write): refuse a database moved mid-acquire (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/808\"\u003e#808\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/73fefc1e907457dd9bc9793eeba52f183d7f9c40\"\u003e\u003ccode\u003e73fefc1\u003c/code\u003e\u003c/a\u003e 📝 docs: point canonical and og:url at versioned pages (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/813\"\u003e#813\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/181b36b90e6c994a3e5b36ce3f66ad4dc2d5358e\"\u003e\u003ccode\u003e181b36b\u003c/code\u003e\u003c/a\u003e 🧪 test(lease): give the age-out test a real-time margin (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/814\"\u003e#814\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/2c19af4fa6a3c4c41b95ec87424cc4fb6dc40411\"\u003e\u003ccode\u003e2c19af4\u003c/code\u003e\u003c/a\u003e 🐛 fix(api): release thread holds, guard reentry (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/810\"\u003e#810\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/367b1118fd4b366d33b1e57a6d55f8993962531c\"\u003e\u003ccode\u003e367b111\u003c/code\u003e\u003c/a\u003e 🐛 fix(soft-rw): publish the head through gen/HEAD (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/799\"\u003e#799\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/61582c5f8ee60e6ba9fd9546fb2c11f9d727f72f\"\u003e\u003ccode\u003e61582c5\u003c/code\u003e\u003c/a\u003e 🐛 fix(api): validate lock options up front (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/803\"\u003e#803\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/20c4b5ae1332f3ded65c44e42479f014669fc06b\"\u003e\u003ccode\u003e20c4b5a\u003c/code\u003e\u003c/a\u003e 🐛 fix(descriptor): reject poll intervals above TIMEOUT_MAX (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/802\"\u003e#802\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/cf092c7992d8348932835b563a3fcaf35cb88b5f\"\u003e\u003ccode\u003ecf092c7\u003c/code\u003e\u003c/a\u003e 🧪 test: drop timing races from two runner-load flakes (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/809\"\u003e#809\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/tox-dev/py-filelock/compare/4.0.9...4.1.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `iniconfig` from 2.3.0 to 2.3.1\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pytest-dev/iniconfig/releases\"\u003einiconfig's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003eVersion 2.3.1\u003c/h2\u003e\n\u003ch2\u003eFixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eParsing values with many continuation lines is now linear instead of quadratic in time (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/78\"\u003e#78\u003c/a\u003e, regarding \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/77\"\u003e#77\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003eA leading UTF-8 BOM is now stripped when reading INI files. Files saved by Windows editors used to fail with \u003ccode\u003eParseError\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/76\"\u003e#76\u003c/a\u003e, thanks \u003ca href=\"https://github.com/Pitchfork-and-Torch\"\u003e\u003ccode\u003e@​Pitchfork-and-Torch\u003c/code\u003e\u003c/a\u003e).\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eInternal\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003einiconfig._parse.ParsedLine.value\u003c/code\u003e is now a list of lines. This is private API.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eDocs\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eThe README example now uses \u003ccode\u003eIniConfig.parse()\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/79\"\u003e#79\u003c/a\u003e, thanks \u003ca href=\"https://github.com/MbappeWU\"\u003e\u003ccode\u003e@​MbappeWU\u003c/code\u003e\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003eFixed the issue tracker link (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/74\"\u003e#74\u003c/a\u003e, thanks \u003ca href=\"https://github.com/stefan6419846\"\u003e\u003ccode\u003e@​stefan6419846\u003c/code\u003e\u003c/a\u003e).\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull diff:\u003c/strong\u003e \u003ca href=\"https://github.com/pytest-dev/iniconfig/compare/v2.3.0...v2.3.1\"\u003ehttps://github.com/pytest-dev/iniconfig/compare/v2.3.0...v2.3.1\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e[pre-commit.ci] pre-commit autoupdate by \u003ca href=\"https://github.com/pre-commit-ci\"\u003e\u003ccode\u003e@​pre-commit-ci\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/71\"\u003epytest-dev/iniconfig#71\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[pre-commit.ci] pre-commit autoupdate by \u003ca href=\"https://github.com/pre-commit-ci\"\u003e\u003ccode\u003e@​pre-commit-ci\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/72\"\u003epytest-dev/iniconfig#72\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix link to issues by \u003ca href=\"https://github.com/stefan6419846\"\u003e\u003ccode\u003e@​stefan6419846\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/74\"\u003epytest-dev/iniconfig#74\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eparse_lines: keep values as list of lines, join once by \u003ca href=\"https://github.com/RonnyPfannschmidt\"\u003e\u003ccode\u003e@​RonnyPfannschmidt\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/78\"\u003epytest-dev/iniconfig#78\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[pre-commit.ci] pre-commit autoupdate by \u003ca href=\"https://github.com/pre-commit-ci\"\u003e\u003ccode\u003e@​pre-commit-ci\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/73\"\u003epytest-dev/iniconfig#73\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003etest: expect sorted \u003cstrong\u003eall\u003c/strong\u003e after ruff autofix by \u003ca href=\"https://github.com/RonnyPfannschmidt\"\u003e\u003ccode\u003e@​RonnyPfannschmidt\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/80\"\u003epytest-dev/iniconfig#80\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003edocs: use parse API in the README example by \u003ca href=\"https://github.com/MbappeWU\"\u003e\u003ccode\u003e@​MbappeWU\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/79\"\u003epytest-dev/iniconfig#79\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eStrip leading UTF-8 BOM when reading INI files by \u003ca href=\"https://github.com/Pitchfork-and-Torch\"\u003e\u003ccode\u003e@​Pitchfork-and-Torch\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/76\"\u003epytest-dev/iniconfig#76\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echangelog: add BOM stripping (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/76\"\u003e#76\u003c/a\u003e) to 2.3.1 by \u003ca href=\"https://github.com/RonnyPfannschmidt\"\u003e\u003ccode\u003e@​RonnyPfannschmidt\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/81\"\u003epytest-dev/iniconfig#81\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/stefan6419846\"\u003e\u003ccode\u003e@​stefan6419846\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/74\"\u003epytest-dev/iniconfig#74\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/MbappeWU\"\u003e\u003ccode\u003e@​MbappeWU\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/79\"\u003epytest-dev/iniconfig#79\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/Pitchfork-and-Torch\"\u003e\u003ccode\u003e@​Pitchfork-and-Torch\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/76\"\u003epytest-dev/iniconfig#76\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pytest-dev/iniconfig/compare/v2.3.0...v2.3.1\"\u003ehttps://github.com/pytest-dev/iniconfig/compare/v2.3.0...v2.3.1\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pytest-dev/iniconfig/blob/main/CHANGELOG\"\u003einiconfig's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e2.3.1\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003efix quadratic parse time for values with many continuation lines (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/78\"\u003e#78\u003c/a\u003e, regarding \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/77\"\u003e#77\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003estrip a leading UTF-8 BOM when reading INI files, which previously raised \u003ccode\u003eParseError\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/76\"\u003e#76\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003einternal: \u003ccode\u003einiconfig._parse.ParsedLine.value\u003c/code\u003e is now a list of lines\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/316fbfaf2752d89326e1e75b45cd070f5b5ace9a\"\u003e\u003ccode\u003e316fbfa\u003c/code\u003e\u003c/a\u003e changelog: add BOM stripping (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/76\"\u003e#76\u003c/a\u003e) to 2.3.1 (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/81\"\u003e#81\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/d2dcb7289291e7e7019c183659814d42f7264b2d\"\u003e\u003ccode\u003ed2dcb72\u003c/code\u003e\u003c/a\u003e Strip leading UTF-8 BOM when reading INI files (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/76\"\u003e#76\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/40d8c03a1553953350d787e45f1cb768e2c14e6a\"\u003e\u003ccode\u003e40d8c03\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/79\"\u003e#79\u003c/a\u003e from MbappeWU/codex/docs-parse-inline-comments\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/48359c3a7c2c8648a134ea8469e802b5aa8d5030\"\u003e\u003ccode\u003e48359c3\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/80\"\u003e#80\u003c/a\u003e from pytest-dev/claude/fix-iniconfig-test-eukh2n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/b153213a011fa92f4370c83cef614cf73c987f57\"\u003e\u003ccode\u003eb153213\u003c/code\u003e\u003c/a\u003e test: expect sorted \u003cstrong\u003eall\u003c/strong\u003e after ruff RUF022 autofix\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/4fddfabc850afee28178931c62535ba1c2b30c72\"\u003e\u003ccode\u003e4fddfab\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/73\"\u003e#73\u003c/a\u003e from pytest-dev/pre-commit-ci-update-config\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/15852c2d1f9178ff960bf6c39a6f0f1495f1009e\"\u003e\u003ccode\u003e15852c2\u003c/code\u003e\u003c/a\u003e [pre-commit.ci] auto fixes from pre-commit.com hooks\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/2e68639c3f41ea5b693f89807172cf304c94fb9e\"\u003e\u003ccode\u003e2e68639\u003c/code\u003e\u003c/a\u003e [pre-commit.ci] pre-commit autoupdate\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/23c9e088a909f16d0d8dc03b5090c66964c428b0\"\u003e\u003ccode\u003e23c9e08\u003c/code\u003e\u003c/a\u003e docs: use parse API in the README example\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/e038536fbee6b5e76b180fce6694fd54661ced12\"\u003e\u003ccode\u003ee038536\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/78\"\u003e#78\u003c/a\u003e from RonnyPfannschmidt/claude/dazzling-einstein-h8zq7m\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/pytest-dev/iniconfig/compare/v2.3.0...v2.3.1\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `markupsafe` from 3.0.3 to 3.0.4\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pallets/markupsafe/releases\"\u003emarkupsafe's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e3.0.4\u003c/h2\u003e\n\u003cp\u003eThis is the MarkupSafe 3.0.4 fix release, which fixes bugs but does not otherwise change behavior and should not result in breaking changes compared to the latest feature release.\u003c/p\u003e\n\u003cp\u003ePyPI: \u003ca href=\"https://pypi.org/project/MarkupSafe/3.0.4/\"\u003ehttps://pypi.org/project/MarkupSafe/3.0.4/\u003c/a\u003e\nChanges: \u003ca href=\"https://markupsafe.palletsprojects.com/page/changes/#version-3-0-4\"\u003ehttps://markupsafe.palletsprojects.com/page/changes/#version-3-0-4\u003c/a\u003e\nMilestone: \u003ca href=\"https://github.com/pallets/markupsafe/milestone/17?closed=1\"\u003ehttps://github.com/pallets/markupsafe/milestone/17?closed=1\u003c/a\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eBuild Python 3.15, armv7l, ppc64le, Android, and iOS wheels.\u003c/li\u003e\n\u003cli\u003eImprove performance of \u003ccode\u003estriptags\u003c/code\u003e. \u003ca href=\"https://redirect.github.com/pallets/markupsafe/issues/521\"\u003e#521\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pallets/markupsafe/blob/main/CHANGES.rst\"\u003emarkupsafe's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003eVersion 3.0.4\u003c/h2\u003e\n\u003cp\u003eReleased 2026-10-02\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eBuild Python 3.15, armv7l, ppc64le, Android, and iOS wheels.\u003c/li\u003e\n\u003cli\u003eImprove performance of \u003ccode\u003estriptags\u003c/code\u003e. :issue:\u003ccode\u003e521\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pallets/markupsafe/commit/ece26078ec168ebac69f02877238e68d4b376c91\"\u003e\u003ccode\u003eece2607\u003c/code\u003e\u003c/a\u003e release version 3.0.4\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pallets/markupsafe/commit/620bc809d748de3a7848bdf7e27b1c2a2903aaf5\"\u003e\u003ccode\u003e620bc80\u003c/code\u003e\u003c/a\u003e split archs\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pallets/markupsafe/commit/73c3be1596906daf3e642e51852af5a019c5e1ea\"\u003e\u003ccode\u003e73c3be1\u003c/code\u003e\u003c/a\u003e fix wheel builds (\u003ca href=\"https://redirect.github.com/pallets/markupsafe/issues/536\"\u003e#536\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pallets/markupsafe/commit/d8ae19e6e45b5512472b74fe5c60b7f6aa18d70f\"\u003e\u003ccode\u003ed8ae19e\u003c/code\u003e\u003c/a\u003e fix wheel builds\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pallets/markupsafe/commit/ff1eaff921f92db57327752bbc37472d37fb9b21\"\u003e\u003ccode\u003eff1eaff\u003c/code\u003e\u003c/a\u003e Build Android and iOS wheels (\u003ca href=\"https://redirect.github.com/pallets/markupsafe/issues/516\"\u003e#516\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pallets/markupsafe/commit/87e64f9628c574bf91898f8642a21356cccaa58c\"\u003e\u003ccode\u003e87e64f9\u003c/code\u003e\u003c/a\u003e build Android and iOS wheels\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pallets/markupsafe/commit/bc33c55cb3078ba9f9b0950babb32f8d842f1267\"\u003e\u003ccode\u003ebc33c55\u003c/code\u003e\u003c/a\u003e Build ppc64le wheels (\u003ca href=\"https://redirect.github.com/pallets/markupsafe/issues/518\"\u003e#518\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pallets/markupsafe/commit/0ddd6eac9b20df52c75fae9181c0e73e195fa8d1\"\u003e\u003ccode\u003e0ddd6ea\u003c/code\u003e\u003c/a\u003e build ppc64le wheels\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pallets/markupsafe/commit/3e0775809b92150b10d1671ce1821ea6eb56be0c\"\u003e\u003ccode\u003e3e07758\u003c/code\u003e\u003c/a\u003e Build armv7l wheels (\u003ca href=\"https://redirect.github.com/pallets/markupsafe/issues/514\"\u003e#514\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pallets/markupsafe/commit/39b9aae5f1e70edc33f380b47d1bef0e281746b5\"\u003e\u003ccode\u003e39b9aae\u003c/code\u003e\u003c/a\u003e build armv7l wheels\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/pallets/markupsafe/compare/3.0.3...3.0.4\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `platformdirs` from 4.12.2 to 4.12.4\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/platformdirs/releases\"\u003eplatformdirs's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e4.12.4\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eci: download coverage during tool setup by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/609\"\u003etox-dev/platformdirs#609\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(api): keep root's site dir readable in place_*_file by \u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/610\"\u003etox-dev/platformdirs#610\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix: fall back from unreachable runtime directory with ensure_exists by \u003ca href=\"https://github.com/harbinresearcher\"\u003e\u003ccode\u003e@​harbinresearcher\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/611\"\u003etox-dev/platformdirs#611\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/harbinresearcher\"\u003e\u003ccode\u003e@​harbinresearcher\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/611\"\u003etox-dev/platformdirs#611\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/tox-dev/platformdirs/compare/4.12.3...4.12.4\"\u003ehttps://github.com/tox-dev/platformdirs/compare/4.12.3...4.12.4\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e4.12.3\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003ePlace root config and data files in the first site directory by \u003ca href=\"https://github.com/PDGGK\"\u003e\u003ccode\u003e@​PDGGK\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/607\"\u003etox-dev/platformdirs#607\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/PDGGK\"\u003e\u003ccode\u003e@​PDGGK\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/607\"\u003etox-dev/platformdirs#607\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/tox-dev/platformdirs/compare/4.12.2...4.12.3\"\u003ehttps://github.com/tox-dev/platformdirs/compare/4.12.2...4.12.3\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/platformdirs/blob/main/docs/changelog.rst\"\u003eplatformdirs's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e###########\nChangelog\n###########\u003c/p\u003e\n\u003cp\u003e.. towncrier-draft-entries:: Unreleased\u003c/p\u003e\n\u003cp\u003e.. towncrier release notes start\u003c/p\u003e\n\u003chr /\u003e\n\u003cp\u003e4.13.0 (2026-10-10)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eDetect Homebrew Python for the :class:\u003ccode\u003e~platformdirs.macos.MacOS\u003c/code\u003e site directories under :option:\u003ccode\u003epython:-S\u003c/code\u003e, which\nleaves :data:\u003ccode\u003esys.base_prefix\u003c/code\u003e on the \u003ccode\u003eCellar\u003c/code\u003e keg, and for the \u003ccode\u003epython-freethreading\u003c/code\u003e formula - by\n:user:\u003ccode\u003esricharanreddycheruku\u003c/code\u003e. :pr:\u003ccode\u003e612\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eUse Python 3.15 for development and automation. :pr:\u003ccode\u003e613\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.12.4 (2026-10-07)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eKeep site directories readable by other users when root calls\n:meth:\u003ccode\u003e~platformdirs.api.PlatformDirsABC.place_config_file\u003c/code\u003e or another \u003ccode\u003eplace_*_file\u003c/code\u003e method with\n:attr:\u003ccode\u003e~platformdirs.api.PlatformDirsABC.use_site_for_root\u003c/code\u003e - by :user:\u003ccode\u003edarrenhuai\u003c/code\u003e. :pr:\u003ccode\u003e610\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eMake :func:\u003ccode\u003e~platformdirs.user_runtime_dir\u003c/code\u003e warn and fall back from an unreachable \u003ccode\u003eXDG_RUNTIME_DIR\u003c/code\u003e under\n:attr:\u003ccode\u003e~platformdirs.api.PlatformDirsABC.ensure_exists\u003c/code\u003e instead of raising. :pr:\u003ccode\u003e611\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.12.3 (2026-10-03)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003ePlace files from \u003ccode\u003eplace_config_file\u003c/code\u003e and \u003ccode\u003eplace_data_file\u003c/code\u003e in the first site directory for root on Unix with\n\u003ccode\u003euse_site_for_root=True\u003c/code\u003e and \u003ccode\u003emultipath=True\u003c/code\u003e, where \u003ccode\u003efind_config_file\u003c/code\u003e and \u003ccode\u003efind_data_file\u003c/code\u003e look for them.\n:pr:\u003ccode\u003e607\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.12.2 (2026-09-29)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eKeep \u003ccode\u003eos.pathsep\u003c/code\u003e in \u003ccode\u003esite_applications_path\u003c/code\u003e under \u003ccode\u003emultipath=True\u003c/code\u003e on platforms with one applications\ndirectory. :pr:\u003ccode\u003e604\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.12.1 (2026-09-28)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eAvoid \u003ccode\u003ePytestAssertRewriteWarning\u003c/code\u003e when importing \u003ccode\u003eplatformdirs\u003c/code\u003e before invoking pytest. :pr:\u003ccode\u003e601\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.12.0 (2026-09-26)\u003c/p\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/19338a4fdfc0cdd6b5342ec137efd9e5613d67d2\"\u003e\u003ccode\u003e19338a4\u003c/code\u003e\u003c/a\u003e Release 4.12.4\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/f2a4fa944f3637c8e7aa1fe8e95c9adfefe8ed2c\"\u003e\u003ccode\u003ef2a4fa9\u003c/code\u003e\u003c/a\u003e fix: fall back from unreachable runtime directory with ensure_exists (\u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/issues/611\"\u003e#611\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/16429e2135fa70b314ef69fa7da4d5e746eb75c9\"\u003e\u003ccode\u003e16429e2\u003c/code\u003e\u003c/a\u003e 🐛 fix(api): keep root's site dir readable in place_*_file (\u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/issues/610\"\u003e#610\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/b9735d3c9f4a0b5ca4dafc15b53541fe3973f453\"\u003e\u003ccode\u003eb9735d3\u003c/code\u003e\u003c/a\u003e ci: download coverage during tool setup (\u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/issues/609\"\u003e#609\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/344f2497bce1fba7838ef112f2bd91e9d5f23b58\"\u003e\u003ccode\u003e344f249\u003c/code\u003e\u003c/a\u003e [pre-commit.ci] pre-commit autoupdate (\u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/issues/608\"\u003e#608\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/960ff632eb575deb6f0d5bf49519d5a2ee2098b6\"\u003e\u003ccode\u003e960ff63\u003c/code\u003e\u003c/a\u003e Release 4.12.3\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/8047ad5bf0e5fd3db9c8ce9f250f73c3d961fe19\"\u003e\u003ccode\u003e8047ad5\u003c/code\u003e\u003c/a\u003e Place root config and data files in the first site directory (\u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/issues/607\"\u003e#607\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/tox-dev/platformdirs/compare/4.12.2...4.12.4\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `pycparser` from 3.0 to 3.11\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/eliben/pycparser/releases\"\u003epycparser's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003erelease_v3.11\u003c/h2\u003e\n\u003cp\u003eEnhanced C11 support\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/eliben/pycparser/compare/release_v3.01...release_v3.11\"\u003ehttps://github.com/eliben/pycparser/compare/release_v3.01...release_v3.11\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003erelease_v3.01\u003c/h2\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eDrop an unneeded direct build depndency on wheel by \u003ca href=\"https://github.com/hroncok\"\u003e\u003ccode\u003e@​hroncok\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/eliben/pycparser/pull/597\"\u003eeliben/pycparser#597\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix: handle integer suffix in #line directive without crashing by \u003ca href=\"https://github.com/SAY-5\"\u003e\u003ccode\u003e@​SAY-5\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/eliben/pycparser/pull/601\"\u003eeliben/pycparser#601\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUpdate default branch to main by \u003ca href=\"https://github.com/myd7349\"\u003e\u003ccode\u003e@​myd7349\u003c/code\u003e\u003c/a\u003e in \u003ca ...\n\n_Description has been truncated_","html_url":"https://github.com/ay-mich/nopii/pull/87","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/ay-mich%2Fnopii/issues/87","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/87/packages"},{"uuid":"5813791750","node_id":"PR_kwDOTNo6ls8AAAABH9u_JQ","number":71,"state":"closed","title":"Bump the patch-and-minor group across 1 directory with 11 updates","user":"dependabot[bot]","labels":[],"assignees":[],"locked":false,"comments_count":2,"pull_request":true,"closed_at":"2026-10-17T19:58:44.000Z","author_association":null,"state_reason":null,"created_at":"2026-10-12T12:33:14.000Z","updated_at":"2026-10-17T19:58:46.000Z","time_to_close":458730,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"Bump","group_name":"patch-and-minor","update_count":11,"packages":[{"name":"django","old_version":"5.2.17","new_version":"5.2.18","repository_url":"https://github.com/django/django"},{"name":"djangorestframework","old_version":"3.18.1","new_version":"3.18.3","repository_url":"https://github.com/encode/django-rest-framework"},{"name":"ruff","old_version":"0.16.8","new_version":"0.16.10","repository_url":"https://github.com/astral-sh/ruff"},{"name":"sentry-sdk","old_version":"2.69.2","new_version":"2.71.0","repository_url":"https://github.com/getsentry/sentry-python"},{"name":"django-otp","old_version":"1.7.3","new_version":"1.7.4","repository_url":"https://github.com/django-otp/django-otp"},{"name":"cryptography","old_version":"50.0.1","new_version":"50.0.2","repository_url":"https://github.com/pyca/cryptography"},{"name":"pypdf","old_version":"6.19.0","new_version":"6.20.0","repository_url":"https://github.com/py-pdf/pypdf"},{"name":"black","old_version":"26.5.1","new_version":"26.10.0","repository_url":"https://github.com/psf/black"},{"name":"virtualenv","old_version":"21.14.2","new_version":"21.14.6","repository_url":"https://github.com/pypa/virtualenv"},{"name":"mypy","old_version":"2.3.1","new_version":"2.4.0","repository_url":"https://github.com/python/mypy"},{"name":"django-stubs","old_version":"6.1.1","new_version":"6.1.2","repository_url":"https://github.com/typeddjango/django-stubs"}],"path":null,"ecosystem":"pip"},"body":"Bumps the patch-and-minor group with 11 updates in the /jasmin-core/django-core directory:\n\n| Package | From | To |\n| --- | --- | --- |\n| [django](https://github.com/django/django) | `5.2.17` | `5.2.18` |\n| [djangorestframework](https://github.com/encode/django-rest-framework) | `3.18.1` | `3.18.3` |\n| [ruff](https://github.com/astral-sh/ruff) | `0.16.8` | `0.16.10` |\n| [sentry-sdk](https://github.com/getsentry/sentry-python) | `2.69.2` | `2.71.0` |\n| [django-otp](https://github.com/django-otp/django-otp) | `1.7.3` | `1.7.4` |\n| [cryptography](https://github.com/pyca/cryptography) | `50.0.1` | `50.0.2` |\n| [pypdf](https://github.com/py-pdf/pypdf) | `6.19.0` | `6.20.0` |\n| [black](https://github.com/psf/black) | `26.5.1` | `26.10.0` |\n| [virtualenv](https://github.com/pypa/virtualenv) | `21.14.2` | `21.14.6` |\n| [mypy](https://github.com/python/mypy) | `2.3.1` | `2.4.0` |\n| [django-stubs](https://github.com/typeddjango/django-stubs) | `6.1.1` | `6.1.2` |\n\n\nUpdates `django` from 5.2.17 to 5.2.18\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/django/django/commit/3ae618c745df5b87053ad91588c72a4c8e646853\"\u003e\u003ccode\u003e3ae618c\u003c/code\u003e\u003c/a\u003e [5.2.x] Bumped version for 5.2.18 release.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/django/django/commit/1eafa1a80f1363283f89208ba4499ed54e35f085\"\u003e\u003ccode\u003e1eafa1a\u003c/code\u003e\u003c/a\u003e [5.2.x] Refs CVE-2026-15830 -- Fixed WKB geometry collection limit bypasses.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/django/django/commit/ff27883ca055aa9ab23015b50674a5b10dfe5a41\"\u003e\u003ccode\u003eff27883\u003c/code\u003e\u003c/a\u003e [5.2.x] Fixed CVE-2026-87975 -- Prevented forging actions in model formsets w...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/django/django/commit/dd0558d1617619e0d66163675ef02135d0f54e5f\"\u003e\u003ccode\u003edd0558d\u003c/code\u003e\u003c/a\u003e [5.2.x] Fixed CVE-2026-87890 -- Blocked bytes in spatial lookups.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/django/django/commit/6ecd66e09a383be004a78a3a738ea9727ff07b0e\"\u003e\u003ccode\u003e6ecd66e\u003c/code\u003e\u003c/a\u003e [5.2.x] Fixed CVE-2026-84429 -- Simplified parse_header_parameters by leverag...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/django/django/commit/02a69e3791e3df23d45ea4ea7e7fc489f0eef2be\"\u003e\u003ccode\u003e02a69e3\u003c/code\u003e\u003c/a\u003e [5.2.x] Fixed CVE-2026-77050 -- Prevented memory exhaustion in get_supported_...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/django/django/commit/f59aef2ee9b5c988fd4179d8f2835030bd76297c\"\u003e\u003ccode\u003ef59aef2\u003c/code\u003e\u003c/a\u003e [5.2.x] Confirmed release date for 5.2.18.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/django/django/commit/a3d71038401b9340f550f2fdf1caaad66465ba88\"\u003e\u003ccode\u003ea3d7103\u003c/code\u003e\u003c/a\u003e [5.2.x] Fixed \u003ca href=\"https://redirect.github.com/django/django/issues/37289\"\u003e#37289\u003c/a\u003e -- Avoided deleting network rasters.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/django/django/commit/4ea267661b260ea0d0c87e9dcb99d70037c6f2fc\"\u003e\u003ccode\u003e4ea2676\u003c/code\u003e\u003c/a\u003e [5.2.x] Refs \u003ca href=\"https://redirect.github.com/django/django/issues/36862\"\u003e#36862\u003c/a\u003e -- Clarified security note for RemoteUserMiddleware.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/django/django/commit/7def346c005a0b8eaffd6de9d68d621b398323dd\"\u003e\u003ccode\u003e7def346\u003c/code\u003e\u003c/a\u003e [5.2.x] Refs \u003ca href=\"https://redirect.github.com/django/django/issues/36862\"\u003e#36862\u003c/a\u003e -- Reiterated security note on both variants of RemoteUse...\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/django/django/compare/5.2.17...5.2.18\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `djangorestframework` from 3.18.1 to 3.18.3\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/encode/django-rest-framework/releases\"\u003edjangorestframework's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e3.18.3\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003ch3\u003eBug fixes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eRestore \u003ccode\u003eorder_by_precedence\u003c/code\u003e from 3.18.1 to fix broken return value by \u003ca href=\"https://github.com/browniebroke\"\u003e\u003ccode\u003e@​browniebroke\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/encode/django-rest-framework/pull/10066\"\u003eencode/django-rest-framework#10066\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/encode/django-rest-framework/compare/3.18.2...3.18.3\"\u003ehttps://github.com/encode/django-rest-framework/compare/3.18.2...3.18.3\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e3.18.2\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003ch3\u003eSecurity\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eGHSA-33wh-fxxf-88vv: Harden content negotiation against large \u003ccode\u003eAccept\u003c/code\u003e headers by \u003ca href=\"https://github.com/jisung-02\"\u003e\u003ccode\u003e@​jisung-02\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://github.com/encode/django-rest-framework/commit/148ab65\"\u003e148ab65\u003c/a\u003e. Thanks \u003ca href=\"https://github.com/jisung-02\"\u003e\u003ccode\u003e@​jisung-02\u003c/code\u003e\u003c/a\u003e for the report.\u003c/li\u003e\n\u003cli\u003eGHSA-3547-9m27-7rxg: Refuse non-text encoding charsets by \u003ca href=\"https://github.com/syrull\"\u003e\u003ccode\u003e@​syrull\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://github.com/encode/django-rest-framework/commit/3c26345\"\u003e3c26345\u003c/a\u003e. Thanks \u003ca href=\"https://github.com/syrull\"\u003e\u003ccode\u003e@​syrull\u003c/code\u003e\u003c/a\u003e and \u003ca href=\"https://github.com/jisung-02\"\u003e\u003ccode\u003e@​jisung-02\u003c/code\u003e\u003c/a\u003e who both reported the problem.\u003c/li\u003e\n\u003cli\u003eGHSA-xw6w-gcfp-cf8m: Make \u003ccode\u003eTokenProxy\u003c/code\u003e deletion actually delete the token by \u003ca href=\"https://github.com/syrull\"\u003e\u003ccode\u003e@​syrull\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://github.com/encode/django-rest-framework/commit/af3fabf\"\u003eaf3fabf\u003c/a\u003e. Thanks \u003ca href=\"https://github.com/syrull\"\u003e\u003ccode\u003e@​syrull\u003c/code\u003e\u003c/a\u003e for the report.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eFeatures\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAdd support for Python 3.15 by \u003ca href=\"https://github.com/p-r-a-v-i-n\"\u003e\u003ccode\u003e@​p-r-a-v-i-n\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/encode/django-rest-framework/pull/10025\"\u003eencode/django-rest-framework#10025\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eBug fixes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eFix \u003ccode\u003eblank=True\u003c/code\u003e fields in unique constraints being treated as required by \u003ca href=\"https://github.com/MehrazRumman\"\u003e\u003ccode\u003e@​MehrazRumman\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/encode/django-rest-framework/pull/10039\"\u003eencode/django-rest-framework#10039\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix \u003ccode\u003eUniqueConstraint\u003c/code\u003e validation with conditional fields by \u003ca href=\"https://github.com/majidkhazaei\"\u003e\u003ccode\u003e@​majidkhazaei\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/encode/django-rest-framework/pull/10021\"\u003eencode/django-rest-framework#10021\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/olitreadwell\"\u003e\u003ccode\u003e@​olitreadwell\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/encode/django-rest-framework/pull/10038\"\u003eencode/django-rest-framework#10038\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/majidkhazaei\"\u003e\u003ccode\u003e@​majidkhazaei\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/encode/django-rest-framework/pull/10021\"\u003eencode/django-rest-framework#10021\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/rblotsky\"\u003e\u003ccode\u003e@​rblotsky\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/encode/django-rest-framework/pull/10045\"\u003eencode/django-rest-framework#10045\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mrchatam\"\u003e\u003ccode\u003e@​mrchatam\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/encode/django-rest-framework/pull/10042\"\u003eencode/django-rest-framework#10042\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/haimingZZ\"\u003e\u003ccode\u003e@​haimingZZ\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/encode/django-rest-framework/pull/10052\"\u003eencode/django-rest-framework#10052\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jisung-02\"\u003e\u003ccode\u003e@​jisung-02\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://github.com/encode/django-rest-framework/commit/148ab65\"\u003e148ab65\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/syrull\"\u003e\u003ccode\u003e@​syrull\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://github.com/encode/django-rest-framework/commit/3c26345\"\u003e3c26345\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/encode/django-rest-framework/compare/3.18.1...3.18.2\"\u003ehttps://github.com/encode/django-rest-framework/compare/3.18.1...3.18.2\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/encode/django-rest-framework/commit/1af5b55758ac514c492ed3a5fc1a6fb244cdb257\"\u003e\u003ccode\u003e1af5b55\u003c/code\u003e\u003c/a\u003e Prepare release 3.18.3 (\u003ca href=\"https://redirect.github.com/encode/django-rest-framework/issues/10067\"\u003e#10067\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/encode/django-rest-framework/commit/e140de794d11149a09c04a3ee7cc4815946148f8\"\u003e\u003ccode\u003ee140de7\u003c/code\u003e\u003c/a\u003e Restore order_by_precedence from 3.18.1 (\u003ca href=\"https://redirect.github.com/encode/django-rest-framework/issues/10066\"\u003e#10066\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/encode/django-rest-framework/commit/7195f7e4c51527054623ea55fc4491786acc91f8\"\u003e\u003ccode\u003e7195f7e\u003c/code\u003e\u003c/a\u003e Bump the pre-commit group across 1 directory with 2 updates (\u003ca href=\"https://redirect.github.com/encode/django-rest-framework/issues/10063\"\u003e#10063\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/encode/django-rest-framework/commit/69694a17d0b6ac14b4ea4d77916b73c68dc5a3e8\"\u003e\u003ccode\u003e69694a1\u003c/code\u003e\u003c/a\u003e Prepare release 3.18.2 (\u003ca href=\"https://redirect.github.com/encode/django-rest-framework/issues/10065\"\u003e#10065\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/encode/django-rest-framework/commit/af3fabfd517307fbc5d500fba1ab8f6e25f220b0\"\u003e\u003ccode\u003eaf3fabf\u003c/code\u003e\u003c/a\u003e Merge commit from fork\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/encode/django-rest-framework/commit/3c2634599b26a9f789b03045118dbc276117611a\"\u003e\u003ccode\u003e3c26345\u003c/code\u003e\u003c/a\u003e Merge commit from fork\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/encode/django-rest-framework/commit/148ab6523922d5a0c110f76615935e5220b63029\"\u003e\u003ccode\u003e148ab65\u003c/code\u003e\u003c/a\u003e Merge commit from fork\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/encode/django-rest-framework/commit/3d18900ead34e9491f94597617a12fdd47161e97\"\u003e\u003ccode\u003e3d18900\u003c/code\u003e\u003c/a\u003e Fix CI that broke due to latest Django bugfix (\u003ca href=\"https://redirect.github.com/encode/django-rest-framework/issues/10064\"\u003e#10064\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/encode/django-rest-framework/commit/d6c45646edc9c6644ea159f7f786da598bc1ab66\"\u003e\u003ccode\u003ed6c4564\u003c/code\u003e\u003c/a\u003e Improve teardown of test modifying INSTALLED_APPS (\u003ca href=\"https://redirect.github.com/encode/django-rest-framework/issues/10056\"\u003e#10056\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/encode/django-rest-framework/commit/41764f1f8cfb6d40b77b58c97cf9aeaab57c6b5c\"\u003e\u003ccode\u003e41764f1\u003c/code\u003e\u003c/a\u003e Bump codecov/codecov-action in the github-actions group (\u003ca href=\"https://redirect.github.com/encode/django-rest-framework/issues/10058\"\u003e#10058\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/encode/django-rest-framework/compare/3.18.1...3.18.3\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `ruff` from 0.16.8 to 0.16.10\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/astral-sh/ruff/releases\"\u003eruff's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e0.16.10\u003c/h2\u003e\n\u003ch2\u003eRelease Notes\u003c/h2\u003e\n\u003cp\u003eReleased on 2026-10-01.\u003c/p\u003e\n\u003ch3\u003ePreview features\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAdd a migration guide for categories (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28087\"\u003e#28087\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e[\u003ccode\u003epyupgrade\u003c/code\u003e] Add rule for context manager iterator annotations (\u003ccode\u003eUP052\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29000\"\u003e#29000\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003ePerformance\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eReduce memory used by diagnostics (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28951\"\u003e#28951\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eServer\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAvoid running \u003ccode\u003euv format\u003c/code\u003e in untrusted workspaces (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28873\"\u003e#28873\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eDocumentation\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eFix links to moved changelog sections and renamed mdtests (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28941\"\u003e#28941\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd Python 3.15 as a supported version (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28907\"\u003e#28907\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd ty as a type checker example (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28906\"\u003e#28906\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eOther changes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eUpdate Rust toolchain to 1.99 and MSRV to 1.97 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29047\"\u003e#29047\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eContributors\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/ntBre\"\u003e\u003ccode\u003e@​ntBre\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/spaceone\"\u003e\u003ccode\u003e@​spaceone\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HardMax71\"\u003e\u003ccode\u003e@​HardMax71\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/charliermarsh\"\u003e\u003ccode\u003e@​charliermarsh\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eInstall ruff 0.16.10\u003c/h2\u003e\n\u003ch3\u003eInstall prebuilt binaries via shell script\u003c/h3\u003e\n\u003cpre lang=\"sh\"\u003e\u003ccode\u003ecurl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/ruff/releases/download/0.16.10/ruff-installer.sh | sh\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch3\u003eInstall prebuilt binaries via powershell script\u003c/h3\u003e\n\u003cpre lang=\"sh\"\u003e\u003ccode\u003epowershell -ExecutionPolicy Bypass -c \u0026quot;irm https://releases.astral.sh/github/ruff/releases/download/0.16.10/ruff-installer.ps1 | iex\u0026quot;\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2\u003eDownload ruff 0.16.10\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/astral-sh/ruff/blob/0.16.10/CHANGELOG.md\"\u003eruff's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e0.16.10\u003c/h2\u003e\n\u003cp\u003eReleased on 2026-10-01.\u003c/p\u003e\n\u003ch3\u003ePreview features\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAdd a migration guide for categories (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28087\"\u003e#28087\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e[\u003ccode\u003epyupgrade\u003c/code\u003e] Add rule for context manager iterator annotations (\u003ccode\u003eUP052\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29000\"\u003e#29000\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003ePerformance\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eReduce memory used by diagnostics (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28951\"\u003e#28951\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eServer\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAvoid running \u003ccode\u003euv format\u003c/code\u003e in untrusted workspaces (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28873\"\u003e#28873\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eDocumentation\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eFix links to moved changelog sections and renamed mdtests (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28941\"\u003e#28941\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd Python 3.15 as a supported version (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28907\"\u003e#28907\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd ty as a type checker example (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28906\"\u003e#28906\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eOther changes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eUpdate Rust toolchain to 1.99 and MSRV to 1.97 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29047\"\u003e#29047\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eContributors\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/ntBre\"\u003e\u003ccode\u003e@​ntBre\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/spaceone\"\u003e\u003ccode\u003e@​spaceone\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HardMax71\"\u003e\u003ccode\u003e@​HardMax71\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/charliermarsh\"\u003e\u003ccode\u003e@​charliermarsh\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e0.16.9\u003c/h2\u003e\n\u003cp\u003eReleased on 2026-09-24.\u003c/p\u003e\n\u003ch3\u003ePreview features\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e[\u003ccode\u003eruff\u003c/code\u003e] Avoid false positives for overloaded division (\u003ccode\u003eRUF069\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28309\"\u003e#28309\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eBug fixes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e[\u003ccode\u003eflake8-bugbear\u003c/code\u003e] Avoid false positives for calls with keyword arguments (\u003ccode\u003eB009\u003c/code\u003e, \u003ccode\u003eB010\u003c/code\u003e, \u003ccode\u003eB043\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28776\"\u003e#28776\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e[\u003ccode\u003eflake8-tidy-imports\u003c/code\u003e] Allow lazy imports to be used in deferred annotations (\u003ccode\u003eTID255\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28767\"\u003e#28767\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eRule changes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eUpdate LibCST-based fixes for Python 3.15 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28616\"\u003e#28616\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/3265ed1f944c98bb4c04d632fbefb1257cdb583d\"\u003e\u003ccode\u003e3265ed1\u003c/code\u003e\u003c/a\u003e Bump version to 0.16.10 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/29055\"\u003e#29055\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/e786964450e75d904c288a1e59ae2b196d0b9c47\"\u003e\u003ccode\u003ee786964\u003c/code\u003e\u003c/a\u003e Authorize shared PR security-review workflow to publish findings (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/29052\"\u003e#29052\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/a81291e9db2f67039d159e7490b988e6c25c7a0f\"\u003e\u003ccode\u003ea81291e\u003c/code\u003e\u003c/a\u003e [ty] Defer uv workspace discovery until after project configuration (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/28525\"\u003e#28525\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/b6a74d26cbe6b45b3eb2992041714461bd4ceb5b\"\u003e\u003ccode\u003eb6a74d2\u003c/code\u003e\u003c/a\u003e [ty] Refresh uv project metadata when uv files change (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/28529\"\u003e#28529\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/41d30df6fdbe215390b3acb46e8cd4017f65580d\"\u003e\u003ccode\u003e41d30df\u003c/code\u003e\u003c/a\u003e Update Rust toolchain to 1.99 and MSRV to 1.97 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/29047\"\u003e#29047\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/317e0a3ab75878eba6e3b78c57f73d47108e2a8e\"\u003e\u003ccode\u003e317e0a3\u003c/code\u003e\u003c/a\u003e [ty] Bound nested callable signature display (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/29049\"\u003e#29049\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/8546752d9d5dac8da78c8abba380600cfe573874\"\u003e\u003ccode\u003e8546752\u003c/code\u003e\u003c/a\u003e [ty] Fix member lookup on union-bounded type variables (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/29018\"\u003e#29018\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/56180bcf800d6e45fb1c4b4113e97501b8f128c5\"\u003e\u003ccode\u003e56180bc\u003c/code\u003e\u003c/a\u003e [ty] Specialize instance members once (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/29043\"\u003e#29043\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/aa9a1ff88aa83b3f01360ef5b3cb04b2be187206\"\u003e\u003ccode\u003eaa9a1ff\u003c/code\u003e\u003c/a\u003e [ty] Avoid stale I/O diagnostics when closing deleted files (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/28988\"\u003e#28988\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/2d253467b5153f82d26c51d49eb8d4156f1768bf\"\u003e\u003ccode\u003e2d25346\u003c/code\u003e\u003c/a\u003e [ty] Improve \u003ccode\u003eunresolved-import\u003c/code\u003e documentation (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/29039\"\u003e#29039\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/astral-sh/ruff/compare/0.16.8...0.16.10\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `sentry-sdk` from 2.69.2 to 2.71.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/getsentry/sentry-python/releases\"\u003esentry-sdk's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e2.71.0\u003c/h2\u003e\n\u003ch3\u003eNew Features ✨\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eNew integration:\u003c/strong\u003e TypeSafe (\u003ca href=\"https://redirect.github.com/getsentry/sentry-python/issues/4733\"\u003e#4733\u003c/a\u003e) by \u003ca href=\"https://github.com/alexander-alderman-webb\"\u003e\u003ccode\u003e@​alexander-alderman-webb\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eAdd the TypeSafe integration to your \u003ccode\u003esentry_sdk.init\u003c/code\u003e call:\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre lang=\"python\"\u003e\u003ccode\u003eimport sentry_sdk\nfrom sentry_sdk.integrations.typesafe import TypeSafeIntegration\n\u003cp\u003esentry_sdk.init(\u003cbr /\u003e\ndsn=\u0026quot;...\u0026quot;,\u003cbr /\u003e\ntraces_sample_rate=1.0,\u003cbr /\u003e\nintegrations=[\u003cbr /\u003e\nTypeSafeIntegration(),\u003cbr /\u003e\n]\u003cbr /\u003e\n)\u003cbr /\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\n\u003ch4\u003eTypesafe\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eRecord \u003ccode\u003egen_ai.output.messages\u003c/code\u003e by \u003ca href=\"https://github.com/alexander-alderman-webb\"\u003e\u003ccode\u003e@​alexander-alderman-webb\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7720\"\u003e#7720\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eSet token usage attributes by \u003ca href=\"https://github.com/alexander-alderman-webb\"\u003e\u003ccode\u003e@​alexander-alderman-webb\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7719\"\u003e#7719\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRecord \u003ccode\u003egen_ai.input.messages\u003c/code\u003e by \u003ca href=\"https://github.com/alexander-alderman-webb\"\u003e\u003ccode\u003e@​alexander-alderman-webb\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7718\"\u003e#7718\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRecord \u003ccode\u003egen_ai.response.model\u003c/code\u003e by \u003ca href=\"https://github.com/alexander-alderman-webb\"\u003e\u003ccode\u003e@​alexander-alderman-webb\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7717\"\u003e#7717\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdd integration with \u003ccode\u003esystem_one()\u003c/code\u003e patches by \u003ca href=\"https://github.com/alexander-alderman-webb\"\u003e\u003ccode\u003e@​alexander-alderman-webb\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7716\"\u003e#7716\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eBug Fixes 🐛\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eKeep event if processor raises by \u003ca href=\"https://github.com/sentrivana\"\u003e\u003ccode\u003e@​sentrivana\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7701\"\u003e#7701\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eIsolate user callbacks, emit client reports by \u003ca href=\"https://github.com/sentrivana\"\u003e\u003ccode\u003e@​sentrivana\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7692\"\u003e#7692\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eDocumentation 📚\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003ePromote \u003ccode\u003edata_collection\u003c/code\u003e in changelog by \u003ca href=\"https://github.com/sentrivana\"\u003e\u003ccode\u003e@​sentrivana\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7565\"\u003e#7565\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eInternal Changes 🔧\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e(aws-lambda) Add \u003ccode\u003e.gitignore\u003c/code\u003e to lambda handlers by \u003ca href=\"https://github.com/pabloDeputter\"\u003e\u003ccode\u003e@​pabloDeputter\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7638\"\u003e#7638\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e(litellm) Set \u003ccode\u003eLITELLM_LOCAL_MODEL_COST_MAP=true\u003c/code\u003e by \u003ca href=\"https://github.com/alexander-alderman-webb\"\u003e\u003ccode\u003e@​alexander-alderman-webb\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7630\"\u003e#7630\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e(otlp) Adjust to \u003ccode\u003eOTLPSpanExporter._headers\u003c/code\u003e removal by \u003ca href=\"https://github.com/alexander-alderman-webb\"\u003e\u003ccode\u003e@​alexander-alderman-webb\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7722\"\u003e#7722\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUse top-level flush API in tests by \u003ca href=\"https://github.com/sentrivana\"\u003e\u003ccode\u003e@​sentrivana\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7725\"\u003e#7725\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUnsample on sampler exception by \u003ca href=\"https://github.com/sentrivana\"\u003e\u003ccode\u003e@​sentrivana\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7723\"\u003e#7723\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUse \u003ccode\u003esentry_init\u003c/code\u003e fixture by \u003ca href=\"https://github.com/sentrivana\"\u003e\u003ccode\u003e@​sentrivana\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7577\"\u003e#7577\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e2.70.0\u003c/h2\u003e\n\u003ch3\u003eNew Features ✨\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eNew integration:\u003c/strong\u003e Mistral AI (\u003ca href=\"https://redirect.github.com/getsentry/sentry-python/issues/4733\"\u003e#4733\u003c/a\u003e) by \u003ca href=\"https://github.com/alexander-alderman-webb\"\u003e\u003ccode\u003e@​alexander-alderman-webb\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/getsentry/sentry-python/blob/master/CHANGELOG.md\"\u003esentry-sdk's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e2.71.0\u003c/h2\u003e\n\u003ch3\u003eNew Features ✨\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eNew integration:\u003c/strong\u003e TypeSafe (\u003ca href=\"https://redirect.github.com/getsentry/sentry-python/issues/4733\"\u003e#4733\u003c/a\u003e) by \u003ca href=\"https://github.com/alexander-alderman-webb\"\u003e\u003ccode\u003e@​alexander-alderman-webb\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eAdd the TypeSafe integration to your \u003ccode\u003esentry_sdk.init\u003c/code\u003e call:\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre lang=\"python\"\u003e\u003ccode\u003eimport sentry_sdk\nfrom sentry_sdk.integrations.typesafe import TypeSafeIntegration\n\u003cp\u003esentry_sdk.init(\u003cbr /\u003e\ndsn=\u0026quot;...\u0026quot;,\u003cbr /\u003e\ntraces_sample_rate=1.0,\u003cbr /\u003e\nintegrations=[\u003cbr /\u003e\nTypeSafeIntegration(),\u003cbr /\u003e\n]\u003cbr /\u003e\n)\u003cbr /\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\n\u003ch4\u003eTypesafe\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eRecord \u003ccode\u003egen_ai.output.messages\u003c/code\u003e by \u003ca href=\"https://github.com/alexander-alderman-webb\"\u003e\u003ccode\u003e@​alexander-alderman-webb\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7720\"\u003e#7720\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eSet token usage attributes by \u003ca href=\"https://github.com/alexander-alderman-webb\"\u003e\u003ccode\u003e@​alexander-alderman-webb\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7719\"\u003e#7719\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRecord \u003ccode\u003egen_ai.input.messages\u003c/code\u003e by \u003ca href=\"https://github.com/alexander-alderman-webb\"\u003e\u003ccode\u003e@​alexander-alderman-webb\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7718\"\u003e#7718\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRecord \u003ccode\u003egen_ai.response.model\u003c/code\u003e by \u003ca href=\"https://github.com/alexander-alderman-webb\"\u003e\u003ccode\u003e@​alexander-alderman-webb\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7717\"\u003e#7717\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdd integration with \u003ccode\u003esystem_one()\u003c/code\u003e patches by \u003ca href=\"https://github.com/alexander-alderman-webb\"\u003e\u003ccode\u003e@​alexander-alderman-webb\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7716\"\u003e#7716\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eBug Fixes 🐛\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eKeep event if processor raises by \u003ca href=\"https://github.com/sentrivana\"\u003e\u003ccode\u003e@​sentrivana\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7701\"\u003e#7701\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eIsolate user callbacks, emit client reports by \u003ca href=\"https://github.com/sentrivana\"\u003e\u003ccode\u003e@​sentrivana\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7692\"\u003e#7692\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eDocumentation 📚\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003ePromote \u003ccode\u003edata_collection\u003c/code\u003e in changelog by \u003ca href=\"https://github.com/sentrivana\"\u003e\u003ccode\u003e@​sentrivana\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7565\"\u003e#7565\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eInternal Changes 🔧\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e(aws-lambda) Add \u003ccode\u003e.gitignore\u003c/code\u003e to lambda handlers by \u003ca href=\"https://github.com/pabloDeputter\"\u003e\u003ccode\u003e@​pabloDeputter\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7638\"\u003e#7638\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e(litellm) Set \u003ccode\u003eLITELLM_LOCAL_MODEL_COST_MAP=true\u003c/code\u003e by \u003ca href=\"https://github.com/alexander-alderman-webb\"\u003e\u003ccode\u003e@​alexander-alderman-webb\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7630\"\u003e#7630\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e(otlp) Adjust to \u003ccode\u003eOTLPSpanExporter._headers\u003c/code\u003e removal by \u003ca href=\"https://github.com/alexander-alderman-webb\"\u003e\u003ccode\u003e@​alexander-alderman-webb\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7722\"\u003e#7722\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUse top-level flush API in tests by \u003ca href=\"https://github.com/sentrivana\"\u003e\u003ccode\u003e@​sentrivana\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7725\"\u003e#7725\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUnsample on sampler exception by \u003ca href=\"https://github.com/sentrivana\"\u003e\u003ccode\u003e@​sentrivana\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7723\"\u003e#7723\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUse \u003ccode\u003esentry_init\u003c/code\u003e fixture by \u003ca href=\"https://github.com/sentrivana\"\u003e\u003ccode\u003e@​sentrivana\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7577\"\u003e#7577\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e2.70.0\u003c/h2\u003e\n\u003ch3\u003eNew Features ✨\u003c/h3\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/getsentry/sentry-python/commit/7d0255842d0cc41fcb5a80ef172ab164719fbb8b\"\u003e\u003ccode\u003e7d02558\u003c/code\u003e\u003c/a\u003e Update CHANGELOG.md\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/getsentry/sentry-python/commit/e69596f8e1a37add1c54312522562099e182d88b\"\u003e\u003ccode\u003ee69596f\u003c/code\u003e\u003c/a\u003e release: 2.71.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/getsentry/sentry-python/commit/dfc004a02b509525b944b3c1935711c54ca2efa5\"\u003e\u003ccode\u003edfc004a\u003c/code\u003e\u003c/a\u003e feat(typesafe): Record \u003ccode\u003egen_ai.output.messages\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/getsentry/sentry-python/issues/7720\"\u003e#7720\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/getsentry/sentry-python/commit/d36887ba62915c0993bdc13fb7b2077a2983a42d\"\u003e\u003ccode\u003ed36887b\u003c/code\u003e\u003c/a\u003e feat(typesafe): Record token usage (\u003ca href=\"https://redirect.github.com/getsentry/sentry-python/issues/7719\"\u003e#7719\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/getsentry/sentry-python/commit/166b85aa1ed5afb1ab99ba3981f612063f75e2cf\"\u003e\u003ccode\u003e166b85a\u003c/code\u003e\u003c/a\u003e feat(typesafe): Record \u003ccode\u003egen_ai.input.messages\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/getsentry/sentry-python/issues/7718\"\u003e#7718\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/getsentry/sentry-python/commit/1bef56530f0b9ae452238d1535041433d30b162a\"\u003e\u003ccode\u003e1bef565\u003c/code\u003e\u003c/a\u003e chore: Use top-level flush API in tests (\u003ca href=\"https://redirect.github.com/getsentry/sentry-python/issues/7725\"\u003e#7725\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/getsentry/sentry-python/commit/38a946b6420832df313a9ddd7eff38987164915c\"\u003e\u003ccode\u003e38a946b\u003c/code\u003e\u003c/a\u003e feat(typesafe): Record \u003ccode\u003egen_ai.response.model\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/getsentry/sentry-python/issues/7717\"\u003e#7717\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/getsentry/sentry-python/commit/cd3866dfb8cf94423a8bb5477acfe34afa854231\"\u003e\u003ccode\u003ecd3866d\u003c/code\u003e\u003c/a\u003e feat(typesafe): Add integration with \u003ccode\u003esystem_one()\u003c/code\u003e patches (\u003ca href=\"https://redirect.github.com/getsentry/sentry-python/issues/7716\"\u003e#7716\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/getsentry/sentry-python/commit/bd08efd4a5d50d27b0354fb96e6a369cacc2d5b8\"\u003e\u003ccode\u003ebd08efd\u003c/code\u003e\u003c/a\u003e ref: Unsample on sampler exception (\u003ca href=\"https://redirect.github.com/getsentry/sentry-python/issues/7723\"\u003e#7723\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/getsentry/sentry-python/commit/ff7d0b26664d1ae39b5428afd5cd05fbfab4a2a1\"\u003e\u003ccode\u003eff7d0b2\u003c/code\u003e\u003c/a\u003e test(otlp): Adjust to \u003ccode\u003eOTLPSpanExporter._headers\u003c/code\u003e removal (\u003ca href=\"https://redirect.github.com/getsentry/sentry-python/issues/7722\"\u003e#7722\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/getsentry/sentry-python/compare/2.69.2...2.71.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `django-otp` from 1.7.3 to 1.7.4\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/django-otp/django-otp/blob/master/CHANGES.rst\"\u003edjango-otp's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev1.7.4 - October 08, 2026 - Form improvement\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e[#194](https://github.com/django-otp/django-otp/issues/194)\u003c/code\u003e_: Fix otp_device select silently defaulting to a device instead of\nrequiring an explicit choice (Varun Juneja)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e.. _\u003ca href=\"https://redirect.github.com/django-otp/django-otp/issues/194\"\u003e#194\u003c/a\u003e: \u003ca href=\"https://redirect.github.com/django-otp/django-otp/pull/194\"\u003edjango-otp/django-otp#194\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/django-otp/django-otp/commit/fe33c51bcc3828f954431cc3bb5b6d746918fac0\"\u003e\u003ccode\u003efe33c51\u003c/code\u003e\u003c/a\u003e Version 1.7.4\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/django-otp/django-otp/commit/8cd450040058d34df6d7913a5d82abe7ef3aa3b4\"\u003e\u003ccode\u003e8cd4500\u003c/code\u003e\u003c/a\u003e Fix \u003ca href=\"https://redirect.github.com/django-otp/django-otp/issues/193\"\u003e#193\u003c/a\u003e: give the otp_device select a blank default so it can't silently pic...\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/django-otp/django-otp/compare/v1.7.3...v1.7.4\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `cryptography` from 50.0.1 to 50.0.2\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst\"\u003ecryptography's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e50.0.2 - 2026-09-30\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e\n* Updated Windows, macOS, and Linux wheels to be compiled with OpenSSL 4.0.3.\n* Added ``abi3.abi3t`` wheels for free-threaded CPython 3.15 and later.\n* Updated to PyO3 0.29.2, which fixes building ``cryptography`` on Cygwin and\n  MSYS2.\n\u003cp\u003e.. _v50-0-1:\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pyca/cryptography/commit/4dda5c7fe4ae71b8925f2551910a0ef959df9c7a\"\u003e\u003ccode\u003e4dda5c7\u003c/code\u003e\u003c/a\u003e [50.0.x] Bump for 50.0.2 release + changelog (\u003ca href=\"https://redirect.github.com/pyca/cryptography/issues/15733\"\u003e#15733\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pyca/cryptography/commit/70c881cd7ea97d38df09f57c1117470cd1a5a2f7\"\u003e\u003ccode\u003e70c881c\u003c/code\u003e\u003c/a\u003e [50.0.x] Bump pyo3 to 0.29.2 (\u003ca href=\"https://redirect.github.com/pyca/cryptography/issues/15731\"\u003e#15731\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pyca/cryptography/commit/a8c45c449b8d29908a14561afd45fee8bf27d044\"\u003e\u003ccode\u003ea8c45c4\u003c/code\u003e\u003c/a\u003e [50.0.x] Build abi3.abi3t wheels for CPython 3.15+ (\u003ca href=\"https://redirect.github.com/pyca/cryptography/issues/15496\"\u003e#15496\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/pyca/cryptography/issues/15732\"\u003e#15732\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/pyca/cryptography/compare/50.0.1...50.0.2\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `pypdf` from 6.19.0 to 6.20.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/py-pdf/pypdf/releases\"\u003epypdf's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003eVersion 6.20.0, 2026-10-09\u003c/h2\u003e\n\u003ch2\u003eWhat's new\u003c/h2\u003e\n\u003ch3\u003eSecurity (SEC)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eLimit work per stream (filter count, accumulated decoding work) (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4173\"\u003e#4173\u003c/a\u003e) by \u003ca href=\"https://github.com/stefan6419846\"\u003e\u003ccode\u003e@​stefan6419846\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eNew Features (ENH)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAdd support for BrotliDecode filter (PDF 2.0) (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4168\"\u003e#4168\u003c/a\u003e) by \u003ca href=\"https://github.com/stefan6419846\"\u003e\u003ccode\u003e@​stefan6419846\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003ePerformance Improvements (PI)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eParse an embedded CFF font program once per stream (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4164\"\u003e#4164\u003c/a\u003e) by \u003ca href=\"https://github.com/marshalltech81\"\u003e\u003ccode\u003e@​marshalltech81\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eParse numbers, indirect references, names and nulls faster (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4148\"\u003e#4148\u003c/a\u003e) by \u003ca href=\"https://github.com/MartinThoma\"\u003e\u003ccode\u003e@​MartinThoma\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eDo not inherit PdfObject from a Protocol (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4149\"\u003e#4149\u003c/a\u003e) by \u003ca href=\"https://github.com/MartinThoma\"\u003e\u003ccode\u003e@​MartinThoma\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eSpeed up cloning direct objects (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4152\"\u003e#4152\u003c/a\u003e) by \u003ca href=\"https://github.com/MartinThoma\"\u003e\u003ccode\u003e@​MartinThoma\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eBug Fixes (BUG)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eReport the correct page number for identical pages (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4154\"\u003e#4154\u003c/a\u003e) by \u003ca href=\"https://github.com/pasmud\"\u003e\u003ccode\u003e@​pasmud\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eDecrypt the XMP metadata stream unless /EncryptMetadata is false (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4151\"\u003e#4151\u003c/a\u003e) by \u003ca href=\"https://github.com/metsw24-max\"\u003e\u003ccode\u003e@​metsw24-max\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eRobustness (ROB)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eMultiple changes by \u003ca href=\"https://github.com/RavSinghChandan\"\u003e\u003ccode\u003e@​RavSinghChandan\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAccept an %%EOF marker that is not at the start of a line (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4136\"\u003e#4136\u003c/a\u003e) by \u003ca href=\"https://github.com/Dmao233\"\u003e\u003ccode\u003e@​Dmao233\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFont / _cmapy.py: More robust guards around fontTools (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4157\"\u003e#4157\u003c/a\u003e) by \u003ca href=\"https://github.com/PJBrs\"\u003e\u003ccode\u003e@​PJBrs\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFlatten the page tree iteratively (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4107\"\u003e#4107\u003c/a\u003e) by \u003ca href=\"https://github.com/MartinThoma\"\u003e\u003ccode\u003e@​MartinThoma\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eIgnore invalid character codes for TrueType and Type1 font widths (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4117\"\u003e#4117\u003c/a\u003e) by \u003ca href=\"https://github.com/stefan6419846\"\u003e\u003ccode\u003e@​stefan6419846\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRestrict values to allowed range in CCITTFaxDecode (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4115\"\u003e#4115\u003c/a\u003e) by \u003ca href=\"https://github.com/stefan6419846\"\u003e\u003ccode\u003e@​stefan6419846\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eDrop a /Kids entry resolving to null instead of raising a cycle error (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4108\"\u003e#4108\u003c/a\u003e) by \u003ca href=\"https://github.com/MartinThoma\"\u003e\u003ccode\u003e@​MartinThoma\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eDeveloper Experience (DEV)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eDeclare official support for Python 3.15 by \u003ca href=\"https://github.com/stefan6419846\"\u003e\u003ccode\u003e@​stefan6419846\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eDeclare protocol data members on PdfReader and PdfWriter (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4106\"\u003e#4106\u003c/a\u003e) by \u003ca href=\"https://github.com/ihsandeniz\"\u003e\u003ccode\u003e@​ihsandeniz\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/py-pdf/pypdf/compare/6.19.0...6.20.0\"\u003eFull Changelog\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/py-pdf/pypdf/blob/main/CHANGELOG.md\"\u003epypdf's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003eVersion 6.20.0, 2026-10-09\u003c/h2\u003e\n\u003ch3\u003eSecurity (SEC)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eLimit work per stream (filter count, accumulated decoding work) (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4173\"\u003e#4173\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eNew Features (ENH)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAdd support for BrotliDecode filter (PDF 2.0) (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4168\"\u003e#4168\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003ePerformance Improvements (PI)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eParse an embedded CFF font program once per stream (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4164\"\u003e#4164\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eParse numbers, indirect references, names and nulls faster (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4148\"\u003e#4148\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eDo not inherit PdfObject from a Protocol (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4149\"\u003e#4149\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSpeed up cloning direct objects (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4152\"\u003e#4152\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eBug Fixes (BUG)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eReport the correct page number for identical pages (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4154\"\u003e#4154\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eDecrypt the XMP metadata stream unless /EncryptMetadata is false (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4151\"\u003e#4151\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eRobustness (ROB)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAccept an %%EOF marker that is not at the start of a line (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4136\"\u003e#4136\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFont / _cmapy.py: More robust guards around fontTools (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4157\"\u003e#4157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFlatten the page tree iteratively (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4107\"\u003e#4107\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eIgnore invalid character codes for TrueType and Type1 font widths (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4117\"\u003e#4117\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eRestrict values to allowed range in CCITTFaxDecode (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4115\"\u003e#4115\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eDrop a /Kids entry resolving to null instead of raising a cycle error (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4108\"\u003e#4108\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eDeveloper Experience (DEV)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eDeclare official support for Python 3.15\u003c/li\u003e\n\u003cli\u003eDeclare protocol data members on PdfReader and PdfWriter (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4106\"\u003e#4106\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/py-pdf/pypdf/compare/6.19.0...6.20.0\"\u003eFull Changelog\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/py-pdf/pypdf/commit/0309ab701a192fbd3228701a44dd009765a1629b\"\u003e\u003ccode\u003e0309ab7\u003c/code\u003e\u003c/a\u003e REL: 6.20.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/py-pdf/pypdf/commit/80a84d4be6022d910874ccb0d2365400f3f0e185\"\u003e\u003ccode\u003e80a84d4\u003c/code\u003e\u003c/a\u003e SEC: Limit work per stream (filter count, accumulated decoding work) (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4173\"\u003e#4173\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/py-pdf/pypdf/commit/4c20fa800a561c2776bf000d3c5d05dada2fac96\"\u003e\u003ccode\u003e4c20fa8\u003c/code\u003e\u003c/a\u003e DEV: Declare official support for Python 3.15\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/py-pdf/pypdf/commit/c64a4e4a73c8464fa24f7cd43e039aebfcc8cafb\"\u003e\u003ccode\u003ec64a4e4\u003c/code\u003e\u003c/a\u003e ROB: Skip a Tj operator whose operand is not a string (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4171\"\u003e#4171\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/py-pdf/pypdf/commit/4714175aabdad4a5956eb2a70902dc09b7f6b15e\"\u003e\u003ccode\u003e4714175\u003c/code\u003e\u003c/a\u003e MAINT: Fix A001 (Variable is shadowing a Python builtin) (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4167\"\u003e#4167\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/py-pdf/pypdf/commit/921d77833e58d2c52699a39ae38f7da4bb28491e\"\u003e\u003ccode\u003e921d778\u003c/code\u003e\u003c/a\u003e ROB: Accept an %%EOF marker that is not at the start of a line (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4136\"\u003e#4136\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/py-pdf/pypdf/commit/1a6b0502e26d2430b6370f8ebf7a647ba2623a4f\"\u003e\u003ccode\u003e1a6b050\u003c/code\u003e\u003c/a\u003e ROB: Skip a TJ operator whose operand is not an array (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4166\"\u003e#4166\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/py-pdf/pypdf/commit/5b6a77a3dae3dc0521ca265176cb9e1cd2097d2e\"\u003e\u003ccode\u003e5b6a77a\u003c/code\u003e\u003c/a\u003e PI: Parse an embedded CFF font program once per stream (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4164\"\u003e#4164\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/py-pdf/pypdf/commit/79423c1288cbbb4a16bf0601b3539797f6900bb3\"\u003e\u003ccode\u003e79423c1\u003c/code\u003e\u003c/a\u003e PI: Parse numbers, indirect references, names and nulls faster (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4148\"\u003e#4148\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/py-pdf/pypdf/commit/37e1cd681744bac38b159f7e1c614eee8d639c58\"\u003e\u003ccode\u003e37e1cd6\u003c/code\u003e\u003c/a\u003e ROB: Handle EOF when reading standard xref table (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4170\"\u003e#4170\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/py-pdf/pypdf/compare/6.19.0...6.20.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `black` from 26.5.1 to 26.10.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/psf/black/releases\"\u003eblack's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e26.10.0\u003c/h2\u003e\n\u003ch3\u003eStable style\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e--line-ranges\u003c/code\u003e no longer inserts an empty line after a docstring when the range\ncovers only the docstring itself (\u003ca href=\"https://redirect.github.com/psf/black/issues/5312\"\u003e#5312\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix \u003ccode\u003e# fmt: skip\u003c/code\u003e on a bracketed ternary turning the surrounding tuple into a call\n(\u003ca href=\"https://redirect.github.com/psf/black/issues/5464\"\u003e#5464\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix crash when \u003ccode\u003e# fmt: skip\u003c/code\u003e is placed on a one-line function or class with PEP 695\ntype parameters (\u003ca href=\"https://redirect.github.com/psf/black/issues/5429\"\u003e#5429\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix an inline comment after the closing bracket of optional parentheses being moved\ninside the parentheses when the parenthesized expression contains own-line comments\n(\u003ca href=\"https://redirect.github.com/psf/black/issues/5395\"\u003e#5395\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix unparseable output when \u003ccode\u003e# fmt: skip\u003c/code\u003e is placed on a bracket of an \u003ccode\u003eif\u003c/code\u003e, \u003ccode\u003ewhile\u003c/code\u003e,\n\u003ccode\u003efor\u003c/code\u003e, or \u003ccode\u003ewith\u003c/code\u003e header (\u003ca href=\"https://redirect.github.com/psf/black/issues/5401\"\u003e#5401\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/psf/black/issues/5405\"\u003e#5405\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix crash when formatting parenthesized expressions with multiple inline comments and\n\u003ccode\u003e# fmt: skip\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/psf/black/issues/5414\"\u003e#5414\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix parsing Jupyter notebook assignment magics when non-ASCII characters appear\nearlier on the line (\u003ca href=\"https://redirect.github.com/psf/black/issues/5381\"\u003e#5381\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ePreserve blank lines that come immediately before a \u003ccode\u003e# fmt: on\u003c/code\u003e comment (\u003ca href=\"https://redirect.github.com/psf/black/issues/5300\"\u003e#5300\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eKeep the parentheses around the target of an annotated assignment (e.g.\n\u003ccode\u003e(x): int = 5\u003c/code\u003e), which prevent CPython from including the name in \u003ccode\u003e__annotations__\u003c/code\u003e\n(\u003ca href=\"https://redirect.github.com/psf/black/issues/5321\"\u003e#5321\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eStop treating a t-string in docstring position as a docstring (e.g. \u003ccode\u003et\u0026quot;  spam  \u0026quot;\u003c/code\u003e as\nthe first statement of a module, class or function) (\u003ca href=\"https://redirect.github.com/psf/black/issues/5287\"\u003e#5287\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix unparseable output for a t-string whose replacement field contains a quote (e.g.\n\u003ccode\u003et'\\'{a[\u0026quot;b\u0026quot;]}\\''\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/psf/black/issues/5265\"\u003e#5265\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix unparseable output for a triple-quoted string whose body ends in an\nalready-escaped double quote (e.g. \u003ccode\u003e'''\\'''\\\u0026quot;'''\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/psf/black/issues/5262\"\u003e#5262\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix \u003ccode\u003e--skip-magic-trailing-comma\u003c/code\u003e dropping the trailing comma from a split\nsingle-element tuple used as a lambda parameter default (\u003ca href=\"https://redirect.github.com/psf/black/issues/5246\"\u003e#5246\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix unstable formatting when an inline comment sits on optional parentheses (e.g. a\nparenthesized assert message) (\u003ca href=\"https://redirect.github.com/psf/black/issues/5241\"\u003e#5241\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix \u003ccode\u003e--skip-magic-trailing-comma\u003c/code\u003e dropping the trailing comma of a one-element\nsubscript (\u003ccode\u003ea[x,]\u003c/code\u003e) when the line is long enough to be split and contains a power\noperator (\u003ca href=\"https://redirect.github.com/psf/black/issues/5272\"\u003e#5272\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix crash when a standalone comment sits between tokens of a comprehension or lambda\n(\u003ca href=\"https://redirect.github.com/psf/black/issues/5144\"\u003e#5144\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix inline comments on a bracket inside a comprehension being dropped (\u003ca href=\"https://redirect.github.com/psf/black/issues/5330\"\u003e#5330\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eRespect the magic trailing comma in a PEP 695 type parameter list containing a\n\u003ccode\u003e*TypeVarTuple\u003c/code\u003e or \u003ccode\u003e**ParamSpec\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/psf/black/issues/5244\"\u003e#5244\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix crash when a comment-only \u003ccode\u003e# fmt: off\u003c/code\u003e/\u003ccode\u003e# fmt: on\u003c/code\u003e block is followed by a \u003ccode\u003ewith\u003c/code\u003e\nstatement after another standalone comment (\u003ca href=\"https://redirect.github.com/psf/black/issues/5189\"\u003e#5189\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix a crash when splitting \u003ccode\u003ecase case if ...\u003c/code\u003e match patterns at very small line\nlengths (\u003ca href=\"https://redirect.github.com/psf/black/issues/5147\"\u003e#5147\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix multiline docstring indentation when leading tabs are used inside indented\ndocstrings (\u003ca href=\"https://redirect.github.com/psf/black/issues/5148\"\u003e#5148\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eRespect \u003ccode\u003e# fmt: skip\u003c/code\u003e on a line that opens a bracket (e.g.\n\u003ccode\u003efrom x import (  # fmt: skip\u003c/code\u003e) when a standalone comment is among the bracket's\ncontents (\u003ca href=\"https://redirect.github.com/psf/black/issues/5161\"\u003e#5161\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix an AST safety error when separate \u003ccode\u003e# type: ignore\u003c/code\u003e comments in a parenthesized\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/psf/black/blob/main/CHANGES.md\"\u003eblack's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003eVersion 26.10.0\u003c/h2\u003e\n\u003ch3\u003eStable style\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e--line-ranges\u003c/code\u003e no longer inserts an empty line after a docstring when the range\ncovers only the docstring itself (\u003ca href=\"https://redirect.github.com/psf/black/issues/5312\"\u003e#5312\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix \u003ccode\u003e# fmt: skip\u003c/code\u003e on a bracketed ternary turning the surrounding tuple into a call\n(\u003ca href=\"https://redirect.github.com/psf/black/issues/5464\"\u003e#5464\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix crash when \u003ccode\u003e# fmt: skip\u003c/code\u003e is placed on a one-line function or class with PEP 695\ntype parameters (\u003ca href=\"https://redirect.github.com/psf/black/issues/5429\"\u003e#5429\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix an inline comment after the closing bracket of optional parentheses being moved\ninside the parentheses when the parenthesized expression contains own-line comments\n(\u003ca href=\"https://redirect.github.com/psf/black/issues/5395\"\u003e#5395\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix unparseable output when \u003ccode\u003e# fmt: skip\u003c/code\u003e is placed on a bracket of an \u003ccode\u003eif\u003c/code\u003e, \u003ccode\u003ewhile\u003c/code\u003e,\n\u003ccode\u003efor\u003c/code\u003e, or \u003ccode\u003ewith\u003c/code\u003e header (\u003ca href=\"https://redirect.github.com/psf/black/issues/5401\"\u003e#5401\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/psf/black/issues/5405\"\u003e#5405\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix crash when formatting parenthesized expressions with multiple inline comments and\n\u003ccode\u003e# fmt: skip\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/psf/black/issues/5414\"\u003e#5414\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix parsing Jupyter notebook assignment magics when non-ASCII characters appear\nearlier on the line (\u003ca href=\"https://redirect.github.com/psf/black/issues/5381\"\u003e#5381\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ePreserve blank lines that come immediately before a \u003ccode\u003e# fmt: on\u003c/code\u003e comment (\u003ca href=\"https://redirect.github.com/psf/black/issues/5300\"\u003e#5300\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eKeep the parentheses around the target of an annotated assignment (e.g.\n\u003ccode\u003e(x): int = 5\u003c/code\u003e), which prevent CPython from including the name in \u003ccode\u003e__annotations__\u003c/code\u003e\n(\u003ca href=\"https://redirect.github.com/psf/black/issues/5321\"\u003e#5321\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eStop treating a t-string in docstring position as a docstring (e.g. \u003ccode\u003et\u0026quot;  spam  \u0026quot;\u003c/code\u003e as\nthe first statement of a module, class or function) (\u003ca href=\"https://redirect.github.com/psf/black/issues/5287\"\u003e#5287\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix unparseable output for a t-string whose replacement field contains a quote (e.g.\n\u003ccode\u003et'\\'{a[\u0026quot;b\u0026quot;]}\\''\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/psf/black/issues/5265\"\u003e#5265\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix unparseable output for a triple-quoted string whose body ends in an\nalready-escaped double quote (e.g. \u003ccode\u003e'''\\'''\\\u0026quot;'''\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/psf/black/issues/5262\"\u003e#5262\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix \u003ccode\u003e--skip-magic-trailing-comma\u003c/code\u003e dropping the trailing comma from a split\nsingle-element tuple used as a lambda parameter default (\u003ca href=\"https://redirect.github.com/psf/black/issues/5246\"\u003e#5246\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix unstable formatting when an inline comment sits on optional parentheses (e.g. a\nparenthesized assert message) (\u003ca href=\"https://redirect.github.com/psf/black/issues/5241\"\u003e#5241\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix \u003ccode\u003e--skip-magic-trailing-comma\u003c/code\u003e dropping the trailing comma of a one-element\nsubscript (\u003ccode\u003ea[x,]\u003c/code\u003e) when the line is long enough to be split and contains a power\noperator (\u003ca href=\"https://redirect.github.com/psf/black/issues/5272\"\u003e#5272\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix crash when a standalone comment sits between tokens of a comprehension or lambda\n(\u003ca href=\"https://redirect.github.com/psf/black/issues/5144\"\u003e#5144\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix inline comments on a bracket inside a comprehension being dropped (\u003ca href=\"https://redirect.github.com/psf/black/issues/5330\"\u003e#5330\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eRespect the magic trailing comma in a PEP 695 type parameter list containing a\n\u003ccode\u003e*TypeVarTuple\u003c/code\u003e or \u003ccode\u003e**ParamSpec\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/psf/black/issues/5244\"\u003e#5244\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix crash when a comment-only \u003ccode\u003e# fmt: off\u003c/code\u003e/\u003ccode\u003e# fmt: on\u003c/code\u003e block is followed by a \u003ccode\u003ewith\u003c/code\u003e\nstatement after another standalone comment (\u003ca href=\"https://redirect.github.com/psf/black/issues/5189\"\u003e#5189\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix a crash when splitting \u003ccode\u003ecase case if ...\u003c/code\u003e match patterns at very small line\nlengths (\u003ca href=\"https://redirect.github.com/psf/black/issues/5147\"\u003e#5147\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix multiline docstring indentation when leading tabs are used inside indented\ndocstrings (\u003ca href=\"https://redirect.github.com/psf/black/issues/5148\"\u003e#5148\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eRespect \u003ccode\u003e# fmt: skip\u003c/code\u003e on a line that opens a bracket (e.g.\n\u003ccode\u003efrom x import (  # fmt: skip\u003c/code\u003e) when a standalone comment is among the bracket's\ncontents (\u003ca href=\"https://redirect.github.com/psf/black/issues/5161\"\u003e#5161\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/psf/black/commit/4f1883b1f15305a0e83a7c87991f46292bf09f85\"\u003e\u003ccode\u003e4f1883b\u003c/code\u003e\u003c/a\u003e Prepare release 26.10.0 (\u003ca href=\"https://redirect.github.com/psf/black/issues/5478\"\u003e#5478\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/psf/black/commit/93e5c8204c0340403c925a3bf7b747bf7817aaab\"\u003e\u003ccode\u003e93e5c82\u003c/code\u003e\u003c/a\u003e Do not split a docstring on non-newline characters (\u003ca href=\"https://redirect.github.com/psf/black/issues/5461\"\u003e#5461\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/psf/black/commit/2f3f992a9827e7ed7c4e68c34c35a5a34b75f4c2\"\u003e\u003ccode\u003e2f3f992\u003c/code\u003e\u003c/a\u003e Fix superlinear runtime growth with the number of input files (\u003ca href=\"https://redirect.github.com/psf/black/issues/5450\"\u003e#5450\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/psf/black/commit/d078e8eee2824b01e1c4b841f0affc273e198d35\"\u003e\u003ccode\u003ed078e8e\u003c/code\u003e\u003c/a\u003e Refactor release process to be more automated and use immutable releases (\u003ca href=\"https://redirect.github.com/psf/black/issues/5296\"\u003e#5296\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/psf/black/commit/6408e696237222d2519238f0ae637e850fd5240a\"\u003e\u003ccode\u003e6408e69\u003c/code\u003e\u003c/a\u003e Preserve leaf line numbers in append_leaves to prevent pragma line collapse (...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/psf/black/commit/cf8560b1f43014986662ab4e717da29e98b8c651\"\u003e\u003ccode\u003ecf8560b\u003c/code\u003e\u003c/a\u003e Add is_formatted output to GitHub Action (\u003ca href=\"https://redirect.github.com/psf/black/issues/3526\"\u003e#3526\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/psf/black/issues/5408\"\u003e#5408\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/psf/black/commit/9b65aa3ab5688ef64ff6f1a2bafa6618df799953\"\u003e\u003ccode\u003e9b65aa3\u003c/code\u003e\u003c/a\u003e docs(contributing): fix two grammar typos in issue_triage.md (\u003ca href=\"https://redirect.github.com/psf/black/issues/5426\"\u003e#5426\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/psf/black/commit/e1c478359c087b76a6c4830a84c7e78ac93d8a6c\"\u003e\u003ccode\u003ee1c4783\u003c/code\u003e\u003c/a\u003e Fix --force-exclude for paths containing .. (\u003ca href=\"https://redirect.github.com/psf/black/issues/5471\"\u003e#5471\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/psf/black/commit/34bfc69e57d05c6429673a445b402826695e8be5\"\u003e\u003ccode\u003e34bfc69\u003c/code\u003e\u003c/a\u003e Fix duplicated comments when string_processing rewrites a line (\u003ca href=\"https://redirect.github.com/psf/black/issues/5449\"\u003e#5449\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/psf/black/commit/5fe7881e6e40ceeed3c9e3212cbc70a040adea28\"\u003e\u003ccode\u003e5fe7881\u003c/code\u003e\u003c/a\u003e Fix preview blank lines after a stub method (\u003ca href=\"https://redirect.github.com/psf/black/issues/5439\"\u003e#5439\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/psf/black/compare/26.5.1...26.10.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `virtualenv` from 21.14.2 to 21.14.6\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pypa/virtualenv/releases\"\u003evirtualenv's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e21.14.6\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e👷 ci: pin ubuntu-26.04, clear warnings, bump deps by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3378\"\u003epypa/virtualenv#3378\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(ci): defer upgrades blocked by release age by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3379\"\u003epypa/virtualenv#3379\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eci: overlap release transfers and verification by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3382\"\u003epypa/virtualenv#3382\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(seed): guard every embed update log read, not just one by \u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3383\"\u003epypa/virtualenv#3383\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.14.5...21.14.6\"\u003ehttps://github.com/pypa/virtualenv/compare/21.14.5...21.14.6\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e21.14.5\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e🎨 style(test): mark prompt fixture locals Final by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3374\"\u003epypa/virtualenv#3374\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🎨 style: give every Final annotation its type by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3375\"\u003epypa/virtualenv#3375\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(ci): dump stacks from a thread that holds the GIL by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3377\"\u003epypa/virtualenv#3377\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eReset the embed update log when it cannot be read by \u003ca href=\"https://github.com/pasmud\"\u003e\u003ccode\u003e@​pasmud\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3376\"\u003epypa/virtualenv#3376\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.14.4...21.14.5\"\u003ehttps://github.com/pypa/virtualenv/compare/21.14.4...21.14.5\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e21.14.4\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eUpgrade embedded pip/setuptools/wheel and CI test tools by \u003ca href=\"https://github.com/github-actions\"\u003e\u003ccode\u003e@​github-actions\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3372\"\u003epypa/virtualenv#3372\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e📝 docs(changelog): note the zsh prompt fix by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3373\"\u003epypa/virtualenv#3373\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.14.3...21.14.4\"\u003ehttps://github.com/pypa/virtualenv/compare/21.14.3...21.14.4\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e21.14.3\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e✨ feat(security): add a private vulnerability report form by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3370\"\u003epypa/virtualenv#3370\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e📝 docs(changelog): link the 21.14.0 wheel-order fix to \u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3361\"\u003e#3361\u003c/a\u003e by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3371\"\u003epypa/virtualenv#3371\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eApply the whole Requires-Python specifier set in Wheel.support_py by \u003ca href=\"https://github.com/pasmud\"\u003e\u003ccode\u003e@​pasmud\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3369\"\u003epypa/virtualenv#3369\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUpgrade embedded pip/setuptools/wheel and CI test tools by \u003ca href=\"https://github.com/github-actions\"\u003e\u003ccode\u003e@​github-actions\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3368\"\u003epypa/virtualenv#3368\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.14.2...21.14.3\"\u003ehttps://github.com/pypa/virtualenv/compare/21.14.2...21.14.3\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pypa/virtualenv/blob/main/docs/changelog.rst\"\u003evirtualenv's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003eBugfixes - 21.14.6\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eFall back to the bundled seed wheel with periodic update on (the default) when the embed update log holds JSON of the\nwrong shape, instead of downloading the wheel or, offline, failing to create the environment - by :user:\u003ccode\u003edarrenhuai\u003c/code\u003e.\n(:issue:\u003ccode\u003e3383\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003ev21.14.5 (2026-10-02)\u003c/p\u003e\n\u003chr /\u003e\n\u003ch1\u003eBugfixes - 21.14.5\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eFall back to the bundled seed wheel and remove the embed update log when the log in the app data folder holds JSON of\nthe wrong shape, instead of failing to create the environment - by :user:\u003ccode\u003epasmud\u003c/code\u003e. (:issue:\u003ccode\u003e3376\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003ev21.14.4 (2026-10-02)\u003c/p\u003e\n\u003chr /\u003e\n\u003ch1\u003eBugfixes - 21.14.4\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eFix \u003ccode\u003eactivate\u003c/code\u003e running commands from a virtual environment name or \u003ccode\u003e--prompt\u003c/code\u003e that holds \u003ccode\u003e$(...)\u003c/code\u003e, backticks or\n\u003ccode\u003e${...}\u003c/code\u003e when zsh has \u003ccode\u003ePROMPT_SUBST\u003c/code\u003e set, and show a \u003ccode\u003e%\u003c/code\u003e in the name as typed under zsh (\u003ccode\u003eGHSA-5vjq-rrrf-7h2q \u0026lt;https://github.com/pypa/virtualenv/security/advisories/GHSA-5vjq-rrrf-7h2q\u0026gt;\u003c/code\u003e_); reported by :user:\u003ccode\u003ekemrec\u003c/code\u003e.\n(:issue:\u003ccode\u003e3373\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003ev21.14.3 (2026-10-01)\u003c/p\u003e\n\u003chr /\u003e\n\u003ch1\u003eBugfixes - 21.14.3\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eHonor \u003ccode\u003e~=\u003c/code\u003e and every clause of a seed wheel's \u003ccode\u003eRequires-Python\u003c/code\u003e when picking a wheel for the target Python, and\nskip a wheel whose \u003ccode\u003eRequires-Python\u003c/code\u003e is not a valid specifier instead of failing - by :user:\u003ccode\u003epasmud\u003c/code\u003e.\n(:issue:\u003ccode\u003e3369\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003ev21.14.2 (2026-10-01)\u003c/p\u003e\n\u003chr /\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/9e69ac725fd4dc83726536c084ab9ca4f099c5b6\"\u003e\u003ccode\u003e9e69ac7\u003c/code\u003e\u003c/a\u003e release 21.14.6\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/464c34b696c81190cd1ad6589158f6ce59467351\"\u003e\u003ccode\u003e464c34b\u003c/code\u003e\u003c/a\u003e 🐛 fix(seed): guard every embed update log read, not just one (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3383\"\u003e#3383\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/3f56d7f4b88884296249b83889d717c41ed6e668\"\u003e\u003ccode\u003e3f56d7f\u003c/code\u003e\u003c/a\u003e ci: overlap release transfers and verification (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3382\"\u003e#3382\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/7577efd46b0e62c5edbd803ded2788eb6d48f5ca\"\u003e\u003ccode\u003e7577efd\u003c/code\u003e\u003c/a\u003e chore(deps): bump the runtime-dependencies group with 10 updates (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3381\"\u003e#3381\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/f6d172367b48d5138fcab911ff8fdd86b4e8cdaf\"\u003e\u003ccode\u003ef6d1723\u003c/code\u003e\u003c/a\u003e [pre-commit.ci] pre-commit autoupdate (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3380\"\u003e#3380\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/7c56749d7b3065f6a99b21fd61089ba692e4aaec\"\u003e\u003ccode\u003e7c56749\u003c/code\u003e\u003c/a\u003e fix(ci): defer upgrades blocked by release age (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3379\"\u003e#3379\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/95d02526dc5f2c569767d8ee572f72f571b8a6ce\"\u003e\u003ccode\u003e95d0252\u003c/code\u003e\u003c/a\u003e 👷 ci: pin ubuntu-26.04, clear warnings, bump deps (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3378\"\u003e#3378\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/571bc2041dae5ecbd250d82ec7ef482cfd3c3b69\"\u003e\u003ccode\u003e571bc20\u003c/code\u003e\u003c/a\u003e release 21.14.5\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/5b9b7de4f2f850d94deec4d5a9764e7b879e8865\"\u003e\u003ccode\u003e5b9b7de\u003c/code\u003e\u003c/a\u003e Reset the embed update log when it cannot be read (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3376\"\u003e#3376\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/9fd48c89ad6986d37d20598fd3d8bb5eee94ecba\"\u003e\u003ccode\u003e9fd48c8\u003c/code\u003e\u003c/a\u003e 🐛 fix(ci): dump stacks from a thread that holds the GIL (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3377\"\u003e#3377\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.14.2...21.14.6\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `mypy` from 2.3.1 to 2.4.0\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/python/mypy/blob/master/CHANGELOG.md\"\u003emypy's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003eMypy Release Notes\u003c/h1\u003e\n\u003ch2\u003eNext Release\u003c/h2\u003e\n\u003ch2\u003eMypy 2.4\u003c/h2\u003e\n\u003cp\u003eWe've just uploaded mypy 2.4.0 to the Python Package Index (\u003ca href=\"https://pypi.org/project/mypy/\"\u003ePyPI\u003c/a\u003e).\nMypy is a static type checker for Python. This release includes new features, performance\nimprovements and bug fixes. You can install it as follows:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003epython3 -m pip install -U mypy\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eYou can read the full documentation for this release on \u003ca href=\"http://mypy.readthedocs.io\"\u003eRead the Docs\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003ePython 3.15 Support\u003c/h3\u003e\n\u003cp\u003eMypy 2.4 supports running on Python 3.15 and type checking most Python\n3.15 features. This includes the new builtin \u003ccode\u003esentinel\u003c/code\u003e type for\nsentinel values (PEP 661), which mypy now supports (see below for\ndetails). Lazy imports (PEP 810) and unpacking in comprehensions\n(PEP 798) are also supported. Closed TypedDicts (PEP 728) have been\nsupported since mypy 2.2, but the \u003ccode\u003eextra_items\u003c/code\u003e TypedDict argument,\nalso introduced in PEP 728, is still unsupported. Support for\n\u003ccode\u003eextra_items\u003c/code\u003e will be added in a future mypy release.\u003c/p\u003e\n\u003ch3\u003eNative Parser Enabled by Default\u003c/h3\u003e\n\u003cp\u003eMypy now uses the new native parser by default. It's based on the Ruff\nparser, and it's significantly faster than the legacy parser, which\nuses the stdlib \u003ccode\u003east\u003c/code\u003e module. The native parser also has other\nbenefits:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eYou can target newer Python versions and use recent Python syntax\neven when running mypy on an older Python version. For example, you\ncan use \u003cc...\n\n_Description has been truncated_","html_url":"https://github.com/birgit-seyr/jasmin/pull/71","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/birgit-seyr%2Fjasmin/issues/71","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/71/packages"},{"uuid":"5812002709","node_id":"PR_kwDOEFFaps8AAAABH8Sipg","number":27,"state":"closed","title":"Bump the minor-and-patch group with 14 updates","user":"dependabot[bot]","labels":["dependencies","python:uv"],"assignees":[],"locked":false,"comments_count":1,"pull_request":true,"closed_at":"2026-10-19T04:06:26.000Z","author_association":null,"state_reason":null,"created_at":"2026-10-12T10:12:33.000Z","updated_at":"2026-10-19T04:06:29.000Z","time_to_close":582833,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"Bump","group_name":"minor-and-patch","update_count":14,"packages":[{"name":"torch","old_version":"2.14.0","new_version":"2.14.1","repository_url":"https://github.com/pytorch/pytorch"},{"name":"huggingface-hub","old_version":"2.0.0","new_version":"2.1.1","repository_url":"https://github.com/huggingface/huggingface_hub"},{"name":"ruff","old_version":"0.16.9","new_version":"0.16.10","repository_url":"https://github.com/astral-sh/ruff"},{"name":"pydoclint","old_version":"0.10.0","new_version":"0.11.0","repository_url":"https://github.com/jsh9/pydoclint"},{"name":"sphinx-autodoc-typehints","old_version":"3.13.7","new_version":"3.13.8","repository_url":"https://github.com/tox-dev/sphinx-autodoc-typehints"},{"name":"charset-normalizer","old_version":"3.5.1","new_version":"3.5.2","repository_url":"https://github.com/jawah/charset_normalizer"},{"name":"cuda-pathfinder","old_version":"1.8.2","new_version":"1.8.3","repository_url":"https://github.com/NVIDIA/cuda-python"},{"name":"fastapi","old_version":"0.141.1","new_version":"0.142.2","repository_url":"https://github.com/fastapi/fastapi"},{"name":"filelock","old_version":"4.0.4","new_version":"4.0.11","repository_url":"https://github.com/tox-dev/py-filelock"},{"name":"markupsafe","old_version":"3.0.3","new_version":"3.0.4","repository_url":"https://github.com/pallets/markupsafe"},{"name":"platformdirs","old_version":"4.12.0","new_version":"4.12.3","repository_url":"https://github.com/tox-dev/platformdirs"},{"name":"pytz","old_version":"2026.4","new_version":"2026.5","repository_url":"https://github.com/stub42/pytz"},{"name":"tzdata","old_version":"2026.4","new_version":"2026.5","repository_url":"https://github.com/python/tzdata"},{"name":"virtualenv","old_version":"21.13.0","new_version":"21.14.5","repository_url":"https://github.com/pypa/virtualenv"}],"path":null,"ecosystem":"pip"},"body":"Bumps the minor-and-patch group with 14 updates:\n\n| Package | From | To |\n| --- | --- | --- |\n| [torch](https://github.com/pytorch/pytorch) | `2.14.0` | `2.14.1` |\n| [huggingface-hub](https://github.com/huggingface/huggingface_hub) | `2.0.0` | `2.1.1` |\n| [ruff](https://github.com/astral-sh/ruff) | `0.16.9` | `0.16.10` |\n| [pydoclint](https://github.com/jsh9/pydoclint) | `0.10.0` | `0.11.0` |\n| [sphinx-autodoc-typehints](https://github.com/tox-dev/sphinx-autodoc-typehints) | `3.13.7` | `3.13.8` |\n| [charset-normalizer](https://github.com/jawah/charset_normalizer) | `3.5.1` | `3.5.2` |\n| [cuda-pathfinder](https://github.com/NVIDIA/cuda-python) | `1.8.2` | `1.8.3` |\n| [fastapi](https://github.com/fastapi/fastapi) | `0.141.1` | `0.142.2` |\n| [filelock](https://github.com/tox-dev/py-filelock) | `4.0.4` | `4.0.11` |\n| [markupsafe](https://github.com/pallets/markupsafe) | `3.0.3` | `3.0.4` |\n| [platformdirs](https://github.com/tox-dev/platformdirs) | `4.12.0` | `4.12.3` |\n| [pytz](https://github.com/stub42/pytz) | `2026.4` | `2026.5` |\n| [tzdata](https://github.com/python/tzdata) | `2026.4` | `2026.5` |\n| [virtualenv](https://github.com/pypa/virtualenv) | `21.13.0` | `21.14.5` |\n\nUpdates `torch` from 2.14.0 to 2.14.1\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pytorch/pytorch/releases\"\u003etorch's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ePyTorch 2.14.1 Release\u003c/h2\u003e\n\u003cp\u003eThis release is meant to fix the following regressions and silent correctness issues:\u003c/p\u003e\n\u003ch2\u003eSilent correctness fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eFix incorrect \u003ccode\u003etorch.linalg.lstsq\u003c/code\u003e solutions on MPS for complex batched underdetermined systems (\u003ca href=\"https://redirect.github.com/pytorch/pytorch/issues/196113\"\u003e#196113\u003c/a\u003e), fixed by \u003ca href=\"https://redirect.github.com/pytorch/pytorch/pull/196128\"\u003e#196128\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix non-orthogonal \u003ccode\u003eU\u003c/code\u003e and inaccurate small singular values from \u003ccode\u003etorch.linalg.svd\u003c/code\u003e on MPS for rank-deficient and ill-conditioned inputs (\u003ca href=\"https://redirect.github.com/pytorch/pytorch/issues/196112\"\u003e#196112\u003c/a\u003e), fixed by \u003ca href=\"https://redirect.github.com/pytorch/pytorch/pull/196139\"\u003e#196139\u003c/a\u003e and \u003ca href=\"https://redirect.github.com/pytorch/pytorch/pull/199063\"\u003e#199063\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUpdate the CUDA 13.2 Linux binaries to CUDA 13.2.2 (\u003ca href=\"https://redirect.github.com/pytorch/pytorch/pull/196351\"\u003e#196351\u003c/a\u003e). This NVIDIA update resolves two critical issues that could produce incorrect results (\u003ca href=\"https://docs.nvidia.com/cuda/archive/13.2.2/cuda-toolkit-release-notes/index.html#overview\"\u003eCUDA 13.2.2 release notes\u003c/a\u003e):\n\u003cul\u003e\n\u003cli\u003ecuBLAS: \u003ccode\u003ecublasLtMatmul()\u003c/code\u003e could ignore tensor-wide scaling for NVFP4 matrix multiplications (introduced in CUDA 13.2 Update 1)\u003c/li\u003e\n\u003cli\u003eCompiler: failed thread reconvergence could leave stale or corrupted register values in kernels with nested thread divergence (present since CUDA 12.8)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eRegression fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eFix \u003ccode\u003etorch.linalg.svd\u003c/code\u003e, \u003ccode\u003etorch.linalg.svdvals\u003c/code\u003e and \u003ccode\u003etorch.linalg.lstsq\u003c/code\u003e failing on MPS with a Metal pipeline-state error for inputs above 8192 elements (\u003ca href=\"https://redirect.github.com/pytorch/pytorch/issues/195937\"\u003e#195937\u003c/a\u003e), fixed by \u003ca href=\"https://redirect.github.com/pytorch/pytorch/pull/195949\"\u003e#195949\u003c/a\u003e and \u003ca href=\"https://redirect.github.com/pytorch/pytorch/pull/195950\"\u003e#195950\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix internal assert in \u003ccode\u003etorch.svd(out=)\u003c/code\u003e on MPS for complex inputs (\u003ca href=\"https://redirect.github.com/pytorch/pytorch/issues/195822\"\u003e#195822\u003c/a\u003e), fixed by \u003ca href=\"https://redirect.github.com/pytorch/pytorch/pull/195872\"\u003e#195872\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytorch/pytorch/commit/5c4886908584029761b579af026dcfb627c84070\"\u003e\u003ccode\u003e5c48869\u003c/code\u003e\u003c/a\u003e [MPS] Fix Jacobi SVD convergence for small columns (\u003ca href=\"https://redirect.github.com/pytorch/pytorch/issues/199086\"\u003e#199086\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytorch/pytorch/commit/35223a275e49a6154269e19ac34b7fdd9709d031\"\u003e\u003ccode\u003e35223a2\u003c/code\u003e\u003c/a\u003e [release/2.14] Run the release runner-group reconcile in pytorch/pytorch (\u003ca href=\"https://redirect.github.com/pytorch/pytorch/issues/19\"\u003e#19\u003c/a\u003e...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytorch/pytorch/commit/41ffbc4a994e058af9fe00ed5caba73fc1033359\"\u003e\u003ccode\u003e41ffbc4\u003c/code\u003e\u003c/a\u003e [release-only] Update version to 2.14.1 (\u003ca href=\"https://redirect.github.com/pytorch/pytorch/issues/198661\"\u003e#198661\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytorch/pytorch/commit/e8f0c016eefa7870720d625f4e71bb6265d6c5c0\"\u003e\u003ccode\u003ee8f0c01\u003c/code\u003e\u003c/a\u003e [release/2.14] [CD] Update to CUDA 13.2.2 for Linux binaries (\u003ca href=\"https://redirect.github.com/pytorch/pytorch/issues/198644\"\u003e#198644\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytorch/pytorch/commit/911665dcb02655bac5948e5ced8d8232372d9941\"\u003e\u003ccode\u003e911665d\u003c/code\u003e\u003c/a\u003e [MPS] Cherry-pick native SVD fixes into release/2.14 (\u003ca href=\"https://redirect.github.com/pytorch/pytorch/issues/198394\"\u003e#198394\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/pytorch/pytorch/compare/v2.14.0...v2.14.1\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `huggingface-hub` from 2.0.0 to 2.1.1\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/huggingface/huggingface_hub/releases\"\u003ehuggingface-hub's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev2.1.1\u003c/h2\u003e\n\u003cp\u003e[CLI] Rename 'hf spaces zero-gpu-quota' to 'hf spaces zero-gpu quota'- \u003ca href=\"https://redirect.github.com/huggingface/huggingface_hub/issues/5055\"\u003e#5055\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/huggingface/huggingface_hub/compare/v2.1.0...v2.1.1\"\u003ehttps://github.com/huggingface/huggingface_hub/compare/v2.1.0...v2.1.1\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e[v2.1.0] Better Jobs tooling, ZeroGPU quota tracking, and revamped Model Catalog\u003c/h2\u003e\n\u003ch2\u003e📊 Jobs: retries, rescheduling, and port exposure\u003c/h2\u003e\n\u003cp\u003eHugging Face Jobs get a batch of quality-of-life improvements this release. Jobs can now retry automatically on failure with the new \u003ccode\u003eattempts\u003c/code\u003e parameter, and you can start a fresh Job from an existing Job's saved spec (including secrets and hardware settings) with \u003ccode\u003ererun_job\u003c/code\u003e / \u003ccode\u003ehf jobs rerun\u003c/code\u003e. Scheduled Jobs can be rescheduled — change the cron expression or preset without recreating the Job — via \u003ccode\u003eupdate_scheduled_job_schedule\u003c/code\u003e / \u003ccode\u003ehf jobs scheduled reschedule\u003c/code\u003e. Finally, you can now expose ports on Jobs: use \u003ccode\u003eexpose\u003c/code\u003e for token-protected access and \u003ccode\u003eexpose_public\u003c/code\u003e for unauthenticated access, both at creation time and on a running Job with \u003ccode\u003eupdate_job_expose\u003c/code\u003e / \u003ccode\u003ehf jobs expose\u003c/code\u003e.\u003c/p\u003e\n\u003cpre lang=\"bash\"\u003e\u003ccode\u003e# Retry a job up to 2 times on failure, and rerun it later from its saved spec\r\n\u0026gt;\u0026gt;\u0026gt; hf jobs run --attempts 3 --detach python:3.12 python train.py\r\n\u0026gt;\u0026gt;\u0026gt; hf jobs rerun \u0026lt;job_id\u0026gt;\r\n\u003ch1\u003eReschedule a scheduled job to run every day at 9:00\u003c/h1\u003e\n\u003cp\u003e\u0026gt;\u0026gt;\u0026gt; hf jobs scheduled reschedule \u0026lt;scheduled_job_id\u0026gt; \u0026quot;0 9 * * 1\u0026quot;\u003c/p\u003e\n\u003ch1\u003eExpose ports on a running Job (8000 token-protected, 9000 public)\u003c/h1\u003e\n\u003cp\u003e\u0026gt;\u0026gt;\u0026gt; hf jobs expose \u0026lt;job_id\u0026gt; 8000 --public 9000\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e[Jobs] Add rerun and retry attempts by \u003ca href=\"https://github.com/Wauplin\"\u003e\u003ccode\u003e@​Wauplin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/huggingface/huggingface_hub/issues/5025\"\u003e#5025\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[Jobs] Allow rescheduling scheduled jobs by \u003ca href=\"https://github.com/Wauplin\"\u003e\u003ccode\u003e@​Wauplin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/huggingface/huggingface_hub/issues/5026\"\u003e#5026\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[Jobs] Manage public and private exposed ports by \u003ca href=\"https://github.com/Wauplin\"\u003e\u003ccode\u003e@​Wauplin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/huggingface/huggingface_hub/issues/5027\"\u003e#5027\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e📚 \u003cstrong\u003eDocumentation:\u003c/strong\u003e \u003ca href=\"https://huggingface.co/docs/huggingface_hub/main/en/guides/jobs\"\u003eJobs guide\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e🤗 Track your ZeroGPU quota\u003c/h2\u003e\n\u003cp\u003eThe Hub now exposes a ZeroGPU quota endpoint, and \u003ccode\u003ehuggingface_hub\u003c/code\u003e wraps it with a new \u003ccode\u003eHfApi.get_zero_gpu_quota()\u003c/code\u003e method returning a \u003ccode\u003eZeroGpuQuota\u003c/code\u003e dataclass (values in GPU-seconds). This is particularly useful for apps, MCP servers and agents built on top of ZeroGPU Spaces: check how much quota is left and when it resets, and warn your users before they hit the daily limit. The same information is available from the CLI with \u003ccode\u003ehf spaces zero-gpu-quota\u003c/code\u003e, which also prints a hint to purchase credits when the quota is running low.\u003c/p\u003e\n\u003cpre lang=\"python\"\u003e\u003ccode\u003e\u0026gt;\u0026gt;\u0026gt; from huggingface_hub import get_zero_gpu_quota\r\n\u0026gt;\u0026gt;\u0026gt; quota = get_zero_gpu_quota()\r\nZeroGpuQuota(base=2400, remaining=1810, resets_at=datetime.datetime(2026, 9, 30, 9, 12, 3, tzinfo=datetime.timezone.utc), overquota_used=0)\r\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre lang=\"bash\"\u003e\u003ccode\u003e\u0026gt;\u0026gt;\u0026gt; hf spaces zero-gpu quota\r\n✓ ZeroGPU quota (in GPU-seconds)\r\n  remaining: 1810\r\n  base: 2400\r\n  resets_at: 2026-09-30T18:12:03+00:00\r\n  overquota_used: 0\r\n\u003c/code\u003e\u003c/pre\u003e\n\u003cul\u003e\n\u003cli\u003e[Spaces] Add get_zero_gpu_quota and hf spaces zero-gpu-quota by \u003ca href=\"https://github.com/Wauplin\"\u003e\u003ccode\u003e@​Wauplin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/huggingface/huggingface_hub/issues/5040\"\u003e#5040\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[CLI] Rename 'hf spaces zero-gpu-quota' to 'hf spaces zero-gpu quota'- \u003ca href=\"https://redirect.github.com/huggingface/huggingface_hub/issues/5055\"\u003e#5055\u003c/a\u003e \u003cstrong\u003e[Shipped as part of v2.1.1]\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/huggingface/huggingface_hub/commit/bd4a76030582d118e28dc9ad6c7a5911ea76176b\"\u003e\u003ccode\u003ebd4a760\u003c/code\u003e\u003c/a\u003e Release: v2.1.1\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/huggingface/huggingface_hub/commit/cb1755f353eec5d1048e6be112f5b3502492bcde\"\u003e\u003ccode\u003ecb1755f\u003c/code\u003e\u003c/a\u003e [CLI] Rename 'hf spaces zero-gpu-quota' to 'hf spaces zero-gpu quota' (\u003ca href=\"https://redirect.github.com/huggingface/huggingface_hub/issues/5055\"\u003e#5055\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/huggingface/huggingface_hub/commit/43372b60841b5b9ee2724e1c9c19c3fede6d54b6\"\u003e\u003ccode\u003e43372b6\u003c/code\u003e\u003c/a\u003e Release: v2.1.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/huggingface/huggingface_hub/commit/efa122c2cf1376230846da3a563254930828c424\"\u003e\u003ccode\u003eefa122c\u003c/code\u003e\u003c/a\u003e Release: v2.1.0.rc0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/huggingface/huggingface_hub/commit/0b26b50b61e01b5bcf69dd6ef6d9c3c847075b36\"\u003e\u003ccode\u003e0b26b50\u003c/code\u003e\u003c/a\u003e [Spaces] Add get_zero_gpu_quota and hf spaces zero-gpu-quota (\u003ca href=\"https://redirect.github.com/huggingface/huggingface_hub/issues/5040\"\u003e#5040\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/huggingface/huggingface_hub/commit/604252e46e9eb59ca4b88b71f511dc6ba944350f\"\u003e\u003ccode\u003e604252e\u003c/code\u003e\u003c/a\u003e [HfApi] Add visibility to create_bucket (\u003ca href=\"https://redirect.github.com/huggingface/huggingface_hub/issues/5053\"\u003e#5053\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/huggingface/huggingface_hub/commit/4c88ea6e0f322bb866c6735abd350631bcc4e8cf\"\u003e\u003ccode\u003e4c88ea6\u003c/code\u003e\u003c/a\u003e [Repos] Warn when duplicated repo files are still being copied (\u003ca href=\"https://redirect.github.com/huggingface/huggingface_hub/issues/5041\"\u003e#5041\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/huggingface/huggingface_hub/commit/3bb08e20a3df06a9c3b2b93fe716c2f7dd8b8b2d\"\u003e\u003ccode\u003e3bb08e2\u003c/code\u003e\u003c/a\u003e [Endpoints] Migrate catalog to the new /api/v1 API (\u003ca href=\"https://redirect.github.com/huggingface/huggingface_hub/issues/4928\"\u003e#4928\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/huggingface/huggingface_hub/commit/b5e3a129cea92b2d129c580f38526d95ec4e0d0b\"\u003e\u003ccode\u003eb5e3a12\u003c/code\u003e\u003c/a\u003e [HfApi] Support resource_group_id in duplicate_repo (\u003ca href=\"https://redirect.github.com/huggingface/huggingface_hub/issues/5038\"\u003e#5038\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/huggingface/huggingface_hub/commit/60fdb08c559dbda4a9087dfc56765f6ecd4895a1\"\u003e\u003ccode\u003e60fdb08\u003c/code\u003e\u003c/a\u003e [Docs] Fix duplicated words in docstring and comments (\u003ca href=\"https://redirect.github.com/huggingface/huggingface_hub/issues/5052\"\u003e#5052\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/huggingface/huggingface_hub/compare/v2.0.0...v2.1.1\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `ruff` from 0.16.9 to 0.16.10\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/astral-sh/ruff/releases\"\u003eruff's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e0.16.10\u003c/h2\u003e\n\u003ch2\u003eRelease Notes\u003c/h2\u003e\n\u003cp\u003eReleased on 2026-10-01.\u003c/p\u003e\n\u003ch3\u003ePreview features\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAdd a migration guide for categories (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28087\"\u003e#28087\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e[\u003ccode\u003epyupgrade\u003c/code\u003e] Add rule for context manager iterator annotations (\u003ccode\u003eUP052\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29000\"\u003e#29000\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003ePerformance\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eReduce memory used by diagnostics (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28951\"\u003e#28951\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eServer\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAvoid running \u003ccode\u003euv format\u003c/code\u003e in untrusted workspaces (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28873\"\u003e#28873\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eDocumentation\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eFix links to moved changelog sections and renamed mdtests (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28941\"\u003e#28941\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd Python 3.15 as a supported version (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28907\"\u003e#28907\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd ty as a type checker example (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28906\"\u003e#28906\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eOther changes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eUpdate Rust toolchain to 1.99 and MSRV to 1.97 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29047\"\u003e#29047\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eContributors\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/ntBre\"\u003e\u003ccode\u003e@​ntBre\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/spaceone\"\u003e\u003ccode\u003e@​spaceone\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HardMax71\"\u003e\u003ccode\u003e@​HardMax71\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/charliermarsh\"\u003e\u003ccode\u003e@​charliermarsh\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eInstall ruff 0.16.10\u003c/h2\u003e\n\u003ch3\u003eInstall prebuilt binaries via shell script\u003c/h3\u003e\n\u003cpre lang=\"sh\"\u003e\u003ccode\u003ecurl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/ruff/releases/download/0.16.10/ruff-installer.sh | sh\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch3\u003eInstall prebuilt binaries via powershell script\u003c/h3\u003e\n\u003cpre lang=\"sh\"\u003e\u003ccode\u003epowershell -ExecutionPolicy Bypass -c \u0026quot;irm https://releases.astral.sh/github/ruff/releases/download/0.16.10/ruff-installer.ps1 | iex\u0026quot;\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2\u003eDownload ruff 0.16.10\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/astral-sh/ruff/blob/0.16.10/CHANGELOG.md\"\u003eruff's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e0.16.10\u003c/h2\u003e\n\u003cp\u003eReleased on 2026-10-01.\u003c/p\u003e\n\u003ch3\u003ePreview features\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAdd a migration guide for categories (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28087\"\u003e#28087\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e[\u003ccode\u003epyupgrade\u003c/code\u003e] Add rule for context manager iterator annotations (\u003ccode\u003eUP052\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29000\"\u003e#29000\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003ePerformance\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eReduce memory used by diagnostics (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28951\"\u003e#28951\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eServer\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAvoid running \u003ccode\u003euv format\u003c/code\u003e in untrusted workspaces (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28873\"\u003e#28873\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eDocumentation\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eFix links to moved changelog sections and renamed mdtests (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28941\"\u003e#28941\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd Python 3.15 as a supported version (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28907\"\u003e#28907\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd ty as a type checker example (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28906\"\u003e#28906\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eOther changes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eUpdate Rust toolchain to 1.99 and MSRV to 1.97 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29047\"\u003e#29047\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eContributors\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/ntBre\"\u003e\u003ccode\u003e@​ntBre\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/spaceone\"\u003e\u003ccode\u003e@​spaceone\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HardMax71\"\u003e\u003ccode\u003e@​HardMax71\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/charliermarsh\"\u003e\u003ccode\u003e@​charliermarsh\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/3265ed1f944c98bb4c04d632fbefb1257cdb583d\"\u003e\u003ccode\u003e3265ed1\u003c/code\u003e\u003c/a\u003e Bump version to 0.16.10 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/29055\"\u003e#29055\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/e786964450e75d904c288a1e59ae2b196d0b9c47\"\u003e\u003ccode\u003ee786964\u003c/code\u003e\u003c/a\u003e Authorize shared PR security-review workflow to publish findings (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/29052\"\u003e#29052\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/a81291e9db2f67039d159e7490b988e6c25c7a0f\"\u003e\u003ccode\u003ea81291e\u003c/code\u003e\u003c/a\u003e [ty] Defer uv workspace discovery until after project configuration (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/28525\"\u003e#28525\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/b6a74d26cbe6b45b3eb2992041714461bd4ceb5b\"\u003e\u003ccode\u003eb6a74d2\u003c/code\u003e\u003c/a\u003e [ty] Refresh uv project metadata when uv files change (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/28529\"\u003e#28529\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/41d30df6fdbe215390b3acb46e8cd4017f65580d\"\u003e\u003ccode\u003e41d30df\u003c/code\u003e\u003c/a\u003e Update Rust toolchain to 1.99 and MSRV to 1.97 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/29047\"\u003e#29047\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/317e0a3ab75878eba6e3b78c57f73d47108e2a8e\"\u003e\u003ccode\u003e317e0a3\u003c/code\u003e\u003c/a\u003e [ty] Bound nested callable signature display (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/29049\"\u003e#29049\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/8546752d9d5dac8da78c8abba380600cfe573874\"\u003e\u003ccode\u003e8546752\u003c/code\u003e\u003c/a\u003e [ty] Fix member lookup on union-bounded type variables (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/29018\"\u003e#29018\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/56180bcf800d6e45fb1c4b4113e97501b8f128c5\"\u003e\u003ccode\u003e56180bc\u003c/code\u003e\u003c/a\u003e [ty] Specialize instance members once (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/29043\"\u003e#29043\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/aa9a1ff88aa83b3f01360ef5b3cb04b2be187206\"\u003e\u003ccode\u003eaa9a1ff\u003c/code\u003e\u003c/a\u003e [ty] Avoid stale I/O diagnostics when closing deleted files (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/28988\"\u003e#28988\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/2d253467b5153f82d26c51d49eb8d4156f1768bf\"\u003e\u003ccode\u003e2d25346\u003c/code\u003e\u003c/a\u003e [ty] Improve \u003ccode\u003eunresolved-import\u003c/code\u003e documentation (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/29039\"\u003e#29039\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/astral-sh/ruff/compare/0.16.9...0.16.10\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `pydoclint` from 0.10.0 to 0.11.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/jsh9/pydoclint/releases\"\u003epydoclint's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e0.11.0\u003c/h2\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eSupport checking stub (.pyi) files by \u003ca href=\"https://github.com/jsh9\"\u003e\u003ccode\u003e@​jsh9\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/jsh9/pydoclint/pull/310\"\u003ejsh9/pydoclint#310\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/jsh9/pydoclint/compare/0.10.1...0.11.0\"\u003ehttps://github.com/jsh9/pydoclint/compare/0.10.1...0.11.0\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e0.10.1\u003c/h2\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eRewrite README and restructure docs by \u003ca href=\"https://github.com/jsh9\"\u003e\u003ccode\u003e@​jsh9\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/jsh9/pydoclint/pull/307\"\u003ejsh9/pydoclint#307\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUse stacked pytest parametrize instead of itertools.product in tests by \u003ca href=\"https://github.com/jsh9\"\u003e\u003ccode\u003e@​jsh9\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/jsh9/pydoclint/pull/308\"\u003ejsh9/pydoclint#308\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/jsh9/pydoclint/compare/0.10.0...0.10.1\"\u003ehttps://github.com/jsh9/pydoclint/compare/0.10.0...0.10.1\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/jsh9/pydoclint/blob/main/CHANGELOG.md\"\u003epydoclint's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e[0.11.0] - 2026-10-02\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eAdded\n\u003cul\u003e\n\u003cli\u003eA new config option \u003ccode\u003e--include-stub-files\u003c/code\u003e (shortform: \u003ccode\u003e-isf\u003c/code\u003e, default:\n\u003ccode\u003eFalse\u003c/code\u003e), so that scanning a folder also checks stub (\u003ccode\u003e.pyi\u003c/code\u003e) files (\u003ca href=\"https://redirect.github.com/jsh9/pydoclint/issues/303\"\u003e#303\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eFixed\n\u003cul\u003e\n\u003cli\u003eFalse-positive \u003ccode\u003eDOC403\u003c/code\u003e and \u003ccode\u003eDOC502\u003c/code\u003e violations in stub (\u003ccode\u003e.pyi\u003c/code\u003e) files,\nwhose function bodies are placeholders, in both the native mode and\n\u003cem\u003eflake8\u003c/em\u003e (\u003ca href=\"https://redirect.github.com/jsh9/pydoclint/issues/303\"\u003e#303\u003c/a\u003e). \u003ccode\u003eDOC403\u003c/code\u003e is still reported in stub files when the return\nannotation isn't a Generator/Iterator/Iterable (or is missing), because\nthen the function can't yield anything\u003c/li\u003e\n\u003cli\u003eFalse-positive \u003ccode\u003eDOC105\u003c/code\u003e and \u003ccode\u003eDOC605\u003c/code\u003e violations in stub files when\n\u003ccode\u003e--check-arg-defaults\u003c/code\u003e is \u003ccode\u003eTrue\u003c/code\u003e: an argument or class attribute whose\ndefault is the \u003ccode\u003e...\u003c/code\u003e placeholder can now be documented with any default\nvalue or none\u003c/li\u003e\n\u003cli\u003eFalse-positive \u003ccode\u003eDOC201\u003c/code\u003e violations for abstract methods and stub functions\nannotated with \u003ccode\u003eIterator[...]\u003c/code\u003e or \u003ccode\u003eIterable[...]\u003c/code\u003e whose docstrings have a\n\u0026quot;Yields\u0026quot; section (and no \u0026quot;return\u0026quot; statements in the body). Their bodies are\nplaceholders, so the \u0026quot;Yields\u0026quot; section is what shows that they yield, and\nthey don't need a \u0026quot;Returns\u0026quot; section\u003c/li\u003e\n\u003cli\u003eFalse-positive \u003ccode\u003eDOC203\u003c/code\u003e violations for abstract methods and stub functions\nannotated with \u003ccode\u003eGenerator[YieldType, SendType, ReturnType]\u003c/code\u003e whose \u0026quot;Returns\u0026quot;\nsection documents \u003ccode\u003eReturnType\u003c/code\u003e, as for a generator that both yields and\nreturns\u003c/li\u003e\n\u003cli\u003eFalse-positive \u003ccode\u003eDOC202\u003c/code\u003e violations for abstract methods and stub functions\nthat have a \u0026quot;Returns\u0026quot; section but no return annotation. (\u003ccode\u003eDOC203\u003c/code\u003e still\nreports the missing annotation when return types are checked.)\u003c/li\u003e\n\u003cli\u003eA crash (\u003ccode\u003eIndexError\u003c/code\u003e) when \u003ccode\u003e--check-arg-defaults\u003c/code\u003e is \u003ccode\u003eTrue\u003c/code\u003e and\npositional-only arguments (the ones before \u003ccode\u003e/\u003c/code\u003e) have default values. When\nit didn't crash, the defaults of positional-only arguments were ignored\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eFull diff\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jsh9/pydoclint/compare/0.10.1...0.11.0\"\u003ehttps://github.com/jsh9/pydoclint/compare/0.10.1...0.11.0\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e[0.10.1] - 2026-09-27\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eChanged\n\u003cul\u003e\n\u003cli\u003eRewrote the README and restructured the docs\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eFixed\n\u003cul\u003e\n\u003cli\u003eStale docs content and the broken \u003ccode\u003eDOC103\u003c/code\u003e/\u003ccode\u003eDOC603\u003c/code\u003e docs link\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eAdded\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003edocs/llms.txt\u003c/code\u003e and a pre-commit check for orphan docs and broken links\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eMaintenance\n\u003cul\u003e\n\u003cli\u003eReplaced \u003ccode\u003eitertools.product\u003c/code\u003e with stacked \u003ccode\u003e@pytest.mark.parametrize\u003c/code\u003e\ndecorators in \u003ccode\u003etests/test_main.py\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eFull diff\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jsh9/pydoclint/compare/0.10.0...0.10.1\"\u003ehttps://github.com/jsh9/pydoclint/compare/0.10.0...0.10.1\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jsh9/pydoclint/commit/24412c5f73ad438a08146132ea86a9a72c8bd5ad\"\u003e\u003ccode\u003e24412c5\u003c/code\u003e\u003c/a\u003e Support checking stub (.pyi) files (\u003ca href=\"https://redirect.github.com/jsh9/pydoclint/issues/310\"\u003e#310\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jsh9/pydoclint/commit/e0aeee36ac994cefd38eefca3d073fcb2154bc76\"\u003e\u003ccode\u003ee0aeee3\u003c/code\u003e\u003c/a\u003e Use stacked pytest parametrize instead of itertools.product in tests (\u003ca href=\"https://redirect.github.com/jsh9/pydoclint/issues/308\"\u003e#308\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jsh9/pydoclint/commit/f87ba10fa90523310352dd2ccf153690b2271e8d\"\u003e\u003ccode\u003ef87ba10\u003c/code\u003e\u003c/a\u003e Rewrite README and restructure docs (\u003ca href=\"https://redirect.github.com/jsh9/pydoclint/issues/307\"\u003e#307\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/jsh9/pydoclint/compare/0.10.0...0.11.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `sphinx-autodoc-typehints` from 3.13.7 to 3.13.8\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/sphinx-autodoc-typehints/releases\"\u003esphinx-autodoc-typehints's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e3.13.8\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e🐛 fix(resolver): resolve guarded class imports by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/sphinx-autodoc-typehints/pull/775\"\u003etox-dev/sphinx-autodoc-typehints#775\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/tox-dev/sphinx-autodoc-typehints/compare/3.13.7...3.13.8\"\u003ehttps://github.com/tox-dev/sphinx-autodoc-typehints/compare/3.13.7...3.13.8\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/sphinx-autodoc-typehints/commit/0a96a6c93ff7a407f991b29741b24f4a62de28a5\"\u003e\u003ccode\u003e0a96a6c\u003c/code\u003e\u003c/a\u003e 🐛 fix(resolver): resolve guarded class imports (\u003ca href=\"https://redirect.github.com/tox-dev/sphinx-autodoc-typehints/issues/775\"\u003e#775\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/sphinx-autodoc-typehints/commit/d794732b9b70111eb3e927d6543b9496ec17b7a3\"\u003e\u003ccode\u003ed794732\u003c/code\u003e\u003c/a\u003e build(deps): bump astral-sh/setup-uv from 10.1.0 to 10.2.0 in the github-acti...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/sphinx-autodoc-typehints/commit/6dc6c4ed83e761f4cf197f3fdf1b0a86f0e1ea0e\"\u003e\u003ccode\u003e6dc6c4e\u003c/code\u003e\u003c/a\u003e [pre-commit.ci] pre-commit autoupdate (\u003ca href=\"https://redirect.github.com/tox-dev/sphinx-autodoc-typehints/issues/773\"\u003e#773\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/sphinx-autodoc-typehints/commit/9627932044b7b755111f96e98e1b6f2028e1ef47\"\u003e\u003ccode\u003e9627932\u003c/code\u003e\u003c/a\u003e build(deps): bump astral-sh/setup-uv from 10.0.1 to 10.1.0 in the github-acti...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/sphinx-autodoc-typehints/commit/bd0036699d2ecba4e00f5c49b327fd4626cf779f\"\u003e\u003ccode\u003ebd00366\u003c/code\u003e\u003c/a\u003e [pre-commit.ci] pre-commit autoupdate (\u003ca href=\"https://redirect.github.com/tox-dev/sphinx-autodoc-typehints/issues/771\"\u003e#771\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/tox-dev/sphinx-autodoc-typehints/compare/3.13.7...3.13.8\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `charset-normalizer` from 3.5.1 to 3.5.2\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/jawah/charset_normalizer/releases\"\u003echarset-normalizer's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003eVersion 3.5.2\u003c/h2\u003e\n\u003ch2\u003e\u003ca href=\"https://github.com/Ousret/charset_normalizer/compare/3.5.1...3.5.2\"\u003e3.5.2\u003c/a\u003e (2026-09-29)\u003c/h2\u003e\n\u003ch3\u003eChanged\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eRaised the Cython upper bound to \u003ccode\u003e\u0026lt;3.4\u003c/code\u003e for native builds. The bound remains \u003ccode\u003e\u0026lt;3.3\u003c/code\u003e for\n\u003ccode\u003eabi3\u003c/code\u003e builds to preserve compatibility with the Python 3.7 Limited API.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eFixed\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eValid UTF-8 Chinese JSON incorrectly detected as PTCP154 due to excessive noise penalties\nfor uncommon CJK characters. (\u003ca href=\"https://redirect.github.com/jawah/charset_normalizer/issues/796\"\u003e#796\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupported encodings without aliases failing name resolution or being ignored in charset\ndeclarations. (\u003ca href=\"https://redirect.github.com/jawah/charset_normalizer/issues/800\"\u003e#800\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/jawah/charset_normalizer/blob/master/CHANGELOG.md\"\u003echarset-normalizer's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e\u003ca href=\"https://github.com/Ousret/charset_normalizer/compare/3.5.1...3.5.2\"\u003e3.5.2\u003c/a\u003e (2026-09-29)\u003c/h2\u003e\n\u003ch3\u003eChanged\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eRaised the Cython upper bound to \u003ccode\u003e\u0026lt;3.4\u003c/code\u003e for native builds. The bound remains \u003ccode\u003e\u0026lt;3.3\u003c/code\u003e for\n\u003ccode\u003eabi3\u003c/code\u003e builds to preserve compatibility with the Python 3.7 Limited API.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eFixed\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eValid UTF-8 Chinese JSON incorrectly detected as PTCP154 due to excessive noise penalties\nfor uncommon CJK characters. (\u003ca href=\"https://redirect.github.com/jawah/charset_normalizer/issues/796\"\u003e#796\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupported encodings without aliases failing name resolution or being ignored in charset\ndeclarations. (\u003ca href=\"https://redirect.github.com/jawah/charset_normalizer/issues/800\"\u003e#800\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jawah/charset_normalizer/commit/935c29ad2d0d6e62fcf3a6e0617c55dc6e85db8f\"\u003e\u003ccode\u003e935c29a\u003c/code\u003e\u003c/a\u003e Release 3.5.2 (\u003ca href=\"https://redirect.github.com/jawah/charset_normalizer/issues/805\"\u003e#805\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jawah/charset_normalizer/commit/9d3238a7ae9676e05ee1da5da826297b374f2282\"\u003e\u003ccode\u003e9d3238a\u003c/code\u003e\u003c/a\u003e test: disable traefik in downstream niquests\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jawah/charset_normalizer/commit/b4c0368fdc9183b8e77e39d865328a4a40103750\"\u003e\u003ccode\u003eb4c0368\u003c/code\u003e\u003c/a\u003e docs: write changelog entry for 3.5.2\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jawah/charset_normalizer/commit/717da3108bf90d979c1485ae55c0b11f2eab650b\"\u003e\u003ccode\u003e717da31\u003c/code\u003e\u003c/a\u003e chore: bump version to 3.5.2\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jawah/charset_normalizer/commit/264895d4e9313b088c9698f5394278a3c7ab58a7\"\u003e\u003ccode\u003e264895d\u003c/code\u003e\u003c/a\u003e chore: update pypa/cibuildwheel and pypa/gh-action-pypi-publish\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jawah/charset_normalizer/commit/41e28b6cb19d7ec85560f869cbc2a599c8fc855b\"\u003e\u003ccode\u003e41e28b6\u003c/code\u003e\u003c/a\u003e chore: raise Cython upper bound to 3.3\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jawah/charset_normalizer/commit/b130b7dae36658c7ba67381fe06a62c7c7c03894\"\u003e\u003ccode\u003eb130b7d\u003c/code\u003e\u003c/a\u003e Fix valid UTF-8 Chinese JSON misdetected as PTCP154 (\u003ca href=\"https://redirect.github.com/jawah/charset_normalizer/issues/796\"\u003e#796\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jawah/charset_normalizer/commit/f6afd31c54fe20524f96be00de3bcb0e81727526\"\u003e\u003ccode\u003ef6afd31\u003c/code\u003e\u003c/a\u003e Make the IANA_NO_ALIASES encodings resolvable by name (\u003ca href=\"https://redirect.github.com/jawah/charset_normalizer/issues/800\"\u003e#800\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/jawah/charset_normalizer/compare/3.5.1...3.5.2\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `cuda-pathfinder` from 1.8.2 to 1.8.3\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/NVIDIA/cuda-python/releases\"\u003ecuda-pathfinder's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ecuda-pathfinder v1.8.3\u003c/h2\u003e\n\u003ch2\u003eRelease notes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://nvidia.github.io/cuda-python/cuda-pathfinder/latest/release/1.8.3-notes.html\"\u003ehttps://nvidia.github.io/cuda-python/cuda-pathfinder/latest/release/1.8.3-notes.html\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eDocumentation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://nvidia.github.io/cuda-python/cuda-pathfinder/1.8.3/\"\u003ehttps://nvidia.github.io/cuda-python/cuda-pathfinder/1.8.3/\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ePyPI\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://pypi.org/project/cuda-pathfinder/1.8.3/\"\u003ehttps://pypi.org/project/cuda-pathfinder/1.8.3/\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eConda\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://anaconda.org/conda-forge/cuda-pathfinder/files?version=1.8.3\"\u003ehttps://anaconda.org/conda-forge/cuda-pathfinder/files?version=1.8.3\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003econda install conda-forge::cuda-pathfinder=1.8.3\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/NVIDIA/cuda-python/commit/308e4e17991fa9cc8fd5d9ac76619317f948b3e6\"\u003e\u003ccode\u003e308e4e1\u003c/code\u003e\u003c/a\u003e docs(pathfinder): add 1.8.3 release notes (\u003ca href=\"https://redirect.github.com/NVIDIA/cuda-python/issues/2991\"\u003e#2991\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/NVIDIA/cuda-python/commit/61690ff8c3e8b96d1bf1421b346489f9af49dbd2\"\u003e\u003ccode\u003e61690ff\u003c/code\u003e\u003c/a\u003e test: drop heavy test dependency (matplotlib) (\u003ca href=\"https://redirect.github.com/NVIDIA/cuda-python/issues/2990\"\u003e#2990\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/NVIDIA/cuda-python/commit/45a4cedbe589ec6a17d3efb40317f028efaff68e\"\u003e\u003ccode\u003e45a4ced\u003c/code\u003e\u003c/a\u003e cuda.core: require a cuda-bindings floor and call the driver through its reso...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/NVIDIA/cuda-python/commit/2e976bf75ae48d025077d28fcbdfeffcfa067f6b\"\u003e\u003ccode\u003e2e976bf\u003c/code\u003e\u003c/a\u003e ci: generate ci pipeline diagram from Mermaid (\u003ca href=\"https://redirect.github.com/NVIDIA/cuda-python/issues/2957\"\u003e#2957\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/NVIDIA/cuda-python/commit/5fbfc6d04d1a26200e34c33e9dd3c8fbfe4d61fe\"\u003e\u003ccode\u003e5fbfc6d\u003c/code\u003e\u003c/a\u003e build(deps): bump the actions-monthly group with 5 updates (\u003ca href=\"https://redirect.github.com/NVIDIA/cuda-python/issues/2983\"\u003e#2983\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/NVIDIA/cuda-python/commit/48f55a33132e6278da323b90688910c0975ea6ff\"\u003e\u003ccode\u003e48f55a3\u003c/code\u003e\u003c/a\u003e Add cusparseLt_13.dll (\u003ca href=\"https://redirect.github.com/NVIDIA/cuda-python/issues/2982\"\u003e#2982\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/NVIDIA/cuda-python/commit/52e162bbc6c83e31abc88abd1eab4261e71c6ec9\"\u003e\u003ccode\u003e52e162b\u003c/code\u003e\u003c/a\u003e Closes \u003ca href=\"https://redirect.github.com/NVIDIA/cuda-python/issues/2975\"\u003e#2975\u003c/a\u003e (\u003ca href=\"https://redirect.github.com/NVIDIA/cuda-python/issues/2976\"\u003e#2976\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/NVIDIA/cuda-python/commit/f58b50799d9d8a77973d1340da84d27c39484d40\"\u003e\u003ccode\u003ef58b507\u003c/code\u003e\u003c/a\u003e [doc-only] Add release notes about removed \u003ccode\u003ereserved\u003c/code\u003e members (\u003ca href=\"https://redirect.github.com/NVIDIA/cuda-python/issues/2972\"\u003e#2972\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/NVIDIA/cuda-python/commit/cdaa23aff3a8e4e059f3568ec511077aec0adb7d\"\u003e\u003ccode\u003ecdaa23a\u003c/code\u003e\u003c/a\u003e [doc-only] Update Cython layer and ABI stability information (\u003ca href=\"https://redirect.github.com/NVIDIA/cuda-python/issues/2977\"\u003e#2977\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/NVIDIA/cuda-python/commit/254fa4a96d99c27eca0c951026b03a4bb977802c\"\u003e\u003ccode\u003e254fa4a\u003c/code\u003e\u003c/a\u003e Refresh CUDA 13.4 bindings (cybind !561, !574, !580) (\u003ca href=\"https://redirect.github.com/NVIDIA/cuda-python/issues/2953\"\u003e#2953\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/NVIDIA/cuda-python/compare/cuda-pathfinder-v1.8.2...cuda-pathfinder-v1.8.3\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `fastapi` from 0.141.1 to 0.142.2\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/fastapi/fastapi/releases\"\u003efastapi's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e0.142.2\u003c/h2\u003e\n\u003ch3\u003eFixes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e🐛 Allow startup when automatic OpenTelemetry configuration fails. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16418\"\u003e#16418\u003c/a\u003e by \u003ca href=\"https://github.com/tiangolo\"\u003e\u003ccode\u003e@​tiangolo\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e0.142.1\u003c/h2\u003e\n\u003ch3\u003eFixes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e🐛 Fix repeated endpoint wrapping in included routers. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16414\"\u003e#16414\u003c/a\u003e by \u003ca href=\"https://github.com/tiangolo\"\u003e\u003ccode\u003e@​tiangolo\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e0.142.0\u003c/h2\u003e\n\u003ch3\u003eFeatures\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e✨ Add native OpenTelemetry support. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16403\"\u003e#16403\u003c/a\u003e by \u003ca href=\"https://github.com/tiangolo\"\u003e\u003ccode\u003e@​tiangolo\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eRefactors\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e📱 Improve mobile responsiveness of conference rail. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16196\"\u003e#16196\u003c/a\u003e by \u003ca href=\"https://github.com/alejsdev\"\u003e\u003ccode\u003e@​alejsdev\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e♻️ Remove conf section and add event banner. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16193\"\u003e#16193\u003c/a\u003e by \u003ca href=\"https://github.com/alejsdev\"\u003e\u003ccode\u003e@​alejsdev\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eDocs\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e🔥 Remove unused image. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16195\"\u003e#16195\u003c/a\u003e by \u003ca href=\"https://github.com/alejsdev\"\u003e\u003ccode\u003e@​alejsdev\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🐛 Use buttons for Termynal controls. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16132\"\u003e#16132\u003c/a\u003e by \u003ca href=\"https://github.com/tiangolo\"\u003e\u003ccode\u003e@​tiangolo\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eTranslations\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e🌐 Update translations for hi (update-outdated). PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16212\"\u003e#16212\u003c/a\u003e by \u003ca href=\"https://github.com/apps/pr-submit\"\u003e\u003ccode\u003e@​pr-submit[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🌐 Update translations for ru (update-outdated). PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16210\"\u003e#16210\u003c/a\u003e by \u003ca href=\"https://github.com/apps/pr-submit\"\u003e\u003ccode\u003e@​pr-submit[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🌐 Update translations for zh-hant (update-outdated). PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16211\"\u003e#16211\u003c/a\u003e by \u003ca href=\"https://github.com/apps/pr-submit\"\u003e\u003ccode\u003e@​pr-submit[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🌐 Update translations for uk (update-outdated). PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16208\"\u003e#16208\u003c/a\u003e by \u003ca href=\"https://github.com/apps/pr-submit\"\u003e\u003ccode\u003e@​pr-submit[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🌐 Update translations for de (update-outdated). PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16209\"\u003e#16209\u003c/a\u003e by \u003ca href=\"https://github.com/apps/pr-submit\"\u003e\u003ccode\u003e@​pr-submit[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🌐 Update translations for tr (update-outdated). PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16207\"\u003e#16207\u003c/a\u003e by \u003ca href=\"https://github.com/apps/pr-submit\"\u003e\u003ccode\u003e@​pr-submit[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🌐 Update translations for ja (update-outdated). PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16206\"\u003e#16206\u003c/a\u003e by \u003ca href=\"https://github.com/apps/pr-submit\"\u003e\u003ccode\u003e@​pr-submit[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🌐 Update translations for fr (update-outdated). PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16205\"\u003e#16205\u003c/a\u003e by \u003ca href=\"https://github.com/apps/pr-submit\"\u003e\u003ccode\u003e@​pr-submit[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🌐 Update translations for zh (update-outdated). PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16204\"\u003e#16204\u003c/a\u003e by \u003ca href=\"https://github.com/apps/pr-submit\"\u003e\u003ccode\u003e@​pr-submit[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🌐 Update translations for es (update-outdated). PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16203\"\u003e#16203\u003c/a\u003e by \u003ca href=\"https://github.com/apps/pr-submit\"\u003e\u003ccode\u003e@​pr-submit[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🌐 Update translations for pt (update-outdated). PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16202\"\u003e#16202\u003c/a\u003e by \u003ca href=\"https://github.com/apps/pr-submit\"\u003e\u003ccode\u003e@​pr-submit[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🌐 Update translations for ko (update-outdated). PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16201\"\u003e#16201\u003c/a\u003e by \u003ca href=\"https://github.com/apps/pr-submit\"\u003e\u003ccode\u003e@​pr-submit[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🌐 Update translations for ko (update-outdated). PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16171\"\u003e#16171\u003c/a\u003e by \u003ca href=\"https://github.com/apps/pr-submit\"\u003e\u003ccode\u003e@​pr-submit[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eInternal\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e✅ Fix frontend test timeout with Starlette Git. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16408\"\u003e#16408\u003c/a\u003e by \u003ca href=\"https://github.com/YuriiMotov\"\u003e\u003ccode\u003e@​YuriiMotov\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🔧 Update sponsors: remove Permit.io. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16406\"\u003e#16406\u003c/a\u003e by \u003ca href=\"https://github.com/tiangolo\"\u003e\u003ccode\u003e@​tiangolo\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e⬆ Bump anyio from 4.12.1 to 4.14.2. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16375\"\u003e#16375\u003c/a\u003e by \u003ca href=\"https://github.com/apps/dependabot\"\u003e\u003ccode\u003e@​dependabot[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e⬆ Bump the python-packages group across 1 directory with 15 updates. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16285\"\u003e#16285\u003c/a\u003e by \u003ca href=\"https://github.com/apps/dependabot\"\u003e\u003ccode\u003e@​dependabot[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e⬆ Bump starlette from 1.3.1 to 1.6.0. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16289\"\u003e#16289\u003c/a\u003e by \u003ca href=\"https://github.com/apps/dependabot\"\u003e\u003ccode\u003e@​dependabot[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e⬆ Bump annotated-doc from 0.0.4 to 0.0.5. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16288\"\u003e#16288\u003c/a\u003e by \u003ca href=\"https://github.com/apps/dependabot\"\u003e\u003ccode\u003e@​dependabot[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e⬆ Bump typing-inspection from 0.4.2 to 0.4.4. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16286\"\u003e#16286\u003c/a\u003e by \u003ca href=\"https://github.com/apps/dependabot\"\u003e\u003ccode\u003e@​dependabot[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fastapi/fastapi/commit/78c4324f0c56bc5282a459978779a9e532d19709\"\u003e\u003ccode\u003e78c4324\u003c/code\u003e\u003c/a\u003e 🔖 Release version 0.142.2 (\u003ca href=\"https://redirect.github.com/fastapi/fastapi/issues/16419\"\u003e#16419\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fastapi/fastapi/commit/2579ed0d9e73205326463025cc756650f642f511\"\u003e\u003ccode\u003e2579ed0\u003c/code\u003e\u003c/a\u003e 📝 Update release notes\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fastapi/fastapi/commit/1d4953d2e528b58cfb09bbc28fb25dcda227c6ea\"\u003e\u003ccode\u003e1d4953d\u003c/code\u003e\u003c/a\u003e 🐛 Allow startup when automatic OpenTelemetry configuration fails (\u003ca href=\"https://redirect.github.com/fastapi/fastapi/issues/16418\"\u003e#16418\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fastapi/fastapi/commit/3e33a03bdaa3a89f27d5e0c390c4ba9032f14b5e\"\u003e\u003ccode\u003e3e33a03\u003c/code\u003e\u003c/a\u003e 🔖 Release version 0.142.1 (\u003ca href=\"https://redirect.github.com/fastapi/fastapi/issues/16415\"\u003e#16415\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fastapi/fastapi/commit/12ea7f5a5e76c5ba3495c2803f57ed92ac67731b\"\u003e\u003ccode\u003e12ea7f5\u003c/code\u003e\u003c/a\u003e 📝 Update release notes\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fastapi/fastapi/commit/ac88f563db5f4d3300d43355eca728c93ed9ffe2\"\u003e\u003ccode\u003eac88f56\u003c/code\u003e\u003c/a\u003e 🐛 Fix repeated endpoint wrapping in included routers (\u003ca href=\"https://redirect.github.com/fastapi/fastapi/issues/16414\"\u003e#16414\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fastapi/fastapi/commit/bd41128123fd08d693f5541e27c550eebe20f8b0\"\u003e\u003ccode\u003ebd41128\u003c/code\u003e\u003c/a\u003e 🔖 Release version 0.142.0 (\u003ca href=\"https://redirect.github.com/fastapi/fastapi/issues/16411\"\u003e#16411\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fastapi/fastapi/commit/7aa21e53c859ce52b17196b35909efca6f2fa11f\"\u003e\u003ccode\u003e7aa21e5\u003c/code\u003e\u003c/a\u003e 📝 Update release notes\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fastapi/fastapi/commit/4b3949cd9e5932f76217131fceabc74145c3db24\"\u003e\u003ccode\u003e4b3949c\u003c/code\u003e\u003c/a\u003e ✨ Add native OpenTelemetry support (\u003ca href=\"https://redirect.github.com/fastapi/fastapi/issues/16403\"\u003e#16403\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fastapi/fastapi/commit/c30032a1b68fb36c03fffe1856369d3824607c7c\"\u003e\u003ccode\u003ec30032a\u003c/code\u003e\u003c/a\u003e 📝 Update release notes\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/fastapi/fastapi/compare/0.141.1...0.142.2\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `filelock` from 4.0.4 to 4.0.11\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/py-filelock/releases\"\u003efilelock's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e4.0.11\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003edocs: select an existing tox environment in contributing guide by \u003ca href=\"https://github.com/raghav-sharma-ai\"\u003e\u003ccode\u003e@​raghav-sharma-ai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/767\"\u003etox-dev/filelock#767\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(read-write): handle NetBSD fd limits by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/768\"\u003etox-dev/filelock#768\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/raghav-sharma-ai\"\u003e\u003ccode\u003e@​raghav-sharma-ai\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/767\"\u003etox-dev/filelock#767\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/tox-dev/filelock/compare/4.0.10...4.0.11\"\u003ehttps://github.com/tox-dev/filelock/compare/4.0.10...4.0.11\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e4.0.10\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e♻️ refactor(util): test helpers via public locks by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/764\"\u003etox-dev/filelock#764\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(singleton): reject conflicting async and lease options by \u003ca href=\"https://github.com/kokotatan\"\u003e\u003ccode\u003e@​kokotatan\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/765\"\u003etox-dev/filelock#765\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/kokotatan\"\u003e\u003ccode\u003e@​kokotatan\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/765\"\u003etox-dev/filelock#765\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/tox-dev/filelock/compare/4.0.9...4.0.10\"\u003ehttps://github.com/tox-dev/filelock/compare/4.0.9...4.0.10\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e4.0.9\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e📝 docs(util): correct write and break guarantees by \u003ca href=\"https://github.com/pralav-25\"\u003e\u003ccode\u003e@​pralav-25\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/762\"\u003etox-dev/filelock#762\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(read-write): close db fd after connect by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/763\"\u003etox-dev/filelock#763\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pralav-25\"\u003e\u003ccode\u003e@​pralav-25\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/762\"\u003etox-dev/filelock#762\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/tox-dev/filelock/compare/4.0.8...4.0.9\"\u003ehttps://github.com/tox-dev/filelock/compare/4.0.8...4.0.9\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e4.0.8\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e🐛 fix(read-write): refuse cross-thread write release by \u003ca href=\"https://github.com/feiiiiii5\"\u003e\u003ccode\u003e@​feiiiiii5\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/761\"\u003etox-dev/filelock#761\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/tox-dev/filelock/compare/4.0.7...4.0.8\"\u003ehttps://github.com/tox-dev/filelock/compare/4.0.7...4.0.8\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e4.0.7\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e🐛 fix(mode): require owner read and write by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/760\"\u003etox-dev/filelock#760\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/filelock/blob/main/docs/changelog.rst\"\u003efilelock's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e###########\nChangelog\n###########\u003c/p\u003e\n\u003cp\u003e.. towncrier-draft-entries:: Unreleased\u003c/p\u003e\n\u003cp\u003e.. towncrier release notes start\u003c/p\u003e\n\u003chr /\u003e\n\u003cp\u003e4.1.1 (2026-10-11)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eBound the shared-lock contention test by worker progress so slow CI machines can finish the workload. :pr:\u003ccode\u003e819\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eAvoid the macOS \u003ccode\u003e/dev/fd\u003c/code\u003e lookup implicated in a kernel panic by opening SQLite through a validated hard link.\nThe database directory must be writable and support hard links; alias creation failure raises \u003ccode\u003eOSError\u003c/code\u003e. :pr:\u003ccode\u003e820\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eIgnore non-ASCII PID or start-time fields and out-of-range PIDs in \u003ccode\u003eReadWriteLock\u003c/code\u003e hard-link directory names so forged\nowners cannot abort acquisition. :pr:\u003ccode\u003e821\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eUse Python 3.15 for development and automation. :pr:\u003ccode\u003e816\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.1.0 (2026-10-09)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eImport :data:\u003ccode\u003e~filelock.OwnerMode\u003c/code\u003e, :data:\u003ccode\u003e~filelock.CompromiseReason\u003c/code\u003e and :data:\u003ccode\u003e~filelock.has_fcntl\u003c/code\u003e from\n\u003ccode\u003efilelock\u003c/code\u003e. :pr:\u003ccode\u003e790\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:class:\u003ccode\u003e~filelock.AcquireReturnProxy\u003c/code\u003e is generic in the lock type, so \u003ccode\u003ewith lock.acquire() as held:\u003c/code\u003e types \u003ccode\u003eheld\u003c/code\u003e as\nthe lock's own class. :pr:\u003ccode\u003e803\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eA :class:\u003ccode\u003e~filelock.Timeout\u003c/code\u003e from a soft lock names a holder on another host or in another PID namespace, which no\ncontender ever reclaims. :pr:\u003ccode\u003e815\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:attr:\u003ccode\u003e~filelock.SoftFileLock.is_lock_held_by_us\u003c/code\u003e and :attr:\u003ccode\u003e~filelock.MarkerSoftFileLock.is_lock_held_by_us\u003c/code\u003e return\n\u003ccode\u003eFalse\u003c/code\u003e for a marker an earlier process with the same PID left behind. :pr:\u003ccode\u003e774\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:class:\u003ccode\u003e~filelock.SoftFileLock\u003c/code\u003e removes its marker when writing it fails and closing the descriptor fails too, so the\nlock path no longer stays blocked. :pr:\u003ccode\u003e775\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:meth:\u003ccode\u003e~filelock.BaseFileLock.acquire\u003c/code\u003e and :meth:\u003ccode\u003e~filelock.BaseAsyncFileLock.acquire\u003c/code\u003e no longer wait past \u003ccode\u003etimeout\u003c/code\u003e\nwhen \u003ccode\u003epoll_interval\u003c/code\u003e is longer than the time left. :pr:\u003ccode\u003e777\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:class:\u003ccode\u003e~filelock.SoftReadWriteLock\u003c/code\u003e ignores a generation-log entry whose name is not 20 ASCII digits, which used to\nstop its heartbeat thread or delete real generations. :pr:\u003ccode\u003e778\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:class:\u003ccode\u003e~filelock.ReadWriteLock\u003c/code\u003e, :class:\u003ccode\u003e~filelock.SoftReadWriteLock\u003c/code\u003e and their async wrappers treat a\n:data:\u003ccode\u003emath.inf\u003c/code\u003e timeout like \u003ccode\u003e-1\u003c/code\u003e and raise :class:\u003ccode\u003eValueError\u003c/code\u003e for a blocking \u003ccode\u003enan\u003c/code\u003e one. :pr:\u003ccode\u003e779\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:class:\u003ccode\u003e~filelock.ReadWriteLock\u003c/code\u003e and :class:\u003ccode\u003e~filelock.SoftReadWriteLock\u003c/code\u003e accept a timeout above\n:data:\u003ccode\u003ethreading.TIMEOUT_MAX\u003c/code\u003e instead of raising :class:\u003ccode\u003eOverflowError\u003c/code\u003e. :pr:\u003ccode\u003e780\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:meth:\u003ccode\u003e~filelock.BaseFileLock.acquire\u003c/code\u003e raises :class:\u003ccode\u003eValueError\u003c/code\u003e for a blocking \u003ccode\u003enan\u003c/code\u003e timeout or a \u003ccode\u003epoll_interval\u003c/code\u003e\nabove :data:\u003ccode\u003ethreading.TIMEOUT_MAX\u003c/code\u003e, and treats a :data:\u003ccode\u003emath.inf\u003c/code\u003e timeout like \u003ccode\u003e-1\u003c/code\u003e. :pr:\u003ccode\u003e781\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:class:\u003ccode\u003e~filelock.SoftFileLock\u003c/code\u003e and :class:\u003ccode\u003e~filelock.MarkerSoftFileLock\u003c/code\u003e treat a marker cut before its final newline as\nmalformed, so a crash-truncated record self-heals and a read mid-write no longer breaks a live lock. :pr:\u003ccode\u003e782\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:class:\u003ccode\u003e~filelock.UnixFileLock\u003c/code\u003e no longer deletes another process's live marker when it falls back to a soft lock on\n\u003ccode\u003eENOSYS\u003c/code\u003e, and on macOS a lock path ending in a separator raises :class:\u003ccode\u003eFileNotFoundError\u003c/code\u003e instead of retrying. :pr:\u003ccode\u003e785\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:class:\u003ccode\u003e~filelock.SoftFileLock\u003c/code\u003e and :class:\u003ccode\u003e~filelock.SoftFileLease\u003c/code\u003e put back a live successor's marker that a racing\nstale break moved aside, so a third contender no longer acquires beside the successor. :pr:\u003ccode\u003e786\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:class:\u003ccode\u003e~filelock.StrictSoftFileLock\u003c/code\u003e removes every claim a failed acquire published, counts an \u003ccode\u003eEEXIST\u003c/code\u003e link that\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/822d32b54d70027311e2190a86cb7f3c58439be4\"\u003e\u003ccode\u003e822d32b\u003c/code\u003e\u003c/a\u003e Release 4.0.11\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/47f036daea8f54e7b9b54b067e3122a05c4f5662\"\u003e\u003ccode\u003e47f036d\u003c/code\u003e\u003c/a\u003e fix(read-write): handle NetBSD fd limits\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/2e0abe5b915fbadbb1b21bc094800feb7e2b8e09\"\u003e\u003ccode\u003e2e0abe5\u003c/code\u003e\u003c/a\u003e docs: select an existing tox environment in contributing guide (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/767\"\u003e#767\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/1f0632b6bc047cf3481bbe740475be813013208e\"\u003e\u003ccode\u003e1f0632b\u003c/code\u003e\u003c/a\u003e Release 4.0.10\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/c9c65abadf1832d22e5901d6cd0e7010bd00db5c\"\u003e\u003ccode\u003ec9c65ab\u003c/code\u003e\u003c/a\u003e 🐛 fix(singleton): reject conflicting async and lease options (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/765\"\u003e#765\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/bc2405b882657b649fff86fe86ddd7883510393f\"\u003e\u003ccode\u003ebc2405b\u003c/code\u003e\u003c/a\u003e ♻️ refactor(util): test helpers via public locks (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/764\"\u003e#764\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/7b00bb81d41039f05173fb67876db196b9d8b007\"\u003e\u003ccode\u003e7b00bb8\u003c/code\u003e\u003c/a\u003e Release 4.0.9\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/49446241829b40fa2d156cae58a8433fec57f791\"\u003e\u003ccode\u003e4944624\u003c/code\u003e\u003c/a\u003e 🐛 fix(read-write): close db fd after connect (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/763\"\u003e#763\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/162060edb291d059c93c5ba41e5eb90829bf8796\"\u003e\u003ccode\u003e162060e\u003c/code\u003e\u003c/a\u003e 📝 docs(util): correct write and break guarantees (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/762\"\u003e#762\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/4d45e83caf7e31f9a12fb44526bdc07f70114f04\"\u003e\u003ccode\u003e4d45e83\u003c/code\u003e\u003c/a\u003e Merge commit from fork\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/tox-dev/py-filelock/compare/4.0.4...4.0.11\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `markupsafe` from 3.0.3 to 3.0.4\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pallets/markupsafe/releases\"\u003emarkupsafe's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e3.0.4\u003c/h2\u003e\n\u003cp\u003eThis is the MarkupSafe 3.0.4 fix release, which fixes bugs but does not otherwise change behavior and should not result in breaking changes compared to the latest feature release.\u003c/p\u003e\n\u003cp\u003ePyPI: \u003ca href=\"https://pypi.org/project/MarkupSafe/3.0.4/\"\u003ehttps://pypi.org/project/MarkupSafe/3.0.4/\u003c/a\u003e\nChanges: \u003ca href=\"https://markupsafe.palletsprojects.com/page/changes/#version-3-0-4\"\u003ehttps://markupsafe.palletsprojects.com/page/changes/#version-3-0-4\u003c/a\u003e\nMilestone: \u003ca href=\"https://github.com/pallets/markupsafe/milestone/17?closed=1\"\u003ehttps://github.com/pallets/markupsafe/milestone/17?closed=1\u003c/a\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eBuild Python 3.15, armv7l, ppc64le, Android, and iOS wheels.\u003c/li\u003e\n\u003cli\u003eImprove performance of \u003ccode\u003estriptags\u003c/code\u003e. \u003ca href=\"https://redirect.github.com/pallets/markupsafe/issues/521\"\u003e#521\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pallets/markupsafe/blob/main/CHANGES.rst\"\u003emarkupsafe's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003eVersion 3.0.4\u003c/h2\u003e\n\u003cp\u003eReleased 2026-10-02\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eBuild Python 3.15, armv7l, ppc64le, Android, and iOS wheels.\u003c/li\u003e\n\u003cli\u003eImprove performance of \u003ccode\u003estriptags\u003c/code\u003e. :issue:\u003ccode\u003e521\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pallets/markupsafe/commit/ece26078ec168ebac69f02877238e68d4b376c91\"\u003e\u003ccode\u003eece2607\u003c/code\u003e\u003c/a\u003e release version 3.0.4\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pallets/markupsafe/commit/620bc809d748de3a7848bdf7e27b1c2a2903aaf5\"\u003e\u003ccode\u003e620bc80\u003c/code\u003e\u003c/a\u003e split archs\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pallets/markupsafe/commit/73c3be1596906daf3e642e51852af5a019c5e1ea\"\u003e\u003ccode\u003e73c3be1\u003c/code\u003e\u003c/a\u003e fix wheel builds (\u003ca href=\"https://redirect.github.com/pallets/markupsafe/issues/536\"\u003e#536\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pallets/markupsafe/commit/d8ae19e6e45b5512472b74fe5c60b7f6aa18d70f\"\u003e\u003ccode\u003ed8ae19e\u003c/code\u003e\u003c/a\u003e fix wheel builds\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pallets/markupsafe/commit/ff1eaff921f92db57327752bbc37472d37fb9b21\"\u003e\u003ccode\u003eff1eaff\u003c/code\u003e\u003c/a\u003e Build Android and iOS wheels (\u003ca href=\"https://redirect.github.com/pallets/markupsafe/issues/516\"\u003e#516\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pallets/markupsafe/commit/87e64f9628c574bf91898f8642a21356cccaa58c\"\u003e\u003ccode\u003e87e64f9\u003c/code\u003e\u003c/a\u003e build Android and iOS wheels\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pallets/markupsafe/commit/bc33c55cb3078ba9f9b0950babb32f8d842f1267\"\u003e\u003ccode\u003ebc33c55\u003c/code\u003e\u003c/a\u003e Build ppc64le wheels (\u003ca href=\"https://redirect.github.com/pallets/markupsafe/issues/518\"\u003e#518\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pallets/markupsafe/commit/0ddd6eac9b20df52c75fae9181c0e73e195fa8d1\"\u003e\u003ccode\u003e0ddd6ea\u003c/code\u003e\u003c/a\u003e build ppc64le wheels\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pallets/markupsafe/commit/3e0775809b92150b10d1671ce1821ea6eb56be0c\"\u003e\u003ccode\u003e3e07758\u003c/code\u003e\u003c/a\u003e Build armv7l wheels (\u003ca href=\"https://redirect.github.com/pallets/markupsafe/issues/514\"\u003e#514\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pallets/markupsafe/commit/39b9aae5f1e70edc33f380b47d1bef0e281746b5\"\u003e\u003ccode\u003e39b9aae\u003c/code\u003e\u003c/a\u003e build armv7l wheels\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/pallets/markupsafe/compare/3.0.3...3.0.4\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `platformdirs` from 4.12.0 to 4.12.3\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/platformdirs/releases\"\u003eplatformdirs's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e4.12.3\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003ePlace root config and data files in the first site directory by \u003ca href=\"https://github.com/PDGGK\"\u003e\u003ccode\u003e@​PDGGK\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/607\"\u003etox-dev/platformdirs#607\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/PDGGK\"\u003e\u003ccode\u003e@​PDGGK\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/607\"\u003etox-dev/platformdirs#607\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/tox-dev/platformdirs/compare/4.12.2...4.12.3\"\u003ehttps://github.com/tox-dev/platformdirs/compare/4.12.2...4.12.3\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e4.12.2\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e🐛 fix(api): build site paths from site lists by \u003ca href=\"https://github.com/9Kun\"\u003e\u003ccode\u003e@​9Kun\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/604\"\u003etox-dev/platformdirs#604\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e♻️ refactor(api): share use_site iteration by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/606\"\u003etox-dev/platformdirs#606\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/9Kun\"\u003e\u003ccode\u003e@​9Kun\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/604\"\u003etox-dev/platformdirs#604\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/tox-dev/platformdirs/compare/4.12.1...4.12.2\"\u003ehttps://github.com/tox-dev/platformdirs/compare/4.12.1...4.12.2\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e4.12.1\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003efix(pytest): allow import before pytest startup by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/602\"\u003etox-dev/platformdirs#602\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/tox-dev/platformdirs/compare/4.12.0...4.12.1\"\u003ehttps://github.com/tox-dev/platformdirs/compare/4.12.0...4.12.1\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/platformdirs/blob/main/docs/changelog.rst\"\u003eplatformdirs's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e###########\nChangelog\n###########\u003c/p\u003e\n\u003cp\u003e.. towncrier-draft-entries:: Unreleased\u003c/p\u003e\n\u003cp\u003e.. towncrier release notes start\u003c/p\u003e\n\u003chr /\u003e\n\u003cp\u003e4.13.0 (2026-10-10)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eDetect Homebrew Python for the :class:\u003ccode\u003e~platformdirs.macos.MacOS\u003c/code\u003e site directories under :option:\u003ccode\u003epython:-S\u003c/code\u003e, which\nleaves :data:\u003ccode\u003esys.base_prefix\u003c/code\u003e on the \u003ccode\u003eCellar\u003c/code\u003e keg, and for the \u003ccode\u003epython-freethreading\u003c/code\u003e formula - by\n:user:\u003ccode\u003esricharanreddycheruku\u003c/code\u003e. :pr:\u003ccode\u003e612\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eUse Python 3.15 for development and automation. :pr:\u003ccode\u003e613\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.12.4 (2026-10-07)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eKeep site directories readable by other users when root calls\n:meth:\u003ccode\u003e~platformdirs.api.PlatformDirsABC.place_config_file\u003c/code\u003e or another \u003ccode\u003eplace_*_file\u003c/code\u003e method with\n:attr:\u003ccode\u003e~platformdirs.api.PlatformDirsABC.use_site_for_root\u003c/code\u003e - by :user:\u003ccode\u003edarrenhuai\u003c/code\u003e. :pr:\u003ccode\u003e610\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eMake :func:\u003ccode\u003e~platformdirs.user_runtime_dir\u003c/code\u003e warn and fall back from an unreachable \u003ccode\u003eXDG_RUNTIME_DIR\u003c/code\u003e under\n:attr:\u003ccode\u003e~platformdirs.api.PlatformDirsABC.ensure_exists\u003c/code\u003e instead of raising. :pr:\u003ccode\u003e611\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.12.3 (2026-10-03)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003ePlace files from \u003ccode\u003eplace_config_file\u003c/code\u003e and \u003ccode\u003eplace_data_file\u003c/code\u003e in the first site directory for root on Unix with\n\u003ccode\u003euse_site_for_root=True\u003c/code\u003e and \u003ccode\u003emultipath=True\u003c/code\u003e, where \u003ccode\u003efind_config_file\u003c/code\u003e and \u003ccode\u003efind_data_file\u003c/code\u003e look for them.\n:pr:\u003ccode\u003e607\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.12.2 (2026-09-29)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eKeep \u003ccode\u003eos.pathsep\u003c/code\u003e in \u003ccode\u003esite_applications_path\u003c/code\u003e under \u003ccode\u003emultipath=True\u003c/code\u003e on platforms with one applications\ndirectory. :pr:\u003ccode\u003e604\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.12.1 (2026-09-28)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eAvoid \u003ccode\u003ePytestAssertRewriteWarning\u003c/code\u003e when importing \u003ccode\u003eplatformdirs\u003c/code\u003e before invoking pytest. :pr:\u003ccode\u003e601\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.12.0 (2026-09-26)\u003c/p\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/960ff632eb575deb6f0d5bf49519d5a2ee2098b6\"\u003e\u003ccode\u003e960ff63\u003c/code\u003e\u003c/a\u003e Release 4.12.3\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/8047ad5bf0e5fd3db9c8ce9f250f73c3d961fe19\"\u003e\u003ccode\u003e8047ad5\u003c/code\u003e\u003c/a\u003e Place root config and data files in the first site directory (\u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/issues/607\"\u003e#607\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/af2fc7f3e0beee7f4672787152ff41c5c59e0909\"\u003e\u003ccode\u003eaf2fc7f\u003c/code\u003e\u003c/a\u003e Release 4.12.2\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/bdafa67c2d0f95e146bdd25c362ae80cd530b7e8\"\u003e\u003ccode\u003ebdafa67\u003c/code\u003e\u003c/a\u003e ♻️ refactor(api): share use_site iteration (\u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/issues/606\"\u003e#606\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/d5ff75cd1ad8ccec8ce275966fa8588608badd44\"\u003e\u003ccode\u003ed5ff75c\u003c/code\u003e\u003c/a\u003e 🐛 fix(api): keep os.pathsep in site_applications_path (\u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/issues/604\"\u003e#604\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/d5457447b05d745d65645b3a9aeecbe4a968865d\"\u003e\u003ccode\u003ed545744\u003c/code\u003e\u003c/a\u003e build(deps): bump astral-sh/setup-uv from 10.1.0 to 10.2.0 in the all group (...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/9fd89a77f53ebb8f61dede06a10301154d27fd41\"\u003e\u003ccode\u003e9fd89a7\u003c/code\u003e\u003c/a\u003e [pre-commit.ci] pre-commit autoupdate (\u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/issues/603\"\u003e#603\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/0a50795934584595a0076ccfa54166e00c31c066\"\u003e\u003ccode\u003e0a50795\u003c/code\u003e\u003c/a\u003e Release 4.12.1\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/72e93ffd58d1d63b00fc2937d4132fe9b481fcc9\"\u003e\u003ccode\u003e72e93ff\u003c/code\u003e\u003c/a\u003e fix(pytest): allow import before pytest startup (\u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/issues/602\"\u003e#602\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/tox-dev/platformdirs/compare/4.12.0...4.12.3\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `pytz` from 2026.4 to 2026.5\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/stub42/pytz/commit/21be17fe9b5334f51ac145d08dfc089b3c40b96f\"\u003e\u003ccode\u003e21be17f\u003c/code\u003e\u003c/a\u003e Add Python 3.14 to test suite\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/stub42/pytz/commit/fddd01c11ddbf65dea944e7a2fdb523327df3275\"\u003e\u003ccode\u003efddd01c\u003c/code\u003e\u003c/a\u003e Bump version numbers to 2026.5 (2026e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/stub42/pytz/commit/8f05ab3e7f1176950c9490692ffec74db5dd2b85\"\u003e\u003ccode\u003e8f05ab3\u003c/code\u003e\u003c/a\u003e IANA 2026e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/stub42/pytz/commit/d79605f8e4d65ab57b8cdf7eca535d3b4f4685e5\"\u003e\u003ccode\u003ed79605f\u003c/code\u003e\u003c/a\u003e Squashed 'tz/' changes from d633fe7ed3..db07415c7d\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/stub42/pytz/compare/release_2026.4...release_2026.5\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `tzd...\n\n_Description has been truncated_","html_url":"https://github.com/appeler/parsernaam/pull/27","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/appeler%2Fparsernaam/issues/27","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/27/packages"}],"issue_packages":[{"old_version":"20.29.3","new_version":"21.14.11","update_type":"major","path":null,"pr_created_at":"2026-10-19T19:24:24.000Z","version_change":"20.29.3 → 21.14.11","issue":{"uuid":"5930118870","node_id":"PR_kwDOOFT1Qs8AAAABJZ_v3w","number":193,"state":"open","title":"deps(deps-dev): bump virtualenv from 20.29.3 to 21.14.11","user":"dependabot[bot]","labels":[],"assignees":[],"locked":false,"comments_count":1,"pull_request":true,"closed_at":null,"author_association":null,"state_reason":null,"created_at":"2026-10-19T19:24:24.000Z","updated_at":"2026-10-19T19:24:27.000Z","time_to_close":null,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"deps(deps-dev)","packages":[{"name":"virtualenv","old_version":"20.29.3","new_version":"21.14.11","repository_url":"https://github.com/pypa/virtualenv"}],"path":null,"ecosystem":"pip"},"body":"Bumps [virtualenv](https://github.com/pypa/virtualenv) from 20.29.3 to 21.14.11.\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pypa/virtualenv/releases\"\u003evirtualenv's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e21.14.11\u003c/h2\u003e\n\u003ch1\u003eBugfixes - 21.14.11\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eSearch all directories supplied by repeated \u003ccode\u003e--extra-search-dir\u003c/code\u003e options instead of keeping only the last group.\n(\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3440\"\u003e#3440\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eOn Windows, the app data is now migrated into the nested cache directory instead of the migration failing with a\nwarning on every run. (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3441\"\u003e#3441\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003ca href=\"https://pypi.org/project/virtualenv/21.14.11/\"\u003ePyPI release\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.14.10...21.14.11\"\u003ehttps://github.com/pypa/virtualenv/compare/21.14.10...21.14.11\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e21.14.10\u003c/h2\u003e\n\u003ch1\u003eBugfixes - 21.14.10\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eAlways copy seed packages when app-data is temporary, including when symlink seeding is enabled through an environment\nvariable or configuration file. Seeded packages remain available after temporary cache cleanup. (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3437\"\u003e#3437\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003ca href=\"https://pypi.org/project/virtualenv/21.14.10/\"\u003ePyPI release\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.14.9...21.14.10\"\u003ehttps://github.com/pypa/virtualenv/compare/21.14.9...21.14.10\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e21.14.9\u003c/h2\u003e\n\u003ch1\u003eBugfixes - 21.14.9\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eParse \u003ccode\u003eVIRTUALENV_PERIODIC_UPDATE_INSECURE\u003c/code\u003e as a boolean, so \u003ccode\u003e0\u003c/code\u003e, \u003ccode\u003efalse\u003c/code\u003e, \u003ccode\u003eno\u003c/code\u003e and \u003ccode\u003eoff\u003c/code\u003e keep certificate\nverification enabled. (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3398\"\u003e#3398\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eReject destinations whose resolved path contains the platform's PATH separator, including separators inherited from\nthe working directory or a directory symlink. (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3399\"\u003e#3399\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ePreserve an existing \u003ccode\u003epyvenv.cfg\u003c/code\u003e when a prompt or configuration value cannot be encoded as UTF-8, instead of\nleaving the file empty after a failed environment creation. The file now ends its lines with LF on every platform.\u003c/p\u003e\n\u003cp\u003eDebug logs show each configuration line as a Python string literal, so control characters are visible. (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3400\"\u003e#3400\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSkip writing a \u003ccode\u003e.venv\u003c/code\u003e redirect when the environment name contains a line boundary. The environment is still\ncreated, and any existing redirect remains unchanged. (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3401\"\u003e#3401\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ePreserve non-ASCII values in \u003ccode\u003eactivate_this.py\u003c/code\u003e when applications read the script with a legacy text encoding before\nexecuting it. (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3402\"\u003e#3402\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eReject malformed seed versions and requirements ending in archive suffixes before starting pip, with an error\nidentifying the invalid value instead of a misleading download or local-file error. (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3403\"\u003e#3403\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAllow a literal percent sign as a csh prompt and preserve carets in tcsh prompt display instead of interpreting them\nas control-character notation.\u003c/p\u003e\n\u003cp\u003eSeparate csh history and prompt escapes from preceding non-ASCII text in legacy locales. (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3404\"\u003e#3404\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eReport an error when an existing \u003ccode\u003epyvenv.cfg\u003c/code\u003e is not a regular file, instead of trying to read or write directories,\npipes, or devices as configuration files. (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3405\"\u003e#3405\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pypa/virtualenv/blob/main/docs/changelog.rst\"\u003evirtualenv's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003eBugfixes - 21.14.11\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eSearch all directories supplied by repeated \u003ccode\u003e--extra-search-dir\u003c/code\u003e options instead of keeping only the last group.\n(:issue:\u003ccode\u003e3440\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eOn Windows, the app data is now migrated into the nested cache directory instead of the migration failing with a\nwarning on every run. (:issue:\u003ccode\u003e3441\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003ev21.14.10 (2026-10-17)\u003c/p\u003e\n\u003chr /\u003e\n\u003ch1\u003eBugfixes - 21.14.10\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eAlways copy seed packages when app-data is temporary, including when symlink seeding is enabled through an environment\nvariable or configuration file. Seeded packages remain available after temporary cache cleanup. (:issue:\u003ccode\u003e3437\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003ev21.14.9 (2026-10-17)\u003c/p\u003e\n\u003chr /\u003e\n\u003ch1\u003eBugfixes - 21.14.9\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eParse \u003ccode\u003eVIRTUALENV_PERIODIC_UPDATE_INSECURE\u003c/code\u003e as a boolean, so \u003ccode\u003e0\u003c/code\u003e, \u003ccode\u003efalse\u003c/code\u003e, \u003ccode\u003eno\u003c/code\u003e and \u003ccode\u003eoff\u003c/code\u003e keep certificate\nverification enabled. (:issue:\u003ccode\u003e3398\u003c/code\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eReject destinations whose resolved path contains the platform's PATH separator, including separators inherited from\nthe working directory or a directory symlink. (:issue:\u003ccode\u003e3399\u003c/code\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ePreserve an existing \u003ccode\u003epyvenv.cfg\u003c/code\u003e when a prompt or configuration value cannot be encoded as UTF-8, instead of\nleaving the file empty after a failed environment creation. The file now ends its lines with LF on every platform.\u003c/p\u003e\n\u003cp\u003eDebug logs show each configuration line as a Python string literal, so control characters are visible. (:issue:\u003ccode\u003e3400\u003c/code\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSkip writing a \u003ccode\u003e.venv\u003c/code\u003e redirect when the environment name contains a line boundary. The environment is still\ncreated, and any existing redirect remains unchanged. (:issue:\u003ccode\u003e3401\u003c/code\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ePreserve non-ASCII values in \u003ccode\u003eactivate_this.py\u003c/code\u003e when applications read the script with a legacy text encoding before\nexecuting it. (:issue:\u003ccode\u003e3402\u003c/code\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eReject malformed seed versions and requirements ending in archive suffixes before starting pip, with an error\nidentifying the invalid value instead of a misleading download or local-file error. (:issue:\u003ccode\u003e3403\u003c/code\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAllow a literal percent sign as a csh prompt and preserve carets in tcsh prompt display instead of interpreting them\nas control-character notation.\u003c/p\u003e\n\u003cp\u003eSeparate csh history and prompt escapes from preceding non-ASCII text in legacy locales. (:issue:\u003ccode\u003e3404\u003c/code\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eReport an error when an existing \u003ccode\u003epyvenv.cfg\u003c/code\u003e is not a regular file, instead of trying to read or write directories,\npipes, or devices as configuration files. (:issue:\u003ccode\u003e3405\u003c/code\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ePreserve percent-containing paths during batch reactivation and show dollar signs literally in command prompts. Skip\nbatch scripts for paths containing line boundaries, and remove stale batch scripts for unsupported paths even when\nonly other activators are selected. (:issue:\u003ccode\u003e3406\u003c/code\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/1d1231fb40ab795014108e8433bcb7b2f979facc\"\u003e\u003ccode\u003e1d1231f\u003c/code\u003e\u003c/a\u003e release 21.14.11\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/b83363bdcb28d104cd0491341772a9bc89ba0477\"\u003e\u003ccode\u003eb83363b\u003c/code\u003e\u003c/a\u003e 🐛 fix(app-data): migrate nested cache safely (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3441\"\u003e#3441\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/8a7de0a40461d3d6dc01aa260137d394432e7da0\"\u003e\u003ccode\u003e8a7de0a\u003c/code\u003e\u003c/a\u003e Fix repeated --extra-search-dir options (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3440\"\u003e#3440\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/236f395eba928d084d8d8fb6c3a7224555139056\"\u003e\u003ccode\u003e236f395\u003c/code\u003e\u003c/a\u003e release 21.14.10\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/cd774762a5e99cf8f07c993231242a44201f75bf\"\u003e\u003ccode\u003ecd77476\u003c/code\u003e\u003c/a\u003e 🐛 fix(test): exclude broken pytest-mock (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3438\"\u003e#3438\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/b81995c3feab9e1edb453c75ffc6616e1a77335e\"\u003e\u003ccode\u003eb81995c\u003c/code\u003e\u003c/a\u003e 🐛 fix(seed): copy from temporary app-data (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3437\"\u003e#3437\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/e53e30b9c8fbc3f4f502223819449ddc970fbbe8\"\u003e\u003ccode\u003ee53e30b\u003c/code\u003e\u003c/a\u003e release 21.14.9\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/2519941bed33ee0d3ac99277f67913e439e476a9\"\u003e\u003ccode\u003e2519941\u003c/code\u003e\u003c/a\u003e 🐛 fix(seed): preserve interpreter paths in console scripts (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3417\"\u003e#3417\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/70a010204e1adff2536222a00b19a529291b3256\"\u003e\u003ccode\u003e70a0102\u003c/code\u003e\u003c/a\u003e 🐛 fix(seed): preserve shared cache when reseeding with pip (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3423\"\u003e#3423\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/554d9f9d4f7758f5cf53f993031e29787f1f74c5\"\u003e\u003ccode\u003e554d9f9\u003c/code\u003e\u003c/a\u003e 🐛 fix(create): replace linked output directories (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3429\"\u003e#3429\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/pypa/virtualenv/compare/20.29.3...21.14.11\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=virtualenv\u0026package-manager=pip\u0026previous-version=20.29.3\u0026new-version=21.14.11)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n\n\n\u003c/details\u003e","html_url":"https://github.com/ahmed5145/retro_game_engine/pull/193","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/ahmed5145%2Fretro_game_engine/issues/193","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/193/packages"}},{"old_version":"21.14.2","new_version":"21.14.6","update_type":"patch","path":null,"pr_created_at":"2026-10-17T21:23:29.000Z","version_change":"21.14.2 → 21.14.6","issue":{"uuid":"5903237165","node_id":"PR_kwDOD8f9xs8AAAABJE3DGg","number":95,"state":"open","title":"Bump the python-packages group across 1 directory with 47 updates","user":"dependabot[bot]","labels":["dependencies","python:uv"],"assignees":[],"locked":false,"comments_count":1,"pull_request":true,"closed_at":null,"author_association":null,"state_reason":null,"created_at":"2026-10-17T21:23:29.000Z","updated_at":"2026-10-17T21:23:47.000Z","time_to_close":null,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"Bump","group_name":"python-packages","update_count":47,"packages":[{"name":"griffe-warnings-deprecated","old_version":"1.1.1","new_version":"1.1.2","repository_url":"https://github.com/mkdocstrings/griffe-warnings-deprecated"},{"name":"jupytext","old_version":"1.19.5","new_version":"1.19.6","repository_url":"https://github.com/jupytext/jupytext"},{"name":"jupyterlite","old_version":"0.8.5","new_version":"0.8.6","repository_url":"https://github.com/jupyterlite/jupyterlite"},{"name":"markdown-pycon","old_version":"1.0.1","new_version":"1.0.2","repository_url":"https://github.com/pawamoy/markdown-pycon"},{"name":"pymdown-extensions","old_version":"12.1","new_version":"12.2","repository_url":"https://github.com/facelessuser/pymdown-extensions"},{"name":"zensical","old_version":"0.0.67","new_version":"0.0.69","repository_url":"https://github.com/zensical/zensical"},{"name":"mypy","old_version":"2.3.1","new_version":"2.4.0","repository_url":"https://github.com/python/mypy"},{"name":"ruff","old_version":"0.16.10","new_version":"0.17.0","repository_url":"https://github.com/astral-sh/ruff"},{"name":"ty","old_version":"0.0.84","new_version":"0.0.86","repository_url":"https://github.com/astral-sh/ty"},{"name":"tox","old_version":"4.64.5","new_version":"4.65.2","repository_url":"https://github.com/tox-dev/tox"},{"name":"tox-uv","old_version":"1.36.0","new_version":"1.36.1","repository_url":"https://github.com/tox-dev/tox-uv"},{"name":"ast-serialize","old_version":"0.11.1","new_version":"0.12.1","repository_url":"https://github.com/mypyc/ast_serialize"},{"name":"cachetools","old_version":"7.1.8","new_version":"7.2.1","repository_url":"https://github.com/tkem/cachetools"},{"name":"charset-normalizer","old_version":"3.5.1","new_version":"3.5.2","repository_url":"https://github.com/jawah/charset_normalizer"},{"name":"coverage","old_version":"7.16.0","new_version":"7.16.2","repository_url":"https://github.com/coveragepy/coveragepy"},{"name":"executing","old_version":"2.2.1","new_version":"2.3.0","repository_url":"https://github.com/alexmojaki/executing"},{"name":"filelock","old_version":"4.0.12","new_version":"4.1.0","repository_url":"https://github.com/tox-dev/py-filelock"},{"name":"fonttools","old_version":"4.65.0","new_version":"4.66.1","repository_url":"https://github.com/fonttools/fonttools"},{"name":"fqdn","old_version":"1.5.1","new_version":"1.6.0","repository_url":"https://github.com/ypcrts/fqdn"},{"name":"griffelib","old_version":"2.3.0","new_version":"2.3.2"},{"name":"identify","old_version":"2.6.19","new_version":"2.6.20","repository_url":"https://github.com/pre-commit/identify"},{"name":"idna","old_version":"3.19","new_version":"3.20","repository_url":"https://github.com/kjd/idna"},{"name":"iniconfig","old_version":"2.3.0","new_version":"2.3.1","repository_url":"https://github.com/pytest-dev/iniconfig"},{"name":"json5","old_version":"0.15.0","new_version":"0.17.3","repository_url":"https://github.com/dpranke/pyjson5"},{"name":"jsonpointer","old_version":"3.1.1","new_version":"3.2.0","repository_url":"https://github.com/stefankoegl/python-json-pointer"},{"name":"jupyterlite-core","old_version":"0.8.5","new_version":"0.8.6","repository_url":"https://github.com/jupyterlite/jupyterlite"},{"name":"librt","old_version":"0.15.0","new_version":"0.16.0","repository_url":"https://github.com/mypyc/librt"},{"name":"markdown","old_version":"3.10.3","new_version":"3.11","repository_url":"https://github.com/Python-Markdown/markdown"},{"name":"markupsafe","old_version":"3.0.3","new_version":"3.0.4","repository_url":"https://github.com/pallets/markupsafe"},{"name":"mkdocstrings","old_version":"1.0.6","new_version":"1.0.7","repository_url":"https://github.com/mkdocstrings/mkdocstrings"},{"name":"mkdocstrings-python","old_version":"2.0.8","new_version":"2.0.9","repository_url":"https://github.com/mkdocstrings/python"},{"name":"mpmath","old_version":"1.3.0","new_version":"1.4.1","repository_url":"https://github.com/mpmath/mpmath"},{"name":"narwhals","old_version":"2.26.0","new_version":"2.27.1","repository_url":"https://github.com/narwhals-dev/narwhals"},{"name":"nodeenv","old_version":"1.10.0","new_version":"1.11.0","repository_url":"https://github.com/ekalinin/nodeenv"},{"name":"platformdirs","old_version":"4.11.8","new_version":"4.12.4","repository_url":"https://github.com/tox-dev/platformdirs"},{"name":"pycparser","old_version":"3.0","new_version":"3.11","repository_url":"https://github.com/eliben/pycparser"},{"name":"pyparsing","old_version":"3.3.2","new_version":"3.3.3","repository_url":"https://github.com/pyparsing/pyparsing"},{"name":"pyproject-api","old_version":"1.11.0","new_version":"1.11.5","repository_url":"https://github.com/tox-dev/pyproject-api"},{"name":"python-discovery","old_version":"1.6.0","new_version":"1.6.2","repository_url":"https://github.com/tox-dev/python-discovery"},{"name":"rpds-py","old_version":"2026.6.3","new_version":"2026.9.1","repository_url":"https://github.com/crate-py/rpds"},{"name":"soupsieve","old_version":"2.9.2","new_version":"2.10","repository_url":"https://github.com/facelessuser/soupsieve"},{"name":"tomli","old_version":"2.4.1","new_version":"2.5.0","repository_url":"https://github.com/hukkin/tomli"},{"name":"tox-uv-bare","old_version":"1.36.0","new_version":"1.36.1","repository_url":"https://github.com/tox-dev/tox-uv"},{"name":"tzdata","old_version":"2026.3","new_version":"2026.5","repository_url":"https://github.com/python/tzdata"},{"name":"uv","old_version":"0.12.19","new_version":"0.13.0","repository_url":"https://github.com/astral-sh/uv"},{"name":"virtualenv","old_version":"21.14.2","new_version":"21.14.6","repository_url":"https://github.com/pypa/virtualenv"},{"name":"wcwidth","old_version":"0.8.3","new_version":"0.9.2","repository_url":"https://github.com/jquast/wcwidth"}],"path":null,"ecosystem":"pip"},"body":"Bumps the python-packages group with 47 updates in the / directory:\n\n| Package | From | To |\n| --- | --- | --- |\n| [griffe-warnings-deprecated](https://github.com/mkdocstrings/griffe-warnings-deprecated) | `1.1.1` | `1.1.2` |\n| [jupytext](https://github.com/jupytext/jupytext) | `1.19.5` | `1.19.6` |\n| [jupyterlite](https://github.com/jupyterlite/jupyterlite) | `0.8.5` | `0.8.6` |\n| [markdown-pycon](https://github.com/pawamoy/markdown-pycon) | `1.0.1` | `1.0.2` |\n| [pymdown-extensions](https://github.com/facelessuser/pymdown-extensions) | `12.1` | `12.2` |\n| [zensical](https://github.com/zensical/zensical) | `0.0.67` | `0.0.69` |\n| [mypy](https://github.com/python/mypy) | `2.3.1` | `2.4.0` |\n| [ruff](https://github.com/astral-sh/ruff) | `0.16.10` | `0.17.0` |\n| [ty](https://github.com/astral-sh/ty) | `0.0.84` | `0.0.86` |\n| [tox](https://github.com/tox-dev/tox) | `4.64.5` | `4.65.2` |\n| [tox-uv](https://github.com/tox-dev/tox-uv) | `1.36.0` | `1.36.1` |\n| [ast-serialize](https://github.com/mypyc/ast_serialize) | `0.11.1` | `0.12.1` |\n| [cachetools](https://github.com/tkem/cachetools) | `7.1.8` | `7.2.1` |\n| [charset-normalizer](https://github.com/jawah/charset_normalizer) | `3.5.1` | `3.5.2` |\n| [coverage](https://github.com/coveragepy/coveragepy) | `7.16.0` | `7.16.2` |\n| [executing](https://github.com/alexmojaki/executing) | `2.2.1` | `2.3.0` |\n| [filelock](https://github.com/tox-dev/py-filelock) | `4.0.12` | `4.1.0` |\n| [fonttools](https://github.com/fonttools/fonttools) | `4.65.0` | `4.66.1` |\n| [fqdn](https://github.com/ypcrts/fqdn) | `1.5.1` | `1.6.0` |\n| griffelib | `2.3.0` | `2.3.2` |\n| [identify](https://github.com/pre-commit/identify) | `2.6.19` | `2.6.20` |\n| [idna](https://github.com/kjd/idna) | `3.19` | `3.20` |\n| [iniconfig](https://github.com/pytest-dev/iniconfig) | `2.3.0` | `2.3.1` |\n| [json5](https://github.com/dpranke/pyjson5) | `0.15.0` | `0.17.3` |\n| [jsonpointer](https://github.com/stefankoegl/python-json-pointer) | `3.1.1` | `3.2.0` |\n| [jupyterlite-core](https://github.com/jupyterlite/jupyterlite) | `0.8.5` | `0.8.6` |\n| [librt](https://github.com/mypyc/librt) | `0.15.0` | `0.16.0` |\n| [markdown](https://github.com/Python-Markdown/markdown) | `3.10.3` | `3.11` |\n| [markupsafe](https://github.com/pallets/markupsafe) | `3.0.3` | `3.0.4` |\n| [mkdocstrings](https://github.com/mkdocstrings/mkdocstrings) | `1.0.6` | `1.0.7` |\n| [mkdocstrings-python](https://github.com/mkdocstrings/python) | `2.0.8` | `2.0.9` |\n| [mpmath](https://github.com/mpmath/mpmath) | `1.3.0` | `1.4.1` |\n| [narwhals](https://github.com/narwhals-dev/narwhals) | `2.26.0` | `2.27.1` |\n| [nodeenv](https://github.com/ekalinin/nodeenv) | `1.10.0` | `1.11.0` |\n| [platformdirs](https://github.com/tox-dev/platformdirs) | `4.11.8` | `4.12.4` |\n| [pycparser](https://github.com/eliben/pycparser) | `3.0` | `3.11` |\n| [pyparsing](https://github.com/pyparsing/pyparsing) | `3.3.2` | `3.3.3` |\n| [pyproject-api](https://github.com/tox-dev/pyproject-api) | `1.11.0` | `1.11.5` |\n| [python-discovery](https://github.com/tox-dev/python-discovery) | `1.6.0` | `1.6.2` |\n| [rpds-py](https://github.com/crate-py/rpds) | `2026.6.3` | `2026.9.1` |\n| [soupsieve](https://github.com/facelessuser/soupsieve) | `2.9.2` | `2.10` |\n| [tomli](https://github.com/hukkin/tomli) | `2.4.1` | `2.5.0` |\n| [tox-uv-bare](https://github.com/tox-dev/tox-uv) | `1.36.0` | `1.36.1` |\n| [tzdata](https://github.com/python/tzdata) | `2026.3` | `2026.5` |\n| [uv](https://github.com/astral-sh/uv) | `0.12.19` | `0.13.0` |\n| [virtualenv](https://github.com/pypa/virtualenv) | `21.14.2` | `21.14.6` |\n| [wcwidth](https://github.com/jquast/wcwidth) | `0.8.3` | `0.9.2` |\n\n\nUpdates `griffe-warnings-deprecated` from 1.1.1 to 1.1.2\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/mkdocstrings/griffe-warnings-deprecated/releases\"\u003egriffe-warnings-deprecated's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e1.1.2\u003c/h2\u003e\n\u003ch2\u003e\u003ca href=\"https://github.com/mkdocstrings/griffe-warnings-deprecated/releases/tag/1.1.2\"\u003e1.1.2\u003c/a\u003e - 2026-10-06\u003c/h2\u003e\n\u003cp\u003e\u003c!-- raw HTML omitted --\u003e\u003ca href=\"https://github.com/mkdocstrings/griffe-warnings-deprecated/compare/1.1.1...1.1.2\"\u003eCompare with 1.1.1\u003c/a\u003e\u003c!-- raw HTML omitted --\u003e\u003c/p\u003e\n\u003ch3\u003eBuild\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eDrop support for Python 3.10 (\u003ca href=\"https://github.com/mkdocstrings/griffe-warnings-deprecated/commit/2cfb851cc7828652b2e0dfc919ade2fe2f25365a\"\u003e2cfb851\u003c/a\u003e by Timothée Mazzucotelli).\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/mkdocstrings/griffe-warnings-deprecated/blob/main/CHANGELOG.md\"\u003egriffe-warnings-deprecated's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e\u003ca href=\"https://github.com/mkdocstrings/griffe-warnings-deprecated/releases/tag/1.1.2\"\u003e1.1.2\u003c/a\u003e - 2026-10-06\u003c/h2\u003e\n\u003cp\u003e\u003c!-- raw HTML omitted --\u003e\u003ca href=\"https://github.com/mkdocstrings/griffe-warnings-deprecated/compare/1.1.1...1.1.2\"\u003eCompare with 1.1.1\u003c/a\u003e\u003c!-- raw HTML omitted --\u003e\u003c/p\u003e\n\u003ch3\u003eBuild\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eDrop support for Python 3.10 (\u003ca href=\"https://github.com/mkdocstrings/griffe-warnings-deprecated/commit/2cfb851cc7828652b2e0dfc919ade2fe2f25365a\"\u003e2cfb851\u003c/a\u003e by Timothée Mazzucotelli).\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mkdocstrings/griffe-warnings-deprecated/commit/cc3a695b7c1564a58d1d47c051a0637b6a795cad\"\u003e\u003ccode\u003ecc3a695\u003c/code\u003e\u003c/a\u003e chore: Prepare release 1.1.2\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mkdocstrings/griffe-warnings-deprecated/commit/058211c5d51c09cd0778f3cb7b55d0fa007a47eb\"\u003e\u003ccode\u003e058211c\u003c/code\u003e\u003c/a\u003e chore: Template upgrade\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mkdocstrings/griffe-warnings-deprecated/commit/2cfb851cc7828652b2e0dfc919ade2fe2f25365a\"\u003e\u003ccode\u003e2cfb851\u003c/code\u003e\u003c/a\u003e build: Drop support for Python 3.10\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mkdocstrings/griffe-warnings-deprecated/commit/138f8855e5288830792aa704c6e720179167a4c7\"\u003e\u003ccode\u003e138f885\u003c/code\u003e\u003c/a\u003e chore: Update sponsors section in README (\u003ca href=\"https://redirect.github.com/mkdocstrings/griffe-warnings-deprecated/issues/10\"\u003e#10\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mkdocstrings/griffe-warnings-deprecated/commit/db084e78b22f04c4419d6b0060004c98451cb32f\"\u003e\u003ccode\u003edb084e7\u003c/code\u003e\u003c/a\u003e chore: Lint\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mkdocstrings/griffe-warnings-deprecated/commit/8003436cba1f73aa062b7ef7cb27383e50726f08\"\u003e\u003ccode\u003e8003436\u003c/code\u003e\u003c/a\u003e chore: Template upgrade\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mkdocstrings/griffe-warnings-deprecated/commit/381ffc66a92ffd2e0ce37f25dc2df61d1d503dd4\"\u003e\u003ccode\u003e381ffc6\u003c/code\u003e\u003c/a\u003e Merge branch 'main' of github.com:mkdocstrings/griffe-typing-deprecated\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mkdocstrings/griffe-warnings-deprecated/commit/c4ed8a1b28c9508b28272211507b5d4804a817f0\"\u003e\u003ccode\u003ec4ed8a1\u003c/code\u003e\u003c/a\u003e chore: Template upgrade\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mkdocstrings/griffe-warnings-deprecated/commit/f84bf29728d49e1f307e5427aa7027b426ff5a52\"\u003e\u003ccode\u003ef84bf29\u003c/code\u003e\u003c/a\u003e chore: Update sponsors section in README (\u003ca href=\"https://redirect.github.com/mkdocstrings/griffe-warnings-deprecated/issues/9\"\u003e#9\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/mkdocstrings/griffe-warnings-deprecated/compare/1.1.1...1.1.2\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `jupytext` from 1.19.5 to 1.19.6\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/jupytext/jupytext/releases\"\u003ejupytext's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003eVersion 1.19.6\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eSecurity\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eThe Quarto conversions now run in a private temporary directory, so that the output file that \u003ccode\u003equarto convert\u003c/code\u003e names after its input can no longer be pre-created as a symlink by another user of the machine. Thanks to \u003ca href=\"https://github.com/nvxbug\"\u003eNaveed\u003c/a\u003e for the PR (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1615\"\u003e#1615\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003ePaired paths from notebook \u003ccode\u003eformats\u003c/code\u003e metadata are now prevented from escaping the working tree, including when an absolute notebook path is used. Thanks to \u003ca href=\"https://github.com/nvxbug\"\u003eNaveed\u003c/a\u003e for addressing the issue (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1588\"\u003e#1588\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003eThe CLI now ignores \u003ccode\u003etrusted\u003c/code\u003e cell metadata when the notebook signature is invalid, so a \u003ccode\u003etrusted=true\u003c/code\u003e option in a\npaired text file cannot make untrusted notebook outputs trusted during \u003ccode\u003e--sync\u003c/code\u003e. Thanks to \u003ca href=\"https://github.com/nvxbug\"\u003eNaveed\u003c/a\u003e for the fix (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1617\"\u003e#1617\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003eCustom \u003ccode\u003ecell_markers\u003c/code\u003e and \u003ccode\u003eendofcell\u003c/code\u003e values in the light format are now matched literally, preventing regular-expression\ninjection, parsing errors, and excessive processing time on crafted notebooks. This also fixes writing OCaml notebooks\nwith custom cell markers. Thanks to \u003ca href=\"https://github.com/nvxbug\"\u003eNaveed\u003c/a\u003e again for the PR  (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1618\"\u003e#1618\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003eWe have merged Dependabot security updates for the JupyterLab extension and the documentation website (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1614\"\u003e#1614\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1620\"\u003e#1620\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1622\"\u003e#1622\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1624\"\u003e#1624\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1634\"\u003e#1634\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1639\"\u003e#1639\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1642\"\u003e#1642\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1643\"\u003e#1643\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1647\"\u003e#1647\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1653\"\u003e#1653\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1654\"\u003e#1654\u003c/a\u003e).\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFixed\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eMenu entries such as \u0026quot;Rename Notebook…\u0026quot; name the file type again, instead of saying \u0026quot;default\u0026quot;. Thanks to \u003ca href=\"https://github.com/krassowski\"\u003eMichał Krassowski\u003c/a\u003e for this PR (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1632\"\u003e#1632\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003eMermaid \u003ccode\u003e%%\u003c/code\u003e comments inside a markdown cell are no longer mistaken for \u003ccode\u003epy:percent\u003c/code\u003e cell markers (\u003ca href=\"https://redirect.github.com/mwouts/jupytext/issues/1533\"\u003e#1533\u003c/a\u003e).  Thanks to \u003ca href=\"https://github.com/Sanjays2402\"\u003eSanjay Santhanam\u003c/a\u003e for his PR (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1609\"\u003e#1609\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eA whitespace-only final line in a percent-format cell is now preserved when reading and round-tripping the notebook (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/issues/1599\"\u003e#1599\u003c/a\u003e). Thanks to \u003ca href=\"https://github.com/lowbyteguy\"\u003elowbyteguy\u003c/a\u003e for the PR (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1610\"\u003e#1610\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003eThe JupyterLab extension's development install script now uses the correct \u003ccode\u003ejupyter-builder\u003c/code\u003e import (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1632\"\u003e#1632\u003c/a\u003e). Thanks again to \u003ca href=\"https://github.com/krassowski\"\u003eMichał Krassowski\u003c/a\u003e for this fix.\u003c/li\u003e\n\u003cli\u003eFixed JupyterLab extension build issues related to Yarn package checksums. Thanks to \u003ca href=\"https://github.com/mahendrapaipuri\"\u003eMahendra Paipuri\u003c/a\u003e for his contributions to \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1614\"\u003e#1614\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1620\"\u003e#1620\u003c/a\u003e, and \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1621\"\u003e#1621\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003eFixed pairing on Windows when a prefix root contains subdirectories, such as \u003ccode\u003enotebooks/tutorials///ipynb\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eChanged\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eUpdated the JupyterLab extension's production dependencies (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1621\"\u003e#1621\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1641\"\u003e#1641\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1652\"\u003e#1652\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003eUpdated the documentation website's Astro, Starlight, and Sharp dependencies (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1612\"\u003e#1612\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1621\"\u003e#1621\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1625\"\u003e#1625\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1641\"\u003e#1641\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1646\"\u003e#1646\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1650\"\u003e#1650\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1652\"\u003e#1652\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003eUpdated the GitHub Actions used for CI and publishing (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1613\"\u003e#1613\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1619\"\u003e#1619\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1633\"\u003e#1633\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1640\"\u003e#1640\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1649\"\u003e#1649\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1651\"\u003e#1651\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003eUpdated Jupyter Server in the Pixi environments. Thanks again to \u003ca href=\"https://github.com/mahendrapaipuri\"\u003eMahendra Paipuri\u003c/a\u003e for this update (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1646\"\u003e#1646\u003c/a\u003e).\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eAdded\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eWe have added a development container that can be opened with VS Code’s Dev Containers extension (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1655\"\u003e#1655\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003eAdded support for the Jenner language. Thanks to \u003ca href=\"https://github.com/lwsinclair\"\u003eLawrence Sinclair\u003c/a\u003e for this contribution (\u003ca href=\"https://redirect.github.com/mwouts/jupytext/pull/1493\"\u003e#1493\u003c/a\u003e).\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/jupytext/jupytext/blob/main/CHANGELOG.md\"\u003ejupytext's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e1.19.6 (2026-10-04)\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eSecurity\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eThe Quarto conversions now run in a private temporary directory, so that the output file that \u003ccode\u003equarto convert\u003c/code\u003e names after its input can no longer be pre-created as a symlink by another user of the machine. Thanks to \u003ca href=\"https://github.com/nvxbug\"\u003eNaveed\u003c/a\u003e for the PR (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1615\"\u003e#1615\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003ePaired paths from notebook \u003ccode\u003eformats\u003c/code\u003e metadata are now prevented from escaping the working tree, including when an absolute notebook path is used. Thanks to \u003ca href=\"https://github.com/nvxbug\"\u003eNaveed\u003c/a\u003e for addressing the issue (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1588\"\u003e#1588\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003eThe CLI now ignores \u003ccode\u003etrusted\u003c/code\u003e cell metadata when the notebook signature is invalid, so a \u003ccode\u003etrusted=true\u003c/code\u003e option in a\npaired text file cannot make untrusted notebook outputs trusted during \u003ccode\u003e--sync\u003c/code\u003e. Thanks to\n\u003ca href=\"https://github.com/nvxbug\"\u003eNaveed\u003c/a\u003e for the fix (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1617\"\u003e#1617\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003eCustom \u003ccode\u003ecell_markers\u003c/code\u003e and \u003ccode\u003eendofcell\u003c/code\u003e values in the light format are now matched literally, preventing regular-expression\ninjection, parsing errors, and excessive processing time on crafted notebooks. This also fixes writing OCaml notebooks\nwith custom cell markers. Thanks to \u003ca href=\"https://github.com/nvxbug\"\u003eNaveed\u003c/a\u003e again for the PR\n(\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1618\"\u003e#1618\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003eWe have merged Dependabot security updates for the JupyterLab extension and the documentation website\n(\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1614\"\u003e#1614\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1620\"\u003e#1620\u003c/a\u003e,\n\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1622\"\u003e#1622\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1624\"\u003e#1624\u003c/a\u003e,\n\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1634\"\u003e#1634\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1639\"\u003e#1639\u003c/a\u003e,\n\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1642\"\u003e#1642\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1643\"\u003e#1643\u003c/a\u003e,\n\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1647\"\u003e#1647\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1653\"\u003e#1653\u003c/a\u003e,\n\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1654\"\u003e#1654\u003c/a\u003e).\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFixed\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eMenu entries such as \u0026quot;Rename Notebook…\u0026quot; name the file type again, instead of saying \u0026quot;default\u0026quot;. Thanks to\n\u003ca href=\"https://github.com/krassowski\"\u003eMichał Krassowski\u003c/a\u003e for this PR (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1632\"\u003e#1632\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003eMermaid \u003ccode\u003e%%\u003c/code\u003e comments inside a markdown cell are no longer mistaken for \u003ccode\u003epy:percent\u003c/code\u003e cell markers (\u003ca href=\"https://redirect.github.com/mwouts/jupytext/issues/1533\"\u003e#1533\u003c/a\u003e).  Thanks to \u003ca href=\"https://github.com/Sanjays2402\"\u003eSanjay Santhanam\u003c/a\u003e for his PR (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1609\"\u003e#1609\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eA whitespace-only final line in a percent-format cell is now preserved when reading and round-tripping the notebook\n(\u003ca href=\"https://redirect.github.com/jupytext/jupytext/issues/1599\"\u003e#1599\u003c/a\u003e). Thanks to \u003ca href=\"https://github.com/lowbyteguy\"\u003elowbyteguy\u003c/a\u003e\nfor the PR (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1610\"\u003e#1610\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003eThe JupyterLab extension's development install script now uses the correct \u003ccode\u003ejupyter-builder\u003c/code\u003e import\n(\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1632\"\u003e#1632\u003c/a\u003e). Thanks again to \u003ca href=\"https://github.com/krassowski\"\u003eMichał Krassowski\u003c/a\u003e\nfor this fix.\u003c/li\u003e\n\u003cli\u003eFixed JupyterLab extension build issues related to Yarn package checksums. Thanks to\n\u003ca href=\"https://github.com/mahendrapaipuri\"\u003eMahendra Paipuri\u003c/a\u003e for his contributions to\n\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1614\"\u003e#1614\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1620\"\u003e#1620\u003c/a\u003e,\nand \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1621\"\u003e#1621\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003eFixed pairing on Windows when a prefix root contains subdirectories, such as \u003ccode\u003enotebooks/tutorials///ipynb\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eChanged\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eUpdated the JupyterLab extension's production dependencies\n(\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1621\"\u003e#1621\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1641\"\u003e#1641\u003c/a\u003e,\n\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1652\"\u003e#1652\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003eUpdated the documentation website's Astro, Starlight, and Sharp dependencies\n(\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1612\"\u003e#1612\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1621\"\u003e#1621\u003c/a\u003e,\n\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1625\"\u003e#1625\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1641\"\u003e#1641\u003c/a\u003e,\n\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1646\"\u003e#1646\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1650\"\u003e#1650\u003c/a\u003e,\n\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1652\"\u003e#1652\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003eUpdated the GitHub Actions used for CI and publishing\n(\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1613\"\u003e#1613\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1619\"\u003e#1619\u003c/a\u003e,\n\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1633\"\u003e#1633\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1640\"\u003e#1640\u003c/a\u003e,\n\u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1649\"\u003e#1649\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/jupytext/jupytext/pull/1651\"\u003e#1651\u003c/a\u003e).\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jupytext/jupytext/commit/9fccc3d85485e01264eb3454fae8c5ab4d093cfb\"\u003e\u003ccode\u003e9fccc3d\u003c/code\u003e\u003c/a\u003e Version 1.19.6 (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/issues/1656\"\u003e#1656\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jupytext/jupytext/commit/85c65a9b047d4393e8f7815a7da588239738865a\"\u003e\u003ccode\u003e85c65a9\u003c/code\u003e\u003c/a\u003e Add Jenner language support (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/issues/1493\"\u003e#1493\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jupytext/jupytext/commit/ca39ad2f71825484bd4d7b3299c21878d959a39a\"\u003e\u003ccode\u003eca39ad2\u003c/code\u003e\u003c/a\u003e Add development container (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/issues/1655\"\u003e#1655\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jupytext/jupytext/commit/0176ff2409af9b6c70e1556cee62403b7c388509\"\u003e\u003ccode\u003e0176ff2\u003c/code\u003e\u003c/a\u003e reject paired paths that escape the notebook directory tree (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/issues/1588\"\u003e#1588\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jupytext/jupytext/commit/1eb46537460ae668012f40ca992e96e10ce8f809\"\u003e\u003ccode\u003e1eb4653\u003c/code\u003e\u003c/a\u003e Ignore '%%' lines inside fenced blocks of py:percent markdown cells (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/issues/1609\"\u003e#1609\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jupytext/jupytext/commit/b1d7b6580ae338ea3c0ed9b938b0fac6d851f472\"\u003e\u003ccode\u003eb1d7b65\u003c/code\u003e\u003c/a\u003e build(deps): bump the jupytext-extension-security-updates group across 2 dire...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jupytext/jupytext/commit/85df69a0df63cd486403b6684cd4fd847354bdf4\"\u003e\u003ccode\u003e85df69a\u003c/code\u003e\u003c/a\u003e build(deps): bump the actions-dependencies group with 3 updates (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/issues/1651\"\u003e#1651\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jupytext/jupytext/commit/c3bb81dcc030ad7eda82b3915cf686ba9320f7af\"\u003e\u003ccode\u003ec3bb81d\u003c/code\u003e\u003c/a\u003e run quarto convert in a private temp directory (\u003ca href=\"https://redirect.github.com/jupytext/jupytext/issues/1615\"\u003e#1615\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jupytext/jupytext/commit/9bbd9906c1ca8a1d6c44f55b2a65ec32c14b1696\"\u003e\u003ccode\u003e9bbd990\u003c/code\u003e\u003c/a\u003e build(deps): bump the jupytext-extension-security-updates group across 1 dire...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jupytext/jupytext/commit/f96ae7d2268f889dfbbd0385134d2d92e3bc6cfa\"\u003e\u003ccode\u003ef96ae7d\u003c/code\u003e\u003c/a\u003e build(deps): bump the jupytext-extension-dependencies group across 2 director...\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/jupytext/jupytext/compare/v1.19.5...v1.19.6\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `jupyterlite` from 0.8.5 to 0.8.6\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/jupyterlite/jupyterlite/releases\"\u003ejupyterlite's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev0.8.6\u003c/h2\u003e\n\u003ch2\u003e0.8.6\u003c/h2\u003e\n\u003cp\u003e(\u003ca href=\"https://github.com/jupyterlite/jupyterlite/compare/@jupyterlite/application-extension@0.8.5...bd2c02332f8b9bc3d9c91309732ad2eee578dd7d\"\u003eFull Changelog\u003c/a\u003e)\u003c/p\u003e\n\u003ch3\u003eBugs fixed\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eFix service worker stdin replies being delivered to all pending requests \u003ca href=\"https://redirect.github.com/jupyterlite/jupyterlite/pull/2077\"\u003e#2077\u003c/a\u003e (\u003ca href=\"https://github.com/jtpio\"\u003e\u003ccode\u003e@​jtpio\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eContributors to this release\u003c/h3\u003e\n\u003cp\u003eThe following people contributed discussions, new ideas, code and documentation contributions, and review.\nSee \u003ca href=\"https://github-activity.readthedocs.io/en/latest/use/#how-does-this-tool-define-contributions-in-the-reports\"\u003eour definition of contributors\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://github.com/jupyterlite/jupyterlite/graphs/contributors?from=2026-09-28\u0026amp;to=2026-10-07\u0026amp;type=c\"\u003eGitHub contributors page for this release\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/jtpio\"\u003e\u003ccode\u003e@​jtpio\u003c/code\u003e\u003c/a\u003e (\u003ca href=\"https://github.com/search?q=repo%3Ajupyterlite%2Fjupyterlite+involves%3Ajtpio+updated%3A2026-09-28..2026-10-07\u0026amp;type=Issues\"\u003eactivity\u003c/a\u003e)\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/jupyterlite/jupyterlite/blob/@jupyterlite/types@0.8.6/docs/changelog.md\"\u003ejupyterlite's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e0.8.6\u003c/h2\u003e\n\u003cp\u003e(\u003ca href=\"https://github.com/jupyterlite/jupyterlite/compare/@jupyterlite/application-extension@0.8.5...bd2c02332f8b9bc3d9c91309732ad2eee578dd7d\"\u003eFull Changelog\u003c/a\u003e)\u003c/p\u003e\n\u003ch3\u003eBugs fixed\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eFix service worker stdin replies being delivered to all pending requests \u003ca href=\"https://redirect.github.com/jupyterlite/jupyterlite/pull/2077\"\u003e#2077\u003c/a\u003e (\u003ca href=\"https://github.com/jtpio\"\u003e\u003ccode\u003e@​jtpio\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eContributors to this release\u003c/h3\u003e\n\u003cp\u003eThe following people contributed discussions, new ideas, code and documentation contributions, and review.\nSee \u003ca href=\"https://github-activity.readthedocs.io/en/latest/use/#how-does-this-tool-define-contributions-in-the-reports\"\u003eour definition of contributors\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://github.com/jupyterlite/jupyterlite/graphs/contributors?from=2026-09-28\u0026amp;to=2026-10-07\u0026amp;type=c\"\u003eGitHub contributors page for this release\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/jtpio\"\u003e\u003ccode\u003e@​jtpio\u003c/code\u003e\u003c/a\u003e (\u003ca href=\"https://github.com/search?q=repo%3Ajupyterlite%2Fjupyterlite+involves%3Ajtpio+updated%3A2026-09-28..2026-10-07\u0026amp;type=Issues\"\u003eactivity\u003c/a\u003e)\u003c/p\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jupyterlite/jupyterlite/commit/337b8a74476f8c68793e2e7bd163d471ad4466ad\"\u003e\u003ccode\u003e337b8a7\u003c/code\u003e\u003c/a\u003e Publish 0.8.6\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jupyterlite/jupyterlite/commit/bd2c02332f8b9bc3d9c91309732ad2eee578dd7d\"\u003e\u003ccode\u003ebd2c023\u003c/code\u003e\u003c/a\u003e Backport PR \u003ca href=\"https://redirect.github.com/jupyterlite/jupyterlite/issues/2077\"\u003e#2077\u003c/a\u003e: Fix service worker stdin replies being delivered to all pe...\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/jupyterlite/jupyterlite/compare/@jupyterlite/types@0.8.5...@jupyterlite/types@0.8.6\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `markdown-pycon` from 1.0.1 to 1.0.2\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pawamoy/markdown-pycon/releases\"\u003emarkdown-pycon's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e1.0.2\u003c/h2\u003e\n\u003ch2\u003e\u003ca href=\"https://github.com/pawamoy/markdown-pycon/releases/tag/1.0.2\"\u003e1.0.2\u003c/a\u003e - 2026-10-06\u003c/h2\u003e\n\u003cp\u003e\u003c!-- raw HTML omitted --\u003e\u003ca href=\"https://github.com/pawamoy/markdown-pycon/compare/1.0.1...1.0.2\"\u003eCompare with 1.0.1\u003c/a\u003e\u003c!-- raw HTML omitted --\u003e\u003c/p\u003e\n\u003ch3\u003eBuild\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eDrop support for Python 3.10 (\u003ca href=\"https://github.com/pawamoy/markdown-pycon/commit/805934803b8a1401cac64b946e5d901b2b09e3a3\"\u003e8059348\u003c/a\u003e by Timothée Mazzucotelli).\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pawamoy/markdown-pycon/blob/main/CHANGELOG.md\"\u003emarkdown-pycon's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e\u003ca href=\"https://github.com/pawamoy/markdown-pycon/releases/tag/1.0.2\"\u003e1.0.2\u003c/a\u003e - 2026-10-06\u003c/h2\u003e\n\u003cp\u003e\u003c!-- raw HTML omitted --\u003e\u003ca href=\"https://github.com/pawamoy/markdown-pycon/compare/1.0.1...1.0.2\"\u003eCompare with 1.0.1\u003c/a\u003e\u003c!-- raw HTML omitted --\u003e\u003c/p\u003e\n\u003ch3\u003eBuild\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eDrop support for Python 3.10 (\u003ca href=\"https://github.com/pawamoy/markdown-pycon/commit/805934803b8a1401cac64b946e5d901b2b09e3a3\"\u003e8059348\u003c/a\u003e by Timothée Mazzucotelli).\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pawamoy/markdown-pycon/commit/0175927609fbcdd6da7d1d4e95c470d452686b93\"\u003e\u003ccode\u003e0175927\u003c/code\u003e\u003c/a\u003e chore: Prepare release 1.0.2\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pawamoy/markdown-pycon/commit/6efbfe1378d754004469bab6b87aa54932dc017e\"\u003e\u003ccode\u003e6efbfe1\u003c/code\u003e\u003c/a\u003e chore: Template upgrade\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pawamoy/markdown-pycon/commit/805934803b8a1401cac64b946e5d901b2b09e3a3\"\u003e\u003ccode\u003e8059348\u003c/code\u003e\u003c/a\u003e build: Drop support for Python 3.10\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pawamoy/markdown-pycon/commit/aa5daa217a4e299a7fcc44ca541564367ac9036b\"\u003e\u003ccode\u003eaa5daa2\u003c/code\u003e\u003c/a\u003e chore: Lint\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pawamoy/markdown-pycon/commit/e916742421d4489518a43f53b6705aedaf37ea79\"\u003e\u003ccode\u003ee916742\u003c/code\u003e\u003c/a\u003e chore: Template upgrade\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/pawamoy/markdown-pycon/compare/1.0.1...1.0.2\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `pymdown-extensions` from 12.1 to 12.2\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/facelessuser/pymdown-extensions/releases\"\u003epymdown-extensions's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e12.2\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eNEW\u003c/strong\u003e: Add official support for Python 3.15.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eNEW\u003c/strong\u003e: Tilde, Caret: For backwards compatibility, disable CommonMark punctuation rules by default. If subscript or\nsuperscript is disabled in the respective extension, CommonMark rules will be honored again. A new \u003ccode\u003epunctuation\u003c/code\u003e\nrule has been added to force CommonMark rules. When done, people will need to be aware of punctuation when subscript\nor superscript is enabled and escape any that violates CommonMark rules.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eNEW\u003c/strong\u003e: Highlight: Highlight now allows in the \u003ccode\u003eauto_title_map\u003c/code\u003e specifying the title as a simple string or a\ndictionary containing the title and the title mode: either \u003ccode\u003etext\u003c/code\u003e or \u003ccode\u003ehtml\u003c/code\u003e, with \u003ccode\u003etext\u003c/code\u003e being the default. This\nallows a title to be specified and treated as HTML when the mode is \u003ccode\u003ehtml\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eNEW\u003c/strong\u003e: SuperFences: Add new \u003ccode\u003etitle_mode\u003c/code\u003e option for Pygments fenced blocks that allows a user to specify a title\nto be treated as HTML via \u003ccode\u003etitle_mode=\u0026quot;html\u0026quot;\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/facelessuser/pymdown-extensions/commit/a656909d439b5570f12f9069d67adf163c8506b9\"\u003e\u003ccode\u003ea656909\u003c/code\u003e\u003c/a\u003e Docs: Fix duplicate word\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/facelessuser/pymdown-extensions/commit/0b905467cca69ac91aa4a9b0e5aa75abd93d6ede\"\u003e\u003ccode\u003e0b90546\u003c/code\u003e\u003c/a\u003e Revert \u0026quot;Fix lint\u0026quot;\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/facelessuser/pymdown-extensions/commit/11fbe9f174beff658efaa05c958257e69c147aa3\"\u003e\u003ccode\u003e11fbe9f\u003c/code\u003e\u003c/a\u003e Revert \u0026quot;Drop Python 3.10 support\u0026quot;\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/facelessuser/pymdown-extensions/commit/3b5e585144686c9ceae68ded8ce4f271332d779f\"\u003e\u003ccode\u003e3b5e585\u003c/code\u003e\u003c/a\u003e Docs: Fix grammar\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/facelessuser/pymdown-extensions/commit/91ec2a842a736f7f47b84850d8ffbb43d69b6c74\"\u003e\u003ccode\u003e91ec2a8\u003c/code\u003e\u003c/a\u003e Docs: Fix default admonition/details styling\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/facelessuser/pymdown-extensions/commit/5d7efe44e03c9ff3bbd852fc7b44610210cc1ca7\"\u003e\u003ccode\u003e5d7efe4\u003c/code\u003e\u003c/a\u003e Docs: update js dependencies\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/facelessuser/pymdown-extensions/commit/195228a75fb7b739275ff3af1a6f343e51cf1bf9\"\u003e\u003ccode\u003e195228a\u003c/code\u003e\u003c/a\u003e Fix lint\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/facelessuser/pymdown-extensions/commit/ff07dc2722d1ea9c1fc780355fd39b329929570a\"\u003e\u003ccode\u003eff07dc2\u003c/code\u003e\u003c/a\u003e Drop Python 3.10 support\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/facelessuser/pymdown-extensions/commit/848c5029ada0a8c13bf725c3421ddbd2633fb1eb\"\u003e\u003ccode\u003e848c502\u003c/code\u003e\u003c/a\u003e Add title mode configuration to SuperFences and Highlight\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/facelessuser/pymdown-extensions/commit/881c052ff78a87ed02d263239a6c08e0d12f9ed4\"\u003e\u003ccode\u003e881c052\u003c/code\u003e\u003c/a\u003e Tilde/Caret punctuation rule adjustments (\u003ca href=\"https://redirect.github.com/facelessuser/pymdown-extensions/issues/2986\"\u003e#2986\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/facelessuser/pymdown-extensions/compare/12.1...12.2\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `zensical` from 0.0.67 to 0.0.69\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/zensical/zensical/releases\"\u003ezensical's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e0.0.69\u003c/h2\u003e\n\u003ch2\u003eSummary\u003c/h2\u003e\n\u003cp\u003eThis version adds MkDocs plugin replacements for \u003ccode\u003enav-weight\u003c/code\u003e and \u003ccode\u003emarkdownextradata\u003c/code\u003e, improves symlink watching, fixes minification crashes with Unicode, and preserves emojis in \u003ccode\u003ellmstxt\u003c/code\u003e exports.\u003c/p\u003e\n\u003cp\u003eThe user interface is updated to \u003ca href=\"https://github.com/zensical/ui/releases/tag/v0.0.36\"\u003ev0.0.36\u003c/a\u003e, improving navigation spacing and fixing instant navigation.\u003c/p\u003e\n\u003ch2\u003eChangelog\u003c/h2\u003e\n\u003ch3\u003eFeatures\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e2225649 \u003cstrong\u003ezensical\u003c/strong\u003e, \u003cstrong\u003ecompat\u003c/strong\u003e – support mkdocs-nav-weight plugin\u003c/li\u003e\n\u003cli\u003e8e96dd1 \u003cstrong\u003ecompat\u003c/strong\u003e – support mkdocs-markdownextradata plugin\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eBug fixes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e3f5f089 \u003cstrong\u003ezensical\u003c/strong\u003e – preserve emojis in llmstxt output (\u003ca href=\"https://redirect.github.com/zensical/zensical/issues/1019\"\u003e#1019\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e389ad14 \u003cstrong\u003eui\u003c/strong\u003e – update ui to v0.0.36\u003c/li\u003e\n\u003cli\u003eb976a85 \u003cstrong\u003ezensical\u003c/strong\u003e, \u003cstrong\u003ecompat\u003c/strong\u003e – don't panic on multi-byte characters in HTML attribute values during minification (\u003ca href=\"https://redirect.github.com/zensical/zensical/issues/1013\"\u003e#1013\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e7b22d2a \u003cstrong\u003ezensical-watch\u003c/strong\u003e, \u003cstrong\u003ecompat\u003c/strong\u003e – include all files from watched directory symlinks\u003c/li\u003e\n\u003cli\u003e4924fea \u003cstrong\u003ezensical\u003c/strong\u003e, \u003cstrong\u003ecompat\u003c/strong\u003e – handle symlinked files in watched dependencies (\u003ca href=\"https://redirect.github.com/zensical/zensical/issues/1010\"\u003e#1010\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e0.0.68\u003c/h2\u003e\n\u003ch2\u003eSummary\u003c/h2\u003e\n\u003cp\u003eThis version adds native replacements for the \u003ccode\u003eaudio\u003c/code\u003e and \u003ccode\u003evideo\u003c/code\u003e MkDocs plugins and improves compatibility with the \u003ccode\u003emacros\u003c/code\u003e plugin. The user interface is updated to \u003ca href=\"https://github.com/zensical/ui/releases/tag/v0.0.35\"\u003ev0.0.35\u003c/a\u003e, bringing instant navigation to search results, consistent skip links, and corrected accessibility labels for overlays and progress indicators.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ePython 3.11 or newer is now required.\u003c/strong\u003e Support for Python 3.10 has been removed.\u003c/p\u003e\n\u003ch2\u003eChangelog\u003c/h2\u003e\n\u003ch3\u003eFeatures\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e00fe88a \u003cstrong\u003ecompat\u003c/strong\u003e – add \u003ccode\u003eaudio\u003c/code\u003e and \u003ccode\u003evideo\u003c/code\u003e MkDocs plugin replacement\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eBug fixes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e7662853 \u003cstrong\u003eui\u003c/strong\u003e – update ui to v0.0.35\u003c/li\u003e\n\u003cli\u003eacee50c \u003cstrong\u003ezensical\u003c/strong\u003e, \u003cstrong\u003ecompat\u003c/strong\u003e – mirror \u003ccode\u003emacros\u003c/code\u003e plugin behavior more closely (\u003ca href=\"https://redirect.github.com/zensical/zensical/issues/999\"\u003e#999\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/zensical/zensical/commit/de3702c2df5257c42501163af0afbd765714824a\"\u003e\u003ccode\u003ede3702c\u003c/code\u003e\u003c/a\u003e chore: release v0.0.69\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/zensical/zensical/commit/3f5f0895abf829110e69d79aed666ba8e127974d\"\u003e\u003ccode\u003e3f5f089\u003c/code\u003e\u003c/a\u003e fix: preserve emojis in llmstxt output (\u003ca href=\"https://redirect.github.com/zensical/zensical/issues/1019\"\u003e#1019\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/zensical/zensical/commit/389ad141a22430a1c7b26952ede61ec4a2d82484\"\u003e\u003ccode\u003e389ad14\u003c/code\u003e\u003c/a\u003e fix: update ui to v0.0.36\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/zensical/zensical/commit/b976a85ae8ed628577fbb3c5b2604ab4cb3db9e2\"\u003e\u003ccode\u003eb976a85\u003c/code\u003e\u003c/a\u003e fix: don't panic on multi-byte characters in HTML attribute values during min...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/zensical/zensical/commit/7b22d2a7d6fd9e017d87143781cd86bd6a7a737f\"\u003e\u003ccode\u003e7b22d2a\u003c/code\u003e\u003c/a\u003e fix: include all files from watched directory symlinks\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/zensical/zensical/commit/222564914708c532dd189e4d5647becdd1d56648\"\u003e\u003ccode\u003e2225649\u003c/code\u003e\u003c/a\u003e feature: support mkdocs-nav-weight plugin\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/zensical/zensical/commit/4924feab39077d72c99c19a33a76fad261f9252d\"\u003e\u003ccode\u003e4924fea\u003c/code\u003e\u003c/a\u003e fix: handle symlinked files in watched dependencies (\u003ca href=\"https://redirect.github.com/zensical/zensical/issues/1010\"\u003e#1010\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/zensical/zensical/commit/8e96dd1038e2f6a86e2f4873a38b9a8b55d2d72d\"\u003e\u003ccode\u003e8e96dd1\u003c/code\u003e\u003c/a\u003e feature: support mkdocs-markdownextradata plugin\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/zensical/zensical/commit/d210186d9d3656238697c3a2ee529807d3496c2d\"\u003e\u003ccode\u003ed210186\u003c/code\u003e\u003c/a\u003e chore: release v0.0.68\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/zensical/zensical/commit/00fe88abf71a02a2c6c19f29812e5d1347c99b4a\"\u003e\u003ccode\u003e00fe88a\u003c/code\u003e\u003c/a\u003e feature: add audio and video media extension\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/zensical/zensical/compare/v0.0.67...v0.0.69\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `mypy` from 2.3.1 to 2.4.0\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/python/mypy/blob/master/CHANGELOG.md\"\u003emypy's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003eMypy Release Notes\u003c/h1\u003e\n\u003ch2\u003eNext Release\u003c/h2\u003e\n\u003ch2\u003eMypy 2.4\u003c/h2\u003e\n\u003cp\u003eWe've just uploaded mypy 2.4.0 to the Python Package Index (\u003ca href=\"https://pypi.org/project/mypy/\"\u003ePyPI\u003c/a\u003e).\nMypy is a static type checker for Python. This release includes new features, performance\nimprovements and bug fixes. You can install it as follows:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003epython3 -m pip install -U mypy\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eYou can read the full documentation for this release on \u003ca href=\"http://mypy.readthedocs.io\"\u003eRead the Docs\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003ePython 3.15 Support\u003c/h3\u003e\n\u003cp\u003eMypy 2.4 supports running on Python 3.15 and type checking most Python\n3.15 features. This includes the new builtin \u003ccode\u003esentinel\u003c/code\u003e type for\nsentinel values (PEP 661), which mypy now supports (see below for\ndetails). Lazy imports (PEP 810) and unpacking in comprehensions\n(PEP 798) are also supported. Closed TypedDicts (PEP 728) have been\nsupported since mypy 2.2, but the \u003ccode\u003eextra_items\u003c/code\u003e TypedDict argument,\nalso introduced in PEP 728, is still unsupported. Support for\n\u003ccode\u003eextra_items\u003c/code\u003e will be added in a future mypy release.\u003c/p\u003e\n\u003ch3\u003eNative Parser Enabled by Default\u003c/h3\u003e\n\u003cp\u003eMypy now uses the new native parser by default. It's based on the Ruff\nparser, and it's significantly faster than the legacy parser, which\nuses the stdlib \u003ccode\u003east\u003c/code\u003e module. The native parser also has other\nbenefits:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eYou can target newer Python versions and use recent Python syntax\neven when running mypy on an older Python version. For example, you\ncan use \u003ccode\u003e--python-version 3.15\u003c/code\u003e when running mypy on Python 3.14.\u003c/li\u003e\n\u003cli\u003eStub files can use syntax that is newer than the target Python\nversion. For example, stubs can use the PEP 695 generic class syntax\n(\u003ccode\u003eclass Box[T]: ...\u003c/code\u003e) when running on or targeting Python 3.10.\u003c/li\u003e\n\u003cli\u003eParallel type checking requires the native parser.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe legacy parser is still available through \u003ccode\u003e--no-native-parser\u003c/code\u003e, or\n\u003ccode\u003enative_parser = False\u003c/code\u003e in the config file (\u003ccode\u003enative_parser = false\u003c/code\u003e\nunder \u003ccode\u003e[tool.mypy]\u003c/code\u003e in pyproject.toml). We are planning to remove the\nlegacy parser in early 2027. If you run into a problem with the native\nparser, please report it on the\n\u003ca href=\"https://github.com/python/mypy/issues\"\u003eissue tracker\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eUnlike the legacy parser, the native parser doesn't support type\ncomments for variables defined by \u003ccode\u003efor\u003c/code\u003e and \u003ccode\u003ewith\u003c/code\u003e statements. These\ntype comments are silently ignored, and the types of the variables are\u003c/p\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/935ba8afba7ceacca0651579450c74339f343016\"\u003e\u003ccode\u003e935ba8a\u003c/code\u003e\u003c/a\u003e Bump version to 2.4.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/334a678967dc6bcda3d3f8cb82e253dd61fa2be9\"\u003e\u003ccode\u003e334a678\u003c/code\u003e\u003c/a\u003e Add link for PR 22066 in mypy 2.4 changelog (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22082\"\u003e#22082\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/fe69660bcdaa76cccb1aedbb4b9c1c7627215571\"\u003e\u003ccode\u003efe69660\u003c/code\u003e\u003c/a\u003e Finalize mypy 2.4 changelog (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22080\"\u003e#22080\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/541fd87ac53581fb3c511b277fd780ec4e869c95\"\u003e\u003ccode\u003e541fd87\u003c/code\u003e\u003c/a\u003e Various mypy 2.4 changelog updates (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22077\"\u003e#22077\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/b231182c0b2993918f74594236bda7d3ec6fcbe5\"\u003e\u003ccode\u003eb231182\u003c/code\u003e\u003c/a\u003e Update native parser docs (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22078\"\u003e#22078\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/04fe42ce217f120a4de2c1fd62b71ef77452d699\"\u003e\u003ccode\u003e04fe42c\u003c/code\u003e\u003c/a\u003e Initial Changelog for Mypy 2.4 (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22071\"\u003e#22071\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/06174941bca0e88567441ee3cb0ffaef0dd22e2c\"\u003e\u003ccode\u003e0617494\u003c/code\u003e\u003c/a\u003e Quick fix for non UTF-8 encodings with new parser (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22066\"\u003e#22066\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/b2f9b60eae5ac7cd9c6a60650b128815bb703daf\"\u003e\u003ccode\u003eb2f9b60\u003c/code\u003e\u003c/a\u003e Bump librt to 0.16.0 (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22067\"\u003e#22067\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/9d798dcb9589f9bd62e625a97d8db23ad9a678fa\"\u003e\u003ccode\u003e9d798dc\u003c/code\u003e\u003c/a\u003e Sync typeshed (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22054\"\u003e#22054\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/0861bb6450d6d3658e44dbca9cd2ba478faf3c1d\"\u003e\u003ccode\u003e0861bb6\u003c/code\u003e\u003c/a\u003e Reduce max protocol stack size to 20 (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22053\"\u003e#22053\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/python/mypy/compare/v2.3.1...v2.4.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `ruff` from 0.16.10 to 0.17.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/astral-sh/ruff/releases\"\u003eruff's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e0.17.0\u003c/h2\u003e\n\u003ch2\u003eRelease Notes\u003c/h2\u003e\n\u003cp\u003eReleased on 2026-10-09.\u003c/p\u003e\n\u003cp\u003eThe executables in our macOS and Windows release archives and \u003ccode\u003eruff\u003c/code\u003e wheels are now code-signed. macOS executables are signed with an Apple Developer ID certificate and notarized by Apple. Windows executables have timestamped Authenticode signatures from Azure Artifact Signing. This enables verification of the release publisher and binary integrity, supports publisher-based allowlisting, and should reduce security warnings and antivirus false positives.\u003c/p\u003e\n\u003ch3\u003eBreaking changes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate the default and latest Python versions for 3.15 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28792\"\u003e#28792\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eRuff now defaults to Python 3.11 instead of 3.10 when no Python version is configured through \u003ca href=\"https://docs.astral.sh/ruff/settings/#target-version\"\u003e\u003ccode\u003etarget-version\u003c/code\u003e\u003c/a\u003e or \u003ca href=\"https://docs.astral.sh/ruff/configuration/#inferring-the-python-version\"\u003e\u003ccode\u003erequires-python\u003c/code\u003e\u003c/a\u003e. When checking for syntax errors without a configured Python version, Ruff now defaults to Python 3.15 instead of 3.14.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate the default rule set (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28786\"\u003e#28786\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eSeveral of the \u003ccode\u003eflake8-datetimez\u003c/code\u003e rules (\u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-without-tzinfo/\"\u003e\u003ccode\u003eDTZ001\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-now-without-tzinfo/\"\u003e\u003ccode\u003eDTZ005\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-fromtimestamp/\"\u003e\u003ccode\u003eDTZ006\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-strptime-without-zone/\"\u003e\u003ccode\u003eDTZ007\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://docs.astral.sh/ruff/rules/call-date-today/\"\u003e\u003ccode\u003eDTZ011\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://docs.astral.sh/ruff/rules/call-date-fromtimestamp/\"\u003e\u003ccode\u003eDTZ012\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://docs.astral.sh/ruff/rules/datetime-min-max/\"\u003e\u003ccode\u003eDTZ901\u003c/code\u003e\u003c/a\u003e) are no longer enabled by default, while \u003ca href=\"https://docs.astral.sh/ruff/rules/undefined-local-with-nested-import-star-usage/\"\u003e\u003ccode\u003eundefined-local-with-nested-import-star-usage\u003c/code\u003e\u003c/a\u003e (\u003ccode\u003eF406\u003c/code\u003e), which corresponds to a syntax error, is now enabled by default.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate Rust crate quick-junit to 0.8.0 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/27295\"\u003e#27295\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eJUnit output now uses a \u003ccode\u003eskipped\u003c/code\u003e attribute instead of \u003ccode\u003edisabled\u003c/code\u003e on \u003ccode\u003e\u0026lt;testsuite\u0026gt;\u003c/code\u003e elements and includes a \u003ccode\u003eskipped\u003c/code\u003e attribute on the root \u003ccode\u003e\u0026lt;testsuites\u0026gt;\u003c/code\u003e element.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e[\u003ccode\u003eflake8-import-conventions\u003c/code\u003e] Add \u003ccode\u003edatetime as dt\u003c/code\u003e as a conventional alias (\u003ccode\u003eICN001\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28790\"\u003e#28790\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSupport Unicode dummy variable names (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28722\"\u003e#28722\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eThe default \u003ca href=\"https://docs.astral.sh/ruff/settings/#lint_dummy-variable-rgx\"\u003e\u003ccode\u003elint.dummy-variable-rgx\u003c/code\u003e\u003c/a\u003e now recognizes underscore-prefixed Unicode names, such as \u003ccode\u003e_次\u003c/code\u003e, as dummy variables.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate to Unicode 17 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/21229\"\u003e#21229\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28784\"\u003e#28784\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eRuff now uses Unicode 17 data for identifier normalization and named character escapes (\u003ccode\u003e\u0026quot;\\N{...}\u0026quot;\u003c/code\u003e).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAlways show unsafe and display-only fixes in the CLI (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/27810\"\u003e#27810\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eThe default \u003ccode\u003efull\u003c/code\u003e output format now shows unsafe fixes and suggestions requiring manual review, regardless of the \u003ca href=\"https://docs.astral.sh/ruff/settings/#unsafe-fixes\"\u003e\u003ccode\u003eunsafe-fixes\u003c/code\u003e\u003c/a\u003e setting. Actually applying unsafe fixes still requires explicit opt-in.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRemove the Python dependency from conda-forge builds (\u003ca href=\"https://redirect.github.com/conda-forge/ruff-feedstock/pull/361\"\u003econda-forge/ruff-feedstock#361\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eThe conda-forge build no longer depends on Python, now supports linux-riscv64, win-arm64, and linux-ppc64le platforms, and now includes shell completions. However, no longer depending on Python means that \u003ccode\u003epython -m ruff\u003c/code\u003e and \u003ccode\u003eimport ruff\u003c/code\u003e will no longer work. Use \u003ccode\u003eruff\u003c/code\u003e directly from \u003ccode\u003ePATH\u003c/code\u003e instead. PyPI installations and those from the standalone installer are unaffected.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRemove support for ruff-lsp (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28750\"\u003e#28750\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eSupport for \u003ccode\u003eruff-lsp\u003c/code\u003e, the legacy Python language server \u003ca href=\"https://github.com/astral-sh/ruff/releases/tag/0.9.5\"\u003edeprecated in Ruff v0.9.5\u003c/a\u003e, has been removed. The Ruff VS Code extension now always uses the native language server; \u003ccode\u003eruff.nativeServer\u003c/code\u003e is deprecated and ignored. See the \u003ca href=\"https://docs.astral.sh/ruff/editors/migration/\"\u003emigration guide\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eStabilization\u003c/h3\u003e\n\u003cp\u003eThe following rules have been stabilized and are no longer in preview:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://docs.astral.sh/ruff/rules/lazy-import-mismatch\"\u003e\u003ccode\u003elazy-import-mismatch\u003c/code\u003e\u003c/a\u003e (\u003ccode\u003eTID254\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://docs.astral.sh/ruff/rules/lazy-import-immediately-resolved\"\u003e\u003ccode\u003elazy-import-immediately-resolved\u003c/code\u003e\u003c/a\u003e (\u003ccode\u003eTID255\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://docs.astral.sh/ruff/rules/os-path-commonprefix\"\u003e\u003ccode\u003eos-path-commonprefix\u003c/code\u003e\u003c/a\u003e (\u003ccode\u003eRUF071\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md\"\u003eruff's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e0.17.0\u003c/h2\u003e\n\u003cp\u003eReleased on 2026-10-09.\u003c/p\u003e\n\u003cp\u003eThe executables in our macOS and Windows release archives and \u003ccode\u003eruff\u003c/code\u003e wheels are now code-signed.\nmacOS executables are signed with an Apple Developer ID certificate and notarized by Apple. Windows\nexecutables have timestamped Authenticode signatures from Azure Artifact Signing. This enables\nverification of the release publisher and binary integrity, supports publisher-based allowlisting,\nand should reduce security warnings and antivirus false positives.\u003c/p\u003e\n\u003ch3\u003eBreaking changes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate the default and latest Python versions for 3.15 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28792\"\u003e#28792\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eRuff now defaults to Python 3.11 instead of 3.10 when no Python version is configured through\n\u003ca href=\"https://docs.astral.sh/ruff/settings/#target-version\"\u003e\u003ccode\u003etarget-version\u003c/code\u003e\u003c/a\u003e or\n\u003ca href=\"https://docs.astral.sh/ruff/configuration/#inferring-the-python-version\"\u003e\u003ccode\u003erequires-python\u003c/code\u003e\u003c/a\u003e. When\nchecking for syntax errors without a configured Python version, Ruff now defaults to Python 3.15\ninstead of 3.14.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate the default rule set (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28786\"\u003e#28786\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eSeveral of the \u003ccode\u003eflake8-datetimez\u003c/code\u003e rules\n(\u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-without-tzinfo/\"\u003e\u003ccode\u003eDTZ001\u003c/code\u003e\u003c/a\u003e,\n\u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-now-without-tzinfo/\"\u003e\u003ccode\u003eDTZ005\u003c/code\u003e\u003c/a\u003e,\n\u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-fromtimestamp/\"\u003e\u003ccode\u003eDTZ006\u003c/code\u003e\u003c/a\u003e,\n\u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-strptime-without-zone/\"\u003e\u003ccode\u003eDTZ007\u003c/code\u003e\u003c/a\u003e,\n\u003ca href=\"https://docs.astral.sh/ruff/rules/call-date-today/\"\u003e\u003ccode\u003eDTZ011\u003c/code\u003e\u003c/a\u003e,\n\u003ca href=\"https://docs.astral.sh/ruff/rules/call-date-fromtimestamp/\"\u003e\u003ccode\u003eDTZ012\u003c/code\u003e\u003c/a\u003e, and\n\u003ca href=\"https://docs.astral.sh/ruff/rules/datetime-min-max/\"\u003e\u003ccode\u003eDTZ901\u003c/code\u003e\u003c/a\u003e) are no longer enabled by default,\nwhile \u003ca href=\"https://docs.astral.sh/ruff/rules/undefined-local-with-nested-import-star-usage/\"\u003e\u003ccode\u003eundefined-local-with-nested-import-star-usage\u003c/code\u003e\u003c/a\u003e\n(\u003ccode\u003eF406\u003c/code\u003e), which corresponds to a syntax error, is now enabled by default.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate Rust crate quick-junit to 0.8.0 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/27295\"\u003e#27295\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eJUnit output now uses a \u003ccode\u003eskipped\u003c/code\u003e attribute instead of \u003ccode\u003edisabled\u003c/code\u003e on \u003ccode\u003e\u0026lt;testsuite\u0026gt;\u003c/code\u003e elements and\nincludes a \u003ccode\u003eskipped\u003c/code\u003e attribute on the root \u003ccode\u003e\u0026lt;testsuites\u0026gt;\u003c/code\u003e element.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e[\u003ccode\u003eflake8-import-conventions\u003c/code\u003e] Add \u003ccode\u003edatetime as dt\u003c/code\u003e as a conventional alias (\u003ccode\u003eICN001\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28790\"\u003e#28790\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSupport Unicode dummy variable names (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28722\"\u003e#28722\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eThe default \u003ca href=\"https://docs.astral.sh/ruff/settings/#lint_dummy-variable-rgx\"\u003e\u003ccode\u003elint.dummy-variable-rgx\u003c/code\u003e\u003c/a\u003e\nnow recognizes underscore-prefixed Unicode names, such as \u003ccode\u003e_次\u003c/code\u003e, as dummy variables.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate to Unicode 17 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/21229\"\u003e#21229\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28784\"\u003e#28784\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eRuff now uses Unicode 17 data for identifier normalization and named character escapes (\u003ccode\u003e\u0026quot;\\N{...}\u0026quot;\u003c/code\u003e).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAlways show unsafe and display-only fixes in the CLI (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/27810\"\u003e#27810\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/5b27c1ccfaa230fb195855f5cf3404a21e3379cd\"\u003e\u003ccode\u003e5b27c1c\u003c/code\u003e\u003c/a\u003e Bump version to 0.17.0 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/29259\"\u003e#29259\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/8f362bf4cb5dbad095ac416602496705d41fc843\"\u003e\u003ccode\u003e8f362bf\u003c/code\u003e\u003c/a\u003e Integrate vendored Unicode names into Ruff\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/88a50d695c1142294bb4c780fad47d3306173885\"\u003e\u003ccode\u003e88a50d6\u003c/code\u003e\u003c/a\u003e Revert upstream Unicode loose matching\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/276832aa91f2086a6ec880884fcdd987991cddf2\"\u003e\u003ccode\u003e276832a\u003c/code\u003e\u003c/a\u003e Revert upstream Unicode alias normalization\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/26911caa2800758779965510d2f222b438abbb38\"\u003e\u003ccode\u003e26911ca\u003c/code\u003e\u003c/a\u003e Vendor unicode_names2 from upstream\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/27e3797508d1a7ad69e4900d51e38d78785aaf73\"\u003e\u003ccode\u003e27e3797\u003c/code\u003e\u003c/a\u003e [\u003ccode\u003eruff\u003c/code\u003e] Stabilize \u003ccode\u003eos-path-commonprefix\u003c/code\u003e (\u003ccode\u003eRUF071\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/28764\"\u003e#28764\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/bbb52c1267cf39aba67e54c2b5800878d23073a9\"\u003e\u003ccode\u003ebbb52c1\u003c/code\u003e\u003c/a\u003e [\u003ccode\u003eflake8-tidy-imports\u003c/code\u003e] Stabilize \u003ccode\u003elazy-import-immediately-resolved\u003c/code\u003e (`TID255...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/5aa9cbd3a49d32b24ac21fa7797ca87a330792a2\"\u003e\u003ccode\u003e5aa9cbd\u003c/code\u003e\u003c/a\u003e [\u003ccode\u003eflake8-tidy-imports\u003c/code\u003e] Stabilize \u003ccode\u003elazy-import-mismatch\u003c/code\u003e (\u003ccode\u003eTID254\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/28760\"\u003e#28760\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/dba1bc893aedfeea2064c4e8e764135f0d44dc3f\"\u003e\u003ccode\u003edba1bc8\u003c/code\u003e\u003c/a\u003e [\u003ccode\u003eflake8-import-conventions\u003c/code\u003e] Add \u003ccode\u003edatetime as dt\u003c/code\u003e as a conventional alias (`...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/ef23c9c39eb3029bab0139c3ea7ae6d95c4131e0\"\u003e\u003ccode\u003eef23c9c\u003c/code\u003e\u003c/a\u003e Update default and latest Python versions for 3.15 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/28792\"\u003e#28792\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/astral-sh/ruff/compare/0.16.10...0.17.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `ty` from 0.0.84 to 0.0.86\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/astral-sh/ty/releases\"\u003ety's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e0.0.86\u003c/h2\u003e\n\u003ch2\u003eRelease Notes\u003c/h2\u003e\n\u003cp\u003eReleased on 2026-10-09.\u003c/p\u003e\n\u003cp\u003eThe executables in our macOS and Windows release archives and \u003ccode\u003ety\u003c/code\u003e wheels are now code-signed. macOS executables are signed with an Apple Developer ID certificate and notarized by Apple. Windows executables have timestamped Authenticode signatures from Azure Artifact Signing. This enables verification of the release publisher and binary integrity, supports publisher-based allowlisting, and should reduce security warnings and antivirus false positives.\u003c/p\u003e\n\u003ch3\u003eBug fixes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eInfer empty collection branches from nonempty literals (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29131\"\u003e#29131\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eInvalidate dependency metadata when environments change (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29126\"\u003e#29126\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ePreserve final attribute restrictions on composite types (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29135\"\u003e#29135\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ePreserve recursive structure in \u003ccode\u003eAnnotated\u003c/code\u003e values (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29058\"\u003e#29058\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSpecialize inherited dataclass field converters (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29192\"\u003e#29192\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eLSP server\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eShow documentation for annotation operators on hover (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29185\"\u003e#29185\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eCore type checking\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eCheck attribute and property override types (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28556\"\u003e#28556\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eNarrow tuple unions through truthiness and type checks (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29125\"\u003e#29125\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ePreserve literal types when consuming dictionary literals (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29145\"\u003e#29145\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ePreserve non-boolean comparison results for intersections (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28045\"\u003e#28045\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ePreserve receiver specializations when calling unions of bound methods (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29015\"\u003e#29015\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eRepresent uninhabited truthiness explicitly (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28843\"\u003e#28843\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSolve validity type context through constraint sets (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28909\"\u003e#28909\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003ePerformance\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAvoid recursion guards for non-generic nominal targets (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29202\"\u003e#29202\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eCheck exact exclusions before intersection positives (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29195\"\u003e#29195\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eMemory usage improvements\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eShare constraints in retained sequent maps (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28966\"\u003e#28966\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eOther changes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eUpdate the default Python version to 3.15 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28792\"\u003e#28792\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eUpdate to Unicode 17 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/21229\"\u003e#21229\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28784\"\u003e#28784\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAlways show fixes in the CLI (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/27810\"\u003e#27810\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eContributors\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gorewilliams\"\u003e\u003ccode\u003e@​gorewilliams\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/carljm\"\u003e\u003ccode\u003e@​carljm\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/AlexWaygood\"\u003e\u003ccode\u003e@​AlexWaygood\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/ibraheemdev\"\u003e\u003ccode\u003e@​ibraheemdev\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/astral-sh/ty/blob/main/CHANGELOG.md\"\u003ety's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e0.0.86\u003c/h2\u003e\n\u003cp\u003eReleased on 2026-10-09.\u003c/p\u003e\n\u003cp\u003eThe executables in our macOS and Windows release archives and \u003ccode\u003ety\u003c/code\u003e wheels are now code-signed.\nmacOS executables are signed with an Apple Developer ID certificate and notarized by Apple. Windows\nexecutables have timestamped Authenticode signatures from Azure Artifact Signing. This enables\nverification of the release publisher and binary integrity, supports publisher-based allowlisting,\nand should reduce security warnings and antivirus false positives.\u003c/p\u003e\n\u003ch3\u003eBug fixes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eInfer empty collection branches from nonempty literals (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29131\"\u003e#29131\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eInvalidate dependency metadata when environments change (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29126\"\u003e#29126\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ePreserve final attribute restrictions on composite types (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29135\"\u003e#29135\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ePreserve recursive structure in \u003ccode\u003eAnnotated\u003c/code\u003e values (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29058\"\u003e#29058\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSpecialize inherited dataclass field converters (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29192\"\u003e#29192\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eLSP server\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eShow documentation for annotation operators on hover (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29185\"\u003e#29185\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eCore type checking\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eCheck attribute and property override types (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28556\"\u003e#28556\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eNarrow tuple unions through truthiness and type checks (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29125\"\u003e#29125\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ePreserve literal types when consuming dictionary literals (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29145\"\u003e#29145\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ePreserve non-boolean comparison results for intersections (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28045\"\u003e#28045\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ePreserve receiver specializations when calling unions of bound methods (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29015\"\u003e#29015\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eRepresent uninhabited truthiness explicitly (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28843\"\u003e#28843\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSolve validity type context through constraint sets (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28909\"\u003e#28909\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003ePerformance\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAvoid recursion guards for non-generic nominal targets (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29202\"\u003e#29202\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eCheck exact exclusions before intersection positives (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29195\"\u003e#29195\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eMemory usage improvements\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eShare constraints in retained sequent maps (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28966\"\u003e#28966\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eOther changes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eUpdate the default Python version to 3.15 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28792\"\u003e#28792\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eUpdate to Unicode 17 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/21229\"\u003e#21229\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28784\"\u003e#28784\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAlways show fixes in the CLI (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/27810\"\u003e#27810\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eContributors\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gorewilliams\"\u003e\u003ccode\u003e@​gorewilliams\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ty/commit/d5da069f4973382a75882de35f57b0ffd9386420\"\u003e\u003ccode\u003ed5da069\u003c/code\u003e\u003c/a\u003e Authenticate Docker Hub pulls (\u003ca href=\"https://redirect.github.com/astral-sh/ty/issues/4702\"\u003e#4702\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ty/commit/00606fa76854e7690fa91cd4b9e66c88994e1144\"\u003e\u003ccode\u003e00606fa\u003c/code\u003e\u003c/a\u003e Use Namespace for macOS x86-64 release builds (\u003ca href=\"https://redirect.github.com/astral-sh/ty/issues/4700\"\u003e#4700\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ty/commit/796950520db578977a6a6326680e8a32b89d4f02\"\u003e\u003ccode\u003e7969505\u003c/code\u003e\u003c/a\u003e Bump version to 0.0.86 (\u003ca href=\"https://redirect.github.com/astral-sh/ty/issues/4699\"\u003e#4699\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ty/commit/8e2fa958c296301b4b4576f19dc009daeb61e214\"\u003e\u003ccode\u003e8e2fa95\u003c/code\u003e\u003c/a\u003e Sync the Rust toolchain with the Ruff submodule (\u003ca href=\"https://redirect.github.com/astral-sh/ty/issues/4701\"\u003e#4701\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ty/commit/9602924a42d666d610a83f2b8cb9ec00edb3be7c\"\u003e\u003ccode\u003e9602924\u003c/code\u003e\u003c/a\u003e [ty] Use shared release signing actions (\u003ca href=\"https://redirect.github.com/astral-sh/ty/issues/4652\"\u003e#4652\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ty/commit/23f569b87b1ef38759022f6acde0aacc0270e8cc\"\u003e\u003ccode\u003e23f569b\u003c/code\u003e\u003c/a\u003e Document module and Python environment discovery (\u003ca href=\"https://redirect.github.com/astral-sh/ty/issues/4635\"\u003e#4635\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ty/commit/7300c73ec9a9ac2c526c204cb233653c461643d7\"\u003e\u003ccode\u003e7300c73\u003c/code\u003e\u003c/a\u003e Update prek dependencies (\u003ca href=\"https://redirect.github.com/astral-sh/ty/issues/4682\"\u003e#4682\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ty/commit/ac2d7f1141af60ce5baf813cc3127613ca85d152\"\u003e\u003ccode\u003eac2d7f1\u003c/code\u003e\u003c/a\u003e Update dependency prek to v0.5.2 (\u003ca href=\"https://redirect.github.com/astral-sh/ty/issues/4681\"\u003e#4681\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ty/commit/d7fc5ef8837c0a012a7efd187649d448532f8ff0\"\u003e\u003ccode\u003ed7fc5ef\u003c/code\u003e\u003c/a\u003e Bump version to 0.0.85 (\u003ca href=\"https://redirect.github.com/astral-sh/ty/issues/4679\"\u003e#4679\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ty/commit/bc4fd9e2af313138780598653483e5722a11f962\"\u003e\u003ccode\u003ebc4fd9e\u003c/code\u003e\u003c/a\u003e Include reproducers in daily fuzz issues (\u003ca href=\"https://redirect.github.com/astral-sh/ty/issues/4671\"\u003e#4671\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/astral-sh/ty/compare/0.0.84...0.0.86\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `tox` from 4.64.5 to 4.65.2\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/tox/releases\"\u003etox's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev4.65.2\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e🐛 fix(python): fail a dependency_groups run with no pyproject.toml to read by \u003ca href=\"https://github.com/feiiiiii5\"\u003e\u003ccode\u003e@​feiiiiii5\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/tox/pull/4142\"\u003etox-dev/tox#4142\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelo...\n\n_Description has been truncated_","html_url":"https://github.com/posita/dyce/pull/95","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/posita%2Fdyce/issues/95","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/95/packages"}},{"old_version":"20.36.1","new_version":"21.7.13","update_type":"major","path":"/pulumi in the uv group across 1 directory","pr_created_at":"2026-10-17T12:33:07.000Z","version_change":"20.36.1 → 21.7.13","issue":{"uuid":"5898354249","node_id":"PR_kwDOM0lWjc8AAAABJBErmQ","number":321,"state":"closed","title":"build(deps): bump virtualenv from 20.36.1 to 21.7.13 in /pulumi in the uv group across 1 directory","user":"dependabot[bot]","labels":["dependencies","python:uv"],"assignees":[],"locked":false,"comments_count":2,"pull_request":true,"closed_at":"2026-10-17T12:35:52.000Z","author_association":null,"state_reason":null,"created_at":"2026-10-17T12:33:07.000Z","updated_at":"2026-10-17T12:35:54.000Z","time_to_close":165,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"build(deps)","packages":[{"name":"virtualenv","old_version":"20.36.1","new_version":"21.7.13","repository_url":"https://github.com/pypa/virtualenv"}],"path":"/pulumi in the uv group across 1 directory","ecosystem":"pip"},"body":"Bumps the uv group with 1 update in the /pulumi directory: [virtualenv](https://github.com/pypa/virtualenv).\n\nUpdates `virtualenv` from 20.36.1 to 21.7.13\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pypa/virtualenv/releases\"\u003evirtualenv's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e21.7.13\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e👷 ci: correct a stale checkout pin comment by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3254\"\u003epypa/virtualenv#3254\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🔧 chore: drop misc as a changelog fragment type by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3255\"\u003epypa/virtualenv#3255\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e👷 ci: scope the nushell apt key to its own repo by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3253\"\u003epypa/virtualenv#3253\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(activation): stop path command injection in bash and fish by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3252\"\u003epypa/virtualenv#3252\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.7.12...21.7.13\"\u003ehttps://github.com/pypa/virtualenv/compare/21.7.12...21.7.13\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e21.7.12\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e🔧 chore(changelog): drop dead CVE-2026-24049 fragment by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3249\"\u003epypa/virtualenv#3249\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(activation): escape batch quote() against injection by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3250\"\u003epypa/virtualenv#3250\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(seed): verify downloaded wheel digests by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3251\"\u003epypa/virtualenv#3251\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.7.11...21.7.12\"\u003ehttps://github.com/pypa/virtualenv/compare/21.7.11...21.7.12\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e21.7.11\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eAdd OpenSSF Scorecard workflow by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3238\"\u003epypa/virtualenv#3238\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eDocument AI-assisted contributions and licensing policy by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3239\"\u003epypa/virtualenv#3239\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e👷 ci(release): attest and sign release provenance by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3242\"\u003epypa/virtualenv#3242\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e👷 ci: harden Scorecard-scored checks in CI by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3241\"\u003epypa/virtualenv#3241\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(ci): parallelize graalpy tests, recover crashed workers by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3240\"\u003epypa/virtualenv#3240\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(ci): mark real-shell activation tests as slow by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3243\"\u003epypa/virtualenv#3243\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e👷 ci: run macOS jobs on macos-26 by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3244\"\u003epypa/virtualenv#3244\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(activation): undo a live activation before activate.bat saves values by \u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3245\"\u003epypa/virtualenv#3245\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(create): keep pyvenv.cfg values on a single line by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3247\"\u003epypa/virtualenv#3247\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🔧 chore(test): add opt-in Atheris fuzz harness by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3246\"\u003epypa/virtualenv#3246\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e📝 docs(readme): add OpenSSF Best Practices badge by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3248\"\u003epypa/virtualenv#3248\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.7.10...21.7.11\"\u003ehttps://github.com/pypa/virtualenv/compare/21.7.10...21.7.11\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e21.7.10\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e🔧 chore: check spelling with typos in pre-commit by \u003ca href=\"https://github.com/even-even\"\u003e\u003ccode\u003e@​even-even\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3235\"\u003epypa/virtualenv#3235\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(activation): keep and restore the user's TCL_LIBRARY and TK_LIBRARY by \u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3234\"\u003epypa/virtualenv#3234\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(create): skip blank and comment lines in pyvenv.cfg by \u003ca href=\"https://github.com/r3wretrhy\"\u003e\u003ccode\u003e@​r3wretrhy\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3232\"\u003epypa/virtualenv#3232\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(activation): restore PKG_CONFIG_PATH that was not set before by \u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3233\"\u003epypa/virtualenv#3233\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pypa/virtualenv/blob/main/docs/changelog.rst\"\u003evirtualenv's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003eBugfixes - 21.7.13\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eFix \u003ccode\u003eactivate\u003c/code\u003e and \u003ccode\u003eactivate.fish\u003c/code\u003e running commands embedded in the virtual environment path or in the\ninterpreter's Tcl/Tk library paths. (:issue:\u003ccode\u003e3252\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003ev21.7.12 (2026-09-18)\u003c/p\u003e\n\u003chr /\u003e\n\u003ch1\u003eBugfixes - 21.7.12\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eFix \u003ccode\u003eactivate.bat\u003c/code\u003e running arbitrary commands from a crafted \u003ccode\u003e--prompt\u003c/code\u003e, \u003ccode\u003eVIRTUALENV_PROMPT\u003c/code\u003e, or config file\nvalue. (:issue:\u003ccode\u003e3250\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eVerify a downloaded seed wheel's sha256 against PyPI before seeding it into a virtual environment, skipped when a\ncustom pip index is configured. (:issue:\u003ccode\u003e3251\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003ev21.7.11 (2026-09-17)\u003c/p\u003e\n\u003chr /\u003e\n\u003ch1\u003eBugfixes - 21.7.11\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eRunning \u003ccode\u003eactivate.bat\u003c/code\u003e again before \u003ccode\u003edeactivate\u003c/code\u003e no longer makes \u003ccode\u003edeactivate\u003c/code\u003e leave the environment's\n\u003ccode\u003ePKG_CONFIG_PATH\u003c/code\u003e, \u003ccode\u003eTCL_LIBRARY\u003c/code\u003e and \u003ccode\u003eTK_LIBRARY\u003c/code\u003e behind, or lose values the user had set before the first\nactivation - by :user:\u003ccode\u003edarrenhuai\u003c/code\u003e. (:issue:\u003ccode\u003e3245\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eWrite \u003ccode\u003epyvenv.cfg\u003c/code\u003e values on a single line, so a prompt carrying a line boundary can no longer inject configuration.\n\u003ccode\u003e--prompt\u003c/code\u003e, the \u003ccode\u003eVIRTUALENV_PROMPT\u003c/code\u003e environment variable and the config file all set the prompt, and\n\u003ccode\u003epyvenv.cfg\u003c/code\u003e has no escape syntax, so a newline, a carriage return, or any other boundary \u003ccode\u003estr.splitlines\u003c/code\u003e\nrecognizes, such as \u003ccode\u003eU+2028\u003c/code\u003e, started a new configuration line. Reading the file back picked up those lines as keys,\nand since the last value for a key wins, they replaced anything written earlier, including \u003ccode\u003ehome\u003c/code\u003e. (:issue:\u003ccode\u003e3247\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch1\u003eImproved Documentation - 21.7.11\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eDocument the policy for AI-assisted contributions and the licensing rules for dependencies. (:issue:\u003ccode\u003e3239\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch1\u003eMisc - 21.7.11\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003e:issue:\u003ccode\u003e3238\u003c/code\u003e, :issue:\u003ccode\u003e3240\u003c/code\u003e, :issue:\u003ccode\u003e3241\u003c/code\u003e, :issue:\u003ccode\u003e3242\u003c/code\u003e, :issue:\u003ccode\u003e3243\u003c/code\u003e, :issue:\u003ccode\u003e3244\u003c/code\u003e, :issue:\u003ccode\u003e3246\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003ev21.7.10 (2026-09-15)\u003c/p\u003e\n\u003chr /\u003e\n\u003ch1\u003eBugfixes - 21.7.10\u003c/h1\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/0c295ff1a5f298e8e11935e3588f59f7455c1f8f\"\u003e\u003ccode\u003e0c295ff\u003c/code\u003e\u003c/a\u003e release 21.7.13\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/4d5a105ec2a2723b8c7f4571bb68f4f71d01e3f6\"\u003e\u003ccode\u003e4d5a105\u003c/code\u003e\u003c/a\u003e 🐛 fix(activation): stop path command injection in bash and fish (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3252\"\u003e#3252\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/0525dcea21865059ffedc70054f6f982be723992\"\u003e\u003ccode\u003e0525dce\u003c/code\u003e\u003c/a\u003e 👷 ci: scope the nushell apt key to its own repo (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3253\"\u003e#3253\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/aa8323a907834e9c16fb734613ce41a6d7e27260\"\u003e\u003ccode\u003eaa8323a\u003c/code\u003e\u003c/a\u003e 🔧 chore: drop misc as a changelog fragment type (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3255\"\u003e#3255\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/a43547765e017f3a13f029e24c6e6f73882e15bc\"\u003e\u003ccode\u003ea435477\u003c/code\u003e\u003c/a\u003e 👷 ci: correct a stale checkout pin comment (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3254\"\u003e#3254\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/9666b42afc8d6103e765d77958d7bae782f5406e\"\u003e\u003ccode\u003e9666b42\u003c/code\u003e\u003c/a\u003e release 21.7.12\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/a01ed3e2f239d6ab1fce62c5c7664ccf268fff6d\"\u003e\u003ccode\u003ea01ed3e\u003c/code\u003e\u003c/a\u003e 🐛 fix(seed): verify downloaded wheel digests (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3251\"\u003e#3251\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/d721ff140ce4afdc2a9b76751e4584e25d9fbea6\"\u003e\u003ccode\u003ed721ff1\u003c/code\u003e\u003c/a\u003e 🐛 fix(activation): escape batch quote() against injection (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3250\"\u003e#3250\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/087a2ef8bd3aa15b562a3558b1068f603e50f77a\"\u003e\u003ccode\u003e087a2ef\u003c/code\u003e\u003c/a\u003e 🔧 chore(changelog): drop dead CVE-2026-24049 fragment (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3249\"\u003e#3249\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/73e352ae02bfa52ffc0e307b04f1b6a7168c4eb0\"\u003e\u003ccode\u003e73e352a\u003c/code\u003e\u003c/a\u003e release 21.7.11\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/pypa/virtualenv/compare/20.36.1...21.7.13\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=virtualenv\u0026package-manager=uv\u0026previous-version=20.36.1\u0026new-version=21.7.13)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore \u003cdependency name\u003e major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself)\n- `@dependabot ignore \u003cdependency name\u003e minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself)\n- `@dependabot ignore \u003cdependency name\u003e` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself)\n- `@dependabot unignore \u003cdependency name\u003e` will remove all of the ignore conditions of the specified dependency\n- `@dependabot unignore \u003cdependency name\u003e \u003cignore condition\u003e` will remove the ignore condition of the specified dependency and ignore conditions\nYou can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/notdodo/erfiume_bot/network/alerts).\n\n\u003c/details\u003e","html_url":"https://github.com/notdodo/erfiume_bot/pull/321","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/notdodo%2Ferfiume_bot/issues/321","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/321/packages"}},{"old_version":"21.7.0","new_version":"21.7.13","update_type":"patch","path":null,"pr_created_at":"2026-10-16T22:43:11.000Z","version_change":"21.7.0 → 21.7.13","issue":{"uuid":"5892216915","node_id":"PR_kwDOTnUGzc8AAAABI8V0Aw","number":1,"state":"open","title":"chore(deps): bump the uv group across 1 directory with 17 updates","user":"dependabot[bot]","labels":["dependencies","python:uv"],"assignees":[],"locked":false,"comments_count":5,"pull_request":true,"closed_at":null,"author_association":null,"state_reason":null,"created_at":"2026-10-16T22:43:11.000Z","updated_at":"2026-10-16T22:43:23.000Z","time_to_close":null,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"chore(deps): bump","group_name":"uv","update_count":17,"packages":[{"name":"pyjwt","old_version":"2.13.0","new_version":"2.15.0","repository_url":"https://github.com/jpadilla/pyjwt"},{"name":"pypdf","old_version":"6.14.2","new_version":"6.19.0","repository_url":"https://github.com/py-pdf/pypdf"},{"name":"mcp","old_version":"1.28.1","new_version":"1.30.0","repository_url":"https://github.com/modelcontextprotocol/python-sdk"},{"name":"pymongo","old_version":"4.17.0","new_version":"4.18.2","repository_url":"https://github.com/mongodb/mongo-python-driver"},{"name":"langchain-nvidia-ai-endpoints","old_version":"1.0.4","new_version":"1.4.2","repository_url":"https://github.com/langchain-ai/langchain-nvidia"},{"name":"gitpython","old_version":"3.1.57","new_version":"3.1.62","repository_url":"https://github.com/gitpython-developers/GitPython"},{"name":"litellm","old_version":"1.93.0","new_version":"1.93.2","repository_url":"https://github.com/BerriAI/litellm"},{"name":"docling","old_version":"2.115.0","new_version":"2.132.0","repository_url":"https://github.com/docling-project/docling"},{"name":"datamodel-code-generator","old_version":"0.71.0","new_version":"0.81.0","repository_url":"https://github.com/datamodel-code-generator/datamodel-code-generator"},{"name":"langgraph-sdk","old_version":"0.4.2","new_version":"0.4.4","repository_url":"https://github.com/langchain-ai/langgraph"},{"name":"mako","old_version":"1.3.12","new_version":"1.4.2","repository_url":"https://github.com/sqlalchemy/mako"},{"name":"multidict","old_version":"6.7.1","new_version":"6.9.1","repository_url":"https://github.com/aio-libs/multidict"},{"name":"oauthlib","old_version":"3.3.1","new_version":"4.0.0","repository_url":"https://github.com/oauthlib/oauthlib"},{"name":"tornado","old_version":"6.5.7","new_version":"6.5.9","repository_url":"https://github.com/tornadoweb/tornado"},{"name":"urllib3","old_version":"2.7.0","new_version":"2.8.0","repository_url":"https://github.com/urllib3/urllib3"},{"name":"virtualenv","old_version":"21.7.0","new_version":"21.7.13","repository_url":"https://github.com/pypa/virtualenv"},{"name":"werkzeug","old_version":"3.1.8","new_version":"3.1.9","repository_url":"https://github.com/pallets/werkzeug"}],"path":null,"ecosystem":"pip"},"body":"Bumps the uv group with 17 updates in the / directory:\n\n| Package | From | To |\n| --- | --- | --- |\n| [pyjwt](https://github.com/jpadilla/pyjwt) | `2.13.0` | `2.15.0` |\n| [pypdf](https://github.com/py-pdf/pypdf) | `6.14.2` | `6.19.0` |\n| [mcp](https://github.com/modelcontextprotocol/python-sdk) | `1.28.1` | `1.30.0` |\n| [pymongo](https://github.com/mongodb/mongo-python-driver) | `4.17.0` | `4.18.2` |\n| [langchain-nvidia-ai-endpoints](https://github.com/langchain-ai/langchain-nvidia) | `1.0.4` | `1.4.2` |\n| [gitpython](https://github.com/gitpython-developers/GitPython) | `3.1.57` | `3.1.62` |\n| [litellm](https://github.com/BerriAI/litellm) | `1.93.0` | `1.93.2` |\n| [docling](https://github.com/docling-project/docling) | `2.115.0` | `2.132.0` |\n| [datamodel-code-generator](https://github.com/datamodel-code-generator/datamodel-code-generator) | `0.71.0` | `0.81.0` |\n| [langgraph-sdk](https://github.com/langchain-ai/langgraph) | `0.4.2` | `0.4.4` |\n| [mako](https://github.com/sqlalchemy/mako) | `1.3.12` | `1.4.2` |\n| [multidict](https://github.com/aio-libs/multidict) | `6.7.1` | `6.9.1` |\n| [oauthlib](https://github.com/oauthlib/oauthlib) | `3.3.1` | `4.0.0` |\n| [tornado](https://github.com/tornadoweb/tornado) | `6.5.7` | `6.5.9` |\n| [urllib3](https://github.com/urllib3/urllib3) | `2.7.0` | `2.8.0` |\n| [virtualenv](https://github.com/pypa/virtualenv) | `21.7.0` | `21.7.13` |\n| [werkzeug](https://github.com/pallets/werkzeug) | `3.1.8` | `3.1.9` |\n\n\nUpdates `pyjwt` from 2.13.0 to 2.15.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/jpadilla/pyjwt/releases\"\u003epyjwt's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e2.15.0\u003c/h2\u003e\n\u003cp\u003eSee the \u003ca href=\"https://github.com/jpadilla/pyjwt/blob/2.15.0/CHANGELOG.rst\"\u003e2.15.0 changelog\u003c/a\u003e for complete release details.\u003c/p\u003e\n\u003ch2\u003e2.14.0\u003c/h2\u003e\n\u003cp\u003eSee the \u003ca href=\"https://github.com/jpadilla/pyjwt/blob/2.14.0/CHANGELOG.rst\"\u003e2.14.0 changelog\u003c/a\u003e for the complete release details and related security advisories.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/jpadilla/pyjwt/blob/master/CHANGELOG.rst\"\u003epyjwt's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e\u003ccode\u003ev2.15.0 \u0026lt;https://github.com/jpadilla/pyjwt/compare/2.14.0...2.15.0\u0026gt;\u003c/code\u003e__\u003c/h2\u003e\n\u003cp\u003eSecurity\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e\n- Wrap recursion errors from deeply nested JWT payloads in ``DecodeError``\n  instead of exposing a raw ``RecursionError``.\n\u003cp\u003eAdded\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e\n- Support Python 3.15 by @kytta in `[#1202](https://github.com/jpadilla/pyjwt/issues/1202) \u0026amp;lt;https://github.com/jpadilla/pyjwt/pull/1202\u0026amp;gt;`__\n\nChanged\n\u003c/code\u003e\u003c/pre\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eJWKSetCache\u003c/code\u003e now stores the parsed \u003ccode\u003ePyJWKSet\u003c/code\u003e rather than the raw JWKS\npayload, so a cache hit no longer re-parses every key. \u003ccode\u003eJWKSetCache.put()\u003c/code\u003e\naccepts either form and raises \u003ccode\u003ePyJWKSetError\u003c/code\u003e for anything else. As a\nresult, \u003ccode\u003ePyJWKClient.get_jwk_set()\u003c/code\u003e returns the same \u003ccode\u003ePyJWKSet\u003c/code\u003e instance\nfor as long as it stays cached, rather than a freshly built one per call in\n\u003ccode\u003e[#1208](https://github.com/jpadilla/pyjwt/issues/1208) \u0026amp;lt;https://github.com/jpadilla/pyjwt/pull/1208\u0026amp;gt;\u003c/code\u003e__\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ePyJWKClient.fetch_data()\u003c/code\u003e now raises\n\u003ccode\u003ePyJWKClientError(\u0026amp;quot;The JWKS endpoint did not return a JSON object\u0026amp;quot;)\u003c/code\u003e when\nthe endpoint response is not a JSON object, instead of returning it for\n\u003ccode\u003eget_jwk_set()\u003c/code\u003e to reject. Callers reaching the JWKS through\n\u003ccode\u003eget_jwk_set()\u003c/code\u003e see the same error as before in\n\u003ccode\u003e[#1208](https://github.com/jpadilla/pyjwt/issues/1208) \u0026amp;lt;https://github.com/jpadilla/pyjwt/pull/1208\u0026amp;gt;\u003c/code\u003e__\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eFixed\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e\n- Return cached ``PyJWKSet`` values from ``PyJWKClient.get_jwk_set()`` instead\n  of raising ``PyJWKClientError(\u0026amp;quot;The JWKS endpoint did not return a JSON\n  object\u0026amp;quot;)``. ``JWKSetCache.put()`` documents ``PyJWKSet`` as the cached value,\n  so callers pre-populating the cache to avoid a network round-trip could not\n  read it back in `[#914](https://github.com/jpadilla/pyjwt/issues/914) \u0026amp;lt;https://github.com/jpadilla/pyjwt/issues/914\u0026amp;gt;`__ and\n  `[#1208](https://github.com/jpadilla/pyjwt/issues/1208) \u0026amp;lt;https://github.com/jpadilla/pyjwt/pull/1208\u0026amp;gt;`__\n- ``PyJWKClient.get_jwk_set()`` now caches the key set it returns, so a\n  ``fetch_data()`` override that filters or transforms the JWKS is no longer\n  undone by the next cache hit in\n  `[#1208](https://github.com/jpadilla/pyjwt/issues/1208) \u0026amp;lt;https://github.com/jpadilla/pyjwt/pull/1208\u0026amp;gt;`__\n- Raise the documented ``PyJWTError`` subclass instead of leaking a\n  ``TypeError`` when the ``exp``, ``nbf``, or ``iat`` claim decodes to a\n  non-numeric, non-string value such as a list, dict, or ``null``.\n- Reject OKP JWK private keys when their public ``x`` component does not\n  match the private ``d`` component.\n- Treat malformed JWK Set members as unusable keys rather than letting\n  ``AttributeError`` or ``TypeError`` escape ``PyJWKSet``. A member that is not\n\u0026amp;lt;/tr\u0026amp;gt;\u0026amp;lt;/table\u0026amp;gt; \n\u0026lt;/code\u0026gt;\u0026lt;/pre\u0026gt;\n\u0026lt;/blockquote\u0026gt;\n\u0026lt;p\u0026gt;... (truncated)\u0026lt;/p\u0026gt;\n\u0026lt;/details\u0026gt;\n\u0026lt;details\u0026gt;\n\u0026lt;summary\u0026gt;Commits\u0026lt;/summary\u0026gt;\n\n\u0026lt;ul\u0026gt;\n\u0026lt;li\u0026gt;\u0026lt;a href=\u0026quot;https://github.com/jpadilla/pyjwt/commit/1d41a6478e1562e68ff667fcd703356acf085f68\u0026quot;\u0026gt;\u0026lt;code\u0026gt;1d41a64\u0026lt;/code\u0026gt;\u0026lt;/a\u0026gt; chore: prepare 2.15.0 release\u0026lt;/li\u0026gt;\n\u0026lt;li\u0026gt;\u0026lt;a href=\u0026quot;https://github.com/jpadilla/pyjwt/commit/9bc06658f875b9b40091539140bbbdc4639161c3\u0026quot;\u0026gt;\u0026lt;code\u0026gt;9bc0665\u0026lt;/code\u0026gt;\u0026lt;/a\u0026gt; fix: make recursive payload tests deterministic\u0026lt;/li\u0026gt;\n\u0026lt;li\u0026gt;\u0026lt;a href=\u0026quot;https://github.com/jpadilla/pyjwt/commit/5fde08a6cf906aa7698de2d6391d88b73006b17b\u0026quot;\u0026gt;\u0026lt;code\u0026gt;5fde08a\u0026lt;/code\u0026gt;\u0026lt;/a\u0026gt; fix: normalize recursive JWT payload errors\u0026lt;/li\u0026gt;\n\u0026lt;li\u0026gt;\u0026lt;a href=\u0026quot;https://github.com/jpadilla/pyjwt/commit/171062d2d734315272a901100aa4b109f2fc3c19\u0026quot;\u0026gt;\u0026lt;code\u0026gt;171062d\u0026lt;/code\u0026gt;\u0026lt;/a\u0026gt; utils: mention bytes in force_bytes type error (\u0026lt;a href=\u0026quot;https://redirect.github.com/jpadilla/pyjwt/issues/1173\u0026quot;\u0026gt;#1173\u0026lt;/a\u0026gt;)\u0026lt;/li\u0026gt;\n\u0026lt;li\u0026gt;\u0026lt;a href=\u0026quot;https://github.com/jpadilla/pyjwt/commit/c9d4d5375bf464ef363506fed9eb6e7f33217ab6\u0026quot;\u0026gt;\u0026lt;code\u0026gt;c9d4d53\u0026lt;/code\u0026gt;\u0026lt;/a\u0026gt; docs/conf: drop duplicate 'and' from read() docstring (\u0026lt;a href=\u0026quot;https://redirect.github.com/jpadilla/pyjwt/issues/1174\u0026quot;\u0026gt;#1174\u0026lt;/a\u0026gt;)\u0026lt;/li\u0026gt;\n\u0026lt;li\u0026gt;\u0026lt;a href=\u0026quot;https://github.com/jpadilla/pyjwt/commit/2763752196113e1473b0ed7905aa6034aedfbe53\u0026quot;\u0026gt;\u0026lt;code\u0026gt;2763752\u0026lt;/code\u0026gt;\u0026lt;/a\u0026gt; Add support for Python 3.15 (\u0026lt;a href=\u0026quot;https://redirect.github.com/jpadilla/pyjwt/issues/1202\u0026quot;\u0026gt;#1202\u0026lt;/a\u0026gt;)\u0026lt;/li\u0026gt;\n\u0026lt;li\u0026gt;\u0026lt;a href=\u0026quot;https://github.com/jpadilla/pyjwt/commit/4adcd02722f5011c60079d3978dfc167b9a8eaa5\u0026quot;\u0026gt;\u0026lt;code\u0026gt;4adcd02\u0026lt;/code\u0026gt;\u0026lt;/a\u0026gt; Catch http.client.HTTPException in PyJWKClient.fetch_data (\u0026lt;a href=\u0026quot;https://redirect.github.com/jpadilla/pyjwt/issues/1201\u0026quot;\u0026gt;#1201\u0026lt;/a\u0026gt;)\u0026lt;/li\u0026gt;\n\u0026lt;li\u0026gt;\u0026lt;a href=\u0026quot;https://github.com/jpadilla/pyjwt/commit/9e501d993b4d3e7dba14bdb1722b1d993ac75097\u0026quot;\u0026gt;\u0026lt;code\u0026gt;9e501d9\u0026lt;/code\u0026gt;\u0026lt;/a\u0026gt; fix: correct docstring typo in _validate_jti (\u0026lt;a href=\u0026quot;https://redirect.github.com/jpadilla/pyjwt/issues/1179\u0026quot;\u0026gt;#1179\u0026lt;/a\u0026gt;)\u0026lt;/li\u0026gt;\n\u0026lt;li\u0026gt;\u0026lt;a href=\u0026quot;https://github.com/jpadilla/pyjwt/commit/4047c44d51950ffda15f40054508d3f17c43b1e2\u0026quot;\u0026gt;\u0026lt;code\u0026gt;4047c44\u0026lt;/code\u0026gt;\u0026lt;/a\u0026gt; docs: clarify JWK certificate member handling (\u0026lt;a href=\u0026quot;https://redirect.github.com/jpadilla/pyjwt/issues/1212\u0026quot;\u0026gt;#1212\u0026lt;/a\u0026gt;)\u0026lt;/li\u0026gt;\n\u0026lt;li\u0026gt;\u0026lt;a href=\u0026quot;https://github.com/jpadilla/pyjwt/commit/f4e2b59f543cc82d46d9d69922bba59e804216b9\u0026quot;\u0026gt;\u0026lt;code\u0026gt;f4e2b59\u0026lt;/code\u0026gt;\u0026lt;/a\u0026gt; [pre-commit.ci] pre-commit autoupdate (\u0026lt;a href=\u0026quot;https://redirect.github.com/jpadilla/pyjwt/issues/1210\u0026quot;\u0026gt;#1210\u0026lt;/a\u0026gt;)\u0026lt;/li\u0026gt;\n\u0026lt;li\u0026gt;Additional commits viewable in \u0026lt;a href=\u0026quot;https://github.com/jpadilla/pyjwt/compare/2.13.0...2.15.0\u0026quot;\u0026gt;compare view\u0026lt;/a\u0026gt;\u0026lt;/li\u0026gt;\n\u0026lt;/ul\u0026gt;\n\u0026lt;/details\u0026gt;\n\n\u0026lt;br /\u0026gt;\u003c/code\u003e\u003c/pre\u003e\n\nUpdates `pypdf` from 6.14.2 to 6.19.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/py-pdf/pypdf/releases\"\u003epypdf's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003eVersion 6.19.0, 2026-09-16\u003c/h2\u003e\n\u003ch2\u003eWhat's new\u003c/h2\u003e\n\u003ch3\u003eSecurity (SEC)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eLimit size of alphabetical page labels (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4096\"\u003e#4096\u003c/a\u003e) by \u003ca href=\"https://github.com/stefan6419846\"\u003e\u003ccode\u003e@​stefan6419846\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eDeprecations (DEP)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eReplace PdfWriter method add_js (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/3979\"\u003e#3979\u003c/a\u003e) by \u003ca href=\"https://github.com/j-t-1\"\u003e\u003ccode\u003e@​j-t-1\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003ePerformance Improvements (PI)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eMove static value out of loop body for appearance stream data (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4087\"\u003e#4087\u003c/a\u003e) by \u003ca href=\"https://github.com/stefan6419846\"\u003e\u003ccode\u003e@​stefan6419846\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eReduce number of full data lookups for attachment mapping API (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4081\"\u003e#4081\u003c/a\u003e) by \u003ca href=\"https://github.com/stefan6419846\"\u003e\u003ccode\u003e@​stefan6419846\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eBug Fixes (BUG)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eDo not copy unrelated pages when appending pages with non-terminal fields (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4078\"\u003e#4078\u003c/a\u003e) by \u003ca href=\"https://github.com/anandghegde\"\u003e\u003ccode\u003e@​anandghegde\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUse page reference for existing internal link targets (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4076\"\u003e#4076\u003c/a\u003e) by \u003ca href=\"https://github.com/r-kamei\"\u003e\u003ccode\u003e@​r-kamei\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eArabic-Indic digits are reversed during text extraction (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4077\"\u003e#4077\u003c/a\u003e) by \u003ca href=\"https://github.com/Syamjith-NK\"\u003e\u003ccode\u003e@​Syamjith-NK\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eParse a string rect for add_uri into a rectangle (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4074\"\u003e#4074\u003c/a\u003e) by \u003ca href=\"https://github.com/RavSinghChandan\"\u003e\u003ccode\u003e@​RavSinghChandan\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/py-pdf/pypdf/compare/6.18.1...6.19.0\"\u003eFull Changelog\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003eVersion 6.18.1, 2026-09-11\u003c/h2\u003e\n\u003ch2\u003eWhat's new\u003c/h2\u003e\n\u003ch3\u003eSecurity (SEC)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eFurther restrict FlateDecode recovery (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4073\"\u003e#4073\u003c/a\u003e) by \u003ca href=\"https://github.com/stefan6419846\"\u003e\u003ccode\u003e@​stefan6419846\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eLimit entry count for TrueType and Type1 font \u003ccode\u003e/Widths\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4072\"\u003e#4072\u003c/a\u003e) by \u003ca href=\"https://github.com/stefan6419846\"\u003e\u003ccode\u003e@​stefan6419846\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eLimit allowed length of tokens in parse_bfchar (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4071\"\u003e#4071\u003c/a\u003e) by \u003ca href=\"https://github.com/stefan6419846\"\u003e\u003ccode\u003e@​stefan6419846\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eBug Fixes (BUG)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eUse current text matrix for visitor_text (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4062\"\u003e#4062\u003c/a\u003e) by \u003ca href=\"https://github.com/r-kamei\"\u003e\u003ccode\u003e@​r-kamei\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRepeat the letter for /S /A and /S /a page labels past Z (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4065\"\u003e#4065\u003c/a\u003e) by \u003ca href=\"https://github.com/youdie006\"\u003e\u003ccode\u003e@​youdie006\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUse font color for FreeText default appearance (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4051\"\u003e#4051\u003c/a\u003e) by \u003ca href=\"https://github.com/Yuki9814\"\u003e\u003ccode\u003e@​Yuki9814\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eRobustness (ROB)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eFix compatibility with fonttools \u0026lt; 4.58.0 (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4050\"\u003e#4050\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4059\"\u003e#4059\u003c/a\u003e) by \u003ca href=\"https://github.com/MeggyCal\"\u003e\u003ccode\u003e@​MeggyCal\u003c/code\u003e\u003c/a\u003e and \u003ca href=\"https://github.com/stefan6419846\"\u003e\u003ccode\u003e@​stefan6419846\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eDocumentation (DOC)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eUse combined matrix in visitor examples (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4066\"\u003e#4066\u003c/a\u003e) by \u003ca href=\"https://github.com/r-kamei\"\u003e\u003ccode\u003e@​r-kamei\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/py-pdf/pypdf/compare/6.18.0...6.18.1\"\u003eFull Changelog\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003eVersion 6.18.0, 2026-09-07\u003c/h2\u003e\n\u003ch2\u003eWhat's new\u003c/h2\u003e\n\u003cp\u003ePlease note that this release requires users which previously overwrote the default limits to migrate to the new approach: \u003ca href=\"https://pypdf.readthedocs.io/en/6.18.0/user/security.html#global\"\u003eDocs\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eIn short:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eUse \u003ccode\u003eapply_configuration\u003c/code\u003e as a context manager to temporarily overwrite configuration values.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/py-pdf/pypdf/blob/main/CHANGELOG.md\"\u003epypdf's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003eVersion 6.19.0, 2026-09-16\u003c/h2\u003e\n\u003ch3\u003eSecurity (SEC)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eLimit size of alphabetical page labels (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4096\"\u003e#4096\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eDeprecations (DEP)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eReplace PdfWriter method add_js (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/3979\"\u003e#3979\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003ePerformance Improvements (PI)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eMove static value out of loop body for appearance stream data (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4087\"\u003e#4087\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eReduce number of full data lookups for attachment mapping API (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4081\"\u003e#4081\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eBug Fixes (BUG)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eDo not copy unrelated pages when appending pages with non-terminal fields (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4078\"\u003e#4078\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eUse page reference for existing internal link targets (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4076\"\u003e#4076\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eArabic-Indic digits are reversed during text extraction (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4077\"\u003e#4077\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eParse a string rect for add_uri into a rectangle (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4074\"\u003e#4074\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/py-pdf/pypdf/compare/6.18.1...6.19.0\"\u003eFull Changelog\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003eVersion 6.18.1, 2026-09-11\u003c/h2\u003e\n\u003ch3\u003eSecurity (SEC)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eFurther restrict FlateDecode recovery (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4073\"\u003e#4073\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eLimit entry count for TrueType and Type1 font \u003ccode\u003e/Widths\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4072\"\u003e#4072\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eLimit allowed length of tokens in parse_bfchar (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4071\"\u003e#4071\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eBug Fixes (BUG)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eUse current text matrix for visitor_text (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4062\"\u003e#4062\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eRepeat the letter for /S /A and /S /a page labels past Z (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4065\"\u003e#4065\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eUse font color for FreeText default appearance (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4051\"\u003e#4051\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eRobustness (ROB)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eFix compatibility with fonttools \u0026lt; 4.58.0 (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4050\"\u003e#4050\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4059\"\u003e#4059\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eDocumentation (DOC)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eUse combined matrix in visitor examples (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4066\"\u003e#4066\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/py-pdf/pypdf/compare/6.18.0...6.18.1\"\u003eFull Changelog\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003eVersion 6.18.0, 2026-09-07\u003c/h2\u003e\n\u003ch3\u003eSecurity (SEC)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eLimit allowed length of indirect object tokens (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4055\"\u003e#4055\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eDeprecations (DEP)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eRework configuration value handling (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4044\"\u003e#4044\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eNew Features (ENH)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eDraw borders and backgrounds for appearance streams and annotations (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4033\"\u003e#4033\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/py-pdf/pypdf/commit/d62cb58d3988b291b0435eddfd118c4f8f6b6a46\"\u003e\u003ccode\u003ed62cb58\u003c/code\u003e\u003c/a\u003e REL: 6.19.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/py-pdf/pypdf/commit/0d8b5a8832cde1ba308b5c27567b879b7b7eed4a\"\u003e\u003ccode\u003e0d8b5a8\u003c/code\u003e\u003c/a\u003e SEC: Limit size of alphabetical page labels (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4096\"\u003e#4096\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/py-pdf/pypdf/commit/959467a9b95be83e2dc5ae873ece5f371263ede7\"\u003e\u003ccode\u003e959467a\u003c/code\u003e\u003c/a\u003e PI: Move static value out of loop body for appearance stream data (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4087\"\u003e#4087\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/py-pdf/pypdf/commit/20822b263f063c96ad535405f5b8c4d81768950b\"\u003e\u003ccode\u003e20822b2\u003c/code\u003e\u003c/a\u003e DEV: Bump zizmorcore/zizmor-action from 0.6.3 to 0.6.4 (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4093\"\u003e#4093\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/py-pdf/pypdf/commit/25f230191b89cdcf2b4ba3d8051d52c7392831d0\"\u003e\u003ccode\u003e25f2301\u003c/code\u003e\u003c/a\u003e DEP: Replace PdfWriter method add_js (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/3979\"\u003e#3979\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/py-pdf/pypdf/commit/a92443848fda10cc2a65a7b6397fd8e1986c17d2\"\u003e\u003ccode\u003ea924438\u003c/code\u003e\u003c/a\u003e BUG: Do not copy unrelated pages when appending pages with non-terminal field...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/py-pdf/pypdf/commit/cf5cec2e49b9da8fae0d82a0f99f1bfe9eceb8ed\"\u003e\u003ccode\u003ecf5cec2\u003c/code\u003e\u003c/a\u003e BUG: Use page reference for existing internal link targets (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4076\"\u003e#4076\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/py-pdf/pypdf/commit/96d81f05ba4b3ec9ff1b3c3e52bc71a3cdd702c7\"\u003e\u003ccode\u003e96d81f0\u003c/code\u003e\u003c/a\u003e BUG: Arabic-Indic digits are reversed during text extraction (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4077\"\u003e#4077\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/py-pdf/pypdf/commit/2d219015b4cf92edcfd6d28c564295f0704fd204\"\u003e\u003ccode\u003e2d21901\u003c/code\u003e\u003c/a\u003e DEV: Fix Color class for latest mypy (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4082\"\u003e#4082\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/py-pdf/pypdf/commit/893a01002aa8e23b3a61ae4b38ab74edbc904ab9\"\u003e\u003ccode\u003e893a010\u003c/code\u003e\u003c/a\u003e MAINT: Split PdfDocCommon._flatten (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4070\"\u003e#4070\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/py-pdf/pypdf/compare/6.14.2...6.19.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `mcp` from 1.28.1 to 1.30.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/modelcontextprotocol/python-sdk/releases\"\u003emcp's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev1.30.0\u003c/h2\u003e\n\u003cp\u003eMaintenance release of the 1.x line. 2.x is the current line; 1.x docs are at \u003ca href=\"https://py.sdk.modelcontextprotocol.io/v1/\"\u003ehttps://py.sdk.modelcontextprotocol.io/v1/\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eA few defaults changed in this release. If you run a server or client on 1.x, skim these first:\u003c/p\u003e\n\u003ch2\u003eBehaviour changes\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eHTTP client redirects are only followed within the endpoint's origin\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/modelcontextprotocol/python-sdk/issues/3448\"\u003e#3448\u003c/a\u003e)\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003estreamable_http_client\u003c/code\u003e and \u003ccode\u003esse_client\u003c/code\u003e follow a redirect only if it stays on the same scheme, host and port (or upgrades \u003ccode\u003ehttp\u003c/code\u003e to \u003ccode\u003ehttps\u003c/code\u003e on the same host).\u003c/li\u003e\n\u003cli\u003eA redirect anywhere else now fails the request with \u003ccode\u003ehttpx.HTTPStatusError\u003c/code\u003e. If that other URL is the server you meant, use it as the endpoint URL.\u003c/li\u003e\n\u003cli\u003eThe \u003ccode\u003efollow_redirects\u003c/code\u003e setting on an \u003ccode\u003ehttpx.AsyncClient\u003c/code\u003e you pass in is no longer used for MCP requests, so you don't need it for the trailing-slash redirect any more.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eOAuthClientProvider\u003c/code\u003e applies the same rule to its own requests.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eIdle Streamable HTTP sessions now expire\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/modelcontextprotocol/python-sdk/issues/3426\"\u003e#3426\u003c/a\u003e)\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eA stateful session with nothing in flight for 30 minutes is closed. The client's next request gets a 404 and it has to initialize again.\u003c/li\u003e\n\u003cli\u003eClients that keep the GET stream open (the SDK's client does) are not affected.\u003c/li\u003e\n\u003cli\u003eA server also holds at most 10 000 sessions at once; beyond that, new sessions get a 503.\u003c/li\u003e\n\u003cli\u003eTo turn either off: \u003ccode\u003eFastMCP(..., session_idle_timeout=None, max_sessions=None)\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eThe OAuth client checks the authorization server's \u003ccode\u003eissuer\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/modelcontextprotocol/python-sdk/issues/3431\"\u003e#3431\u003c/a\u003e)\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eAuthorization server metadata whose \u003ccode\u003eissuer\u003c/code\u003e doesn't match the server it was fetched for is now rejected with \u003ccode\u003eOAuthFlowError: Authorization server metadata issuer mismatch\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eClient registrations are now remembered per issuer; if the server later points at a different authorization server, the client registers again.\u003c/li\u003e\n\u003cli\u003eIf protected resource metadata can't be fetched because of a 5xx/429, the flow now stops instead of falling back to the legacy endpoints.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eTwo new \u003ccode\u003eDeprecationWarning\u003c/code\u003es\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/modelcontextprotocol/python-sdk/issues/3431\"\u003e#3431\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/modelcontextprotocol/python-sdk/issues/3451\"\u003e#3451\u003c/a\u003e)\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eClientCredentialsOAuthProvider\u003c/code\u003e / \u003ccode\u003ePrivateKeyJWTOAuthProvider\u003c/code\u003e without \u003ccode\u003eissuer=\u003c/code\u003e. Pass your authorization server's issuer URL.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eAuthSettings\u003c/code\u003e with \u003ccode\u003eresource_server_url\u003c/code\u003e set but \u003ccode\u003evalidate_token_resource\u003c/code\u003e unset. Set it to \u003ccode\u003eTrue\u003c/code\u003e or \u003ccode\u003eFalse\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eBoth keep working as before in 1.x; this mostly matters if your tests turn warnings into errors.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eAuthSettings.validate_token_resource\u003c/code\u003e: only accept tokens your \u003ccode\u003eTokenVerifier\u003c/code\u003e reports as issued for this server (\u003ca href=\"https://redirect.github.com/modelcontextprotocol/python-sdk/issues/3451\"\u003e#3451\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eissuer=\u003c/code\u003e on \u003ccode\u003eClientCredentialsOAuthProvider\u003c/code\u003e and \u003ccode\u003ePrivateKeyJWTOAuthProvider\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/modelcontextprotocol/python-sdk/issues/3431\"\u003e#3431\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003esession_idle_timeout=\u003c/code\u003e and \u003ccode\u003emax_sessions=\u003c/code\u003e on \u003ccode\u003eFastMCP\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/modelcontextprotocol/python-sdk/issues/3426\"\u003e#3426\u003c/a\u003e).\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e[v1.x] Resolve tool output-schema references within the schema document only by \u003ca href=\"https://github.com/maxisbey\"\u003e\u003ccode\u003e@​maxisbey\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/modelcontextprotocol/python-sdk/pull/3396\"\u003emodelcontextprotocol/python-sdk#3396\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[v1.x] Expire idle Streamable HTTP sessions by default and cap concurrent sessions by \u003ca href=\"https://github.com/maxisbey\"\u003e\u003ccode\u003e@​maxisbey\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/modelcontextprotocol/python-sdk/pull/3426\"\u003emodelcontextprotocol/python-sdk#3426\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[v1.x] Validate the authorization server metadata issuer on every discovery path by \u003ca href=\"https://github.com/maxisbey\"\u003e\u003ccode\u003e@​maxisbey\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/modelcontextprotocol/python-sdk/pull/3431\"\u003emodelcontextprotocol/python-sdk#3431\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[v1.x] Follow redirects only within the MCP endpoint's origin by \u003ca href=\"https://github.com/maxisbey\"\u003e\u003ccode\u003e@​maxisbey\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/modelcontextprotocol/python-sdk/pull/3448\"\u003emodelcontextprotocol/python-sdk#3448\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[v1.x] Add AuthSettings.validate_token_resource to check a bearer token's resource by \u003ca href=\"https://github.com/maxisbey\"\u003e\u003ccode\u003e@​maxisbey\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/modelcontextprotocol/python-sdk/pull/3451\"\u003emodelcontextprotocol/python-sdk#3451\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/modelcontextprotocol/python-sdk/compare/v1.29.1...v1.30.0\"\u003ehttps://github.com/modelcontextprotocol/python-sdk/compare/v1.29.1...v1.30.0\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003ev1.29.1\u003c/h2\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e[v1.x] Complete the FastMCP Settings model at import time by \u003ca href=\"https://github.com/maxisbey\"\u003e\u003ccode\u003e@​maxisbey\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/modelcontextprotocol/python-sdk/pull/3352\"\u003emodelcontextprotocol/python-sdk#3352\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[v1.x] Apply the request body limit to the SSE and OAuth endpoints by \u003ca href=\"https://github.com/maxisbey\"\u003e\u003ccode\u003e@​maxisbey\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/modelcontextprotocol/python-sdk/pull/3344\"\u003emodelcontextprotocol/python-sdk#3344\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/modelcontextprotocol/python-sdk/commit/8c2fa6eabacde869d75568e33b9d466b58c2f512\"\u003e\u003ccode\u003e8c2fa6e\u003c/code\u003e\u003c/a\u003e [v1.x] Add AuthSettings.validate_token_resource to check a bearer token's res...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/modelcontextprotocol/python-sdk/commit/2106335745563b2321b8c73fef2c12903d00aa6e\"\u003e\u003ccode\u003e2106335\u003c/code\u003e\u003c/a\u003e [v1.x] Follow redirects only within the MCP endpoint's origin (\u003ca href=\"https://redirect.github.com/modelcontextprotocol/python-sdk/issues/3448\"\u003e#3448\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/modelcontextprotocol/python-sdk/commit/3eed7ce0a6aba76e8d94c4cfb9b266f41935392c\"\u003e\u003ccode\u003e3eed7ce\u003c/code\u003e\u003c/a\u003e [v1.x] Validate the authorization server metadata issuer on every discovery p...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/modelcontextprotocol/python-sdk/commit/92120b4b0f50385af096592d7cee932fc1d994e7\"\u003e\u003ccode\u003e92120b4\u003c/code\u003e\u003c/a\u003e [v1.x] Expire idle Streamable HTTP sessions by default and cap concurrent ses...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/modelcontextprotocol/python-sdk/commit/5ebdfed4060d8e5b11b8e2348f86bad4d1fb8836\"\u003e\u003ccode\u003e5ebdfed\u003c/code\u003e\u003c/a\u003e [v1.x] Resolve tool output-schema references within the schema document only ...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/modelcontextprotocol/python-sdk/commit/b22271305c59dfc7910f1493faea78cb1d396e48\"\u003e\u003ccode\u003eb222713\u003c/code\u003e\u003c/a\u003e [v1.x] Give recursive tool return types an object-rooted output schema (\u003ca href=\"https://redirect.github.com/modelcontextprotocol/python-sdk/issues/3377\"\u003e#3377\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/modelcontextprotocol/python-sdk/commit/4dc224fab201bdef2fd5a065976b7ca31420187c\"\u003e\u003ccode\u003e4dc224f\u003c/code\u003e\u003c/a\u003e [v1.x] Apply the request body limit to the SSE and OAuth endpoints (\u003ca href=\"https://redirect.github.com/modelcontextprotocol/python-sdk/issues/3344\"\u003e#3344\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/modelcontextprotocol/python-sdk/commit/ae3338f6b396378217921aeadeca10a68e273c2d\"\u003e\u003ccode\u003eae3338f\u003c/code\u003e\u003c/a\u003e [v1.x] Complete the FastMCP Settings model at import time (\u003ca href=\"https://redirect.github.com/modelcontextprotocol/python-sdk/issues/3352\"\u003e#3352\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/modelcontextprotocol/python-sdk/commit/98b7159cb89274964055d2c016e3360a551280d0\"\u003e\u003ccode\u003e98b7159\u003c/code\u003e\u003c/a\u003e [v1.x] Move the v1.x docs to /v1/ and mark v1.x as the maintenance line (\u003ca href=\"https://redirect.github.com/modelcontextprotocol/python-sdk/issues/3177\"\u003e#3177\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/modelcontextprotocol/python-sdk/commit/c0c5a9d64253ebf89a67955b2979dfa198707d67\"\u003e\u003ccode\u003ec0c5a9d\u003c/code\u003e\u003c/a\u003e [v1.x] ci: pick the docs toolchain per worktree in build-docs.sh (\u003ca href=\"https://redirect.github.com/modelcontextprotocol/python-sdk/issues/3082\"\u003e#3082\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/modelcontextprotocol/python-sdk/compare/v1.28.1...v1.30.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `pymongo` from 4.17.0 to 4.18.2\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/mongodb/mongo-python-driver/releases\"\u003epymongo's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ePyMongo 4.18.2\u003c/h2\u003e\n\u003cp\u003eCommunity notes: \u003ca href=\"https://www.mongodb.com/community/forums/t/pymongo-4-18-2-released/343732\"\u003ehttps://www.mongodb.com/community/forums/t/pymongo-4-18-2-released/343732\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://www.cve.org/CVERecord?id=CVE-2026-96749\"\u003eCVE-2026-96749\u003c/a\u003e\n\u003ca href=\"https://www.cve.org/CVERecord?id=CVE-2026-96748\"\u003eCVE-2026-96748\u003c/a\u003e\n\u003ca href=\"https://www.cve.org/CVERecord?id=CVE-2026-96747\"\u003eCVE-2026-96747\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003ePyMongo 4.18.1\u003c/h2\u003e\n\u003cp\u003eCommunity notes: \u003ca href=\"https://www.mongodb.com/community/forums/t/pymongo-4-18-1-released/343338\"\u003ehttps://www.mongodb.com/community/forums/t/pymongo-4-18-1-released/343338\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003ePyMongo 4.18.0\u003c/h2\u003e\n\u003cp\u003eCommunity notes: \u003ca href=\"https://www.mongodb.com/community/forums/t/pymongo-4-18-released/343137\"\u003ehttps://www.mongodb.com/community/forums/t/pymongo-4-18-released/343137\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/mongodb/mongo-python-driver/blob/main/doc/changelog.rst\"\u003epymongo's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003eChanges in Version 4.18.2 (2026/09/24)\u003c/h2\u003e\n\u003cp\u003eVersion 4.18.2 is a bug fix release.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eHardened the bson buffer size guard against signed integer overflow. (\u003ccode\u003eCVE-2026-96749\u003c/code\u003e_).\u003c/li\u003e\n\u003cli\u003eFixed connection string parsing to percent-decode each host individually. (\u003ccode\u003eCVE-2026-96748\u003c/code\u003e_).\u003c/li\u003e\n\u003cli\u003eClient-side field level encryption now rejects a KMS endpoint ending in \u003ccode\u003e.sock\u003c/code\u003e. (\u003ccode\u003eCVE-2026-96747\u003c/code\u003e_).\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e.. _CVE-2026-96749: \u003ca href=\"https://www.cve.org/CVERecord?id=CVE-2026-96749\"\u003ehttps://www.cve.org/CVERecord?id=CVE-2026-96749\u003c/a\u003e\n.. _CVE-2026-96748: \u003ca href=\"https://www.cve.org/CVERecord?id=CVE-2026-96748\"\u003ehttps://www.cve.org/CVERecord?id=CVE-2026-96748\u003c/a\u003e\n.. _CVE-2026-96747: \u003ca href=\"https://www.cve.org/CVERecord?id=CVE-2026-96747\"\u003ehttps://www.cve.org/CVERecord?id=CVE-2026-96747\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eIssues Resolved\n...............\u003c/p\u003e\n\u003cp\u003eSee the \u003ccode\u003ePyMongo 4.18.2 release notes in JIRA\u003c/code\u003e_ for the list of resolved issues\nin this release.\u003c/p\u003e\n\u003cp\u003e.. _PyMongo 4.18.2 release notes in JIRA: \u003ca href=\"https://jira.mongodb.org/secure/ReleaseNote.jspa?projectId=10004\u0026amp;version=52896\"\u003ehttps://jira.mongodb.org/secure/ReleaseNote.jspa?projectId=10004\u0026amp;version=52896\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003eChanges in Version 4.18.1 (2026/09/10)\u003c/h2\u003e\n\u003cp\u003eVersion 4.18.1 is a bug fix release.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eUse an exact match for the file ID in GridFS delete methods\n(\u003ccode\u003eCVE-2026-88029\u003c/code\u003e_).\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e.. _CVE-2026-88029: \u003ca href=\"https://www.cve.org/CVERecord?id=CVE-2026-88029\"\u003ehttps://www.cve.org/CVERecord?id=CVE-2026-88029\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003eChanges in Version 4.18.0 (2026/09/03)\u003c/h2\u003e\n\u003cp\u003ePyMongo 4.18 brings a number of changes including:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eAdded \u003ccode\u003esrvAllowedHostsSuffix\u003c/code\u003e as a URI option and keyword argument to\n:class:\u003ccode\u003e~pymongo.synchronous.mongo_client.MongoClient\u003c/code\u003e and\n:class:\u003ccode\u003e~pymongo.asynchronous.mongo_client.AsyncMongoClient\u003c/code\u003e. When connecting\nvia \u003ccode\u003emongodb+srv://\u003c/code\u003e, this option overrides the default requirement that\nSRV-returned hosts share the same parent domain as the seed hostname,\nallowing hosts under a different domain suffix to be accepted. The suffix must\nnot be a public suffix (per the \u003ccode\u003ePublic Suffix List \u0026lt;https://publicsuffix.org/list/\u0026gt;\u003c/code\u003e_). See the\n:class:\u003ccode\u003e~pymongo.synchronous.mongo_client.MongoClient\u003c/code\u003e and\n:class:\u003ccode\u003e~pymongo.asynchronous.mongo_client.AsyncMongoClient\u003c/code\u003e documentation for\nsecurity considerations.\u003c/li\u003e\n\u003cli\u003eDropped support for MongoDB 4.2.\u003c/li\u003e\n\u003cli\u003eAdded support for MongoDB 9.0.\u003c/li\u003e\n\u003cli\u003ePyPy support is deprecated and will be removed in a future release.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mongodb/mongo-python-driver/commit/640dd2383a1a2fb1a10e5222d50ebc0b22a61bd7\"\u003e\u003ccode\u003e640dd23\u003c/code\u003e\u003c/a\u003e Prep 4.18.2 release (\u003ca href=\"https://redirect.github.com/mongodb/mongo-python-driver/issues/3066\"\u003e#3066\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mongodb/mongo-python-driver/commit/6a0ec650ee7942e24e9aa0848937d66e792f1834\"\u003e\u003ccode\u003e6a0ec65\u003c/code\u003e\u003c/a\u003e Update changelog for CVE-2026-88029 reference (\u003ca href=\"https://redirect.github.com/mongodb/mongo-python-driver/issues/3049\"\u003e#3049\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mongodb/mongo-python-driver/commit/44be553d2a55394596d2d47a6bafca9f7ced9809\"\u003e\u003ccode\u003e44be553\u003c/code\u003e\u003c/a\u003e BUMP 4.18.2.dev0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mongodb/mongo-python-driver/commit/127d140440715f2897ccf74d35fec47a32e34af8\"\u003e\u003ccode\u003e127d140\u003c/code\u003e\u003c/a\u003e PYTHON-6085 Prep for 4.18.1 release (\u003ca href=\"https://redirect.github.com/mongodb/mongo-python-driver/issues/3047\"\u003e#3047\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mongodb/mongo-python-driver/commit/fa676586ba4b399168a4d1d41c30dc2166cc44fd\"\u003e\u003ccode\u003efa67658\u003c/code\u003e\u003c/a\u003e PYTHON-5994 Use exact match for file ID in GridFS delete methods (\u003ca href=\"https://redirect.github.com/mongodb/mongo-python-driver/issues/3046\"\u003e#3046\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mongodb/mongo-python-driver/commit/1011e57e7f95b14d3c398f3225dcc130b8469a12\"\u003e\u003ccode\u003e1011e57\u003c/code\u003e\u003c/a\u003e Prep branch v4.18\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mongodb/mongo-python-driver/commit/4dd73032d98146fd97bedfb8434bff2f458bc26f\"\u003e\u003ccode\u003e4dd7303\u003c/code\u003e\u003c/a\u003e PYTHON-6076 Request workflows permission in create-release-branch (\u003ca href=\"https://redirect.github.com/mongodb/mongo-python-driver/issues/3039\"\u003e#3039\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mongodb/mongo-python-driver/commit/e66da83c219e82497da46c968a542ed7e792e240\"\u003e\u003ccode\u003ee66da83\u003c/code\u003e\u003c/a\u003e PYTHON-5956 Use shared python/setup action for CI setup (\u003ca href=\"https://redirect.github.com/mongodb/mongo-python-driver/issues/2990\"\u003e#2990\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mongodb/mongo-python-driver/commit/22a2ec8af10a4ef697518392f55fbb3baddd335b\"\u003e\u003ccode\u003e22a2ec8\u003c/code\u003e\u003c/a\u003e PYTHON-6021 Move _write_concern_for_cmd into BaseObject (\u003ca href=\"https://redirect.github.com/mongodb/mongo-python-driver/issues/3036\"\u003e#3036\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mongodb/mongo-python-driver/commit/2a4a0047c8a769c36ea3463489234485b34dd08b\"\u003e\u003ccode\u003e2a4a004\u003c/code\u003e\u003c/a\u003e PYTHON-5874 Fix test_fork.py failures on Python 3.15 due to fork() Deprecatio...\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/mongodb/mongo-python-driver/compare/4.17.0...4.18.2\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `langchain-nvidia-ai-endpoints` from 1.0.4 to 1.4.2\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/langchain-ai/langchain-nvidia/releases\"\u003elangchain-nvidia-ai-endpoints's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003eRelease - langchain-nvidia-ai-endpoints==1.4.2\u003c/h2\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003echore(deps): bump aiohttp from 3.13.4 to 3.14.0 in /libs/ai-endpoints in the pip group across 1 directory by \u003ca href=\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/316\"\u003elangchain-ai/langchain-nvidia#316\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat(ai-endpoints): add version metadata to NVIDIA models by \u003ca href=\"https://github.com/mdrxy\"\u003e\u003ccode\u003e@​mdrxy\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/318\"\u003elangchain-ai/langchain-nvidia#318\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): bump aiohttp from 3.14.0 to 3.14.1 in /libs/ai-endpoints in the pip group across 1 directory by \u003ca href=\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/319\"\u003elangchain-ai/langchain-nvidia#319\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix ChatNVIDIA timeout being treated as a model parameter by \u003ca href=\"https://github.com/0Sh1khar\"\u003e\u003ccode\u003e@​0Sh1khar\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/317\"\u003elangchain-ai/langchain-nvidia#317\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore: pin aiohttp below 3.14 for vcrpy compatibility by \u003ca href=\"https://github.com/jiayin-nvidia\"\u003e\u003ccode\u003e@​jiayin-nvidia\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/320\"\u003elangchain-ai/langchain-nvidia#320\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix: use inactivity timeouts for async streaming by \u003ca href=\"https://github.com/jiayin-nvidia\"\u003e\u003ccode\u003e@​jiayin-nvidia\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/323\"\u003elangchain-ai/langchain-nvidia#323\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRelease/1.4.2 by \u003ca href=\"https://github.com/soumilinandi\"\u003e\u003ccode\u003e@​soumilinandi\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/324\"\u003elangchain-ai/langchain-nvidia#324\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/0Sh1khar\"\u003e\u003ccode\u003e@​0Sh1khar\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/317\"\u003elangchain-ai/langchain-nvidia#317\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/langchain-ai/langchain-nvidia/compare/libs/ai-endpoints/v1.4.1...libs/ai-endpoints/v1.4.2\"\u003ehttps://github.com/langchain-ai/langchain-nvidia/compare/libs/ai-endpoints/v1.4.1...libs/ai-endpoints/v1.4.2\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003eRelease - langchain-nvidia-ai-endpoints==1.4.1\u003c/h2\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eadd tool support for qwen3.5-122b-a10b by \u003ca href=\"https://github.com/vidushig-nv\"\u003e\u003ccode\u003e@​vidushig-nv\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/312\"\u003elangchain-ai/langchain-nvidia#312\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eKeep ChatNVIDIA verify_ssl out of payload by \u003ca href=\"https://github.com/freshyjmp\"\u003e\u003ccode\u003e@​freshyjmp\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/314\"\u003elangchain-ai/langchain-nvidia#314\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ebumping version for release by \u003ca href=\"https://github.com/soumilinandi\"\u003e\u003ccode\u003e@​soumilinandi\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/315\"\u003elangchain-ai/langchain-nvidia#315\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/freshyjmp\"\u003e\u003ccode\u003e@​freshyjmp\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/314\"\u003elangchain-ai/langchain-nvidia#314\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/langchain-ai/langchain-nvidia/compare/libs/ai-endpoints/v1.4.0...libs/ai-endpoints/v1.4.1\"\u003ehttps://github.com/langchain-ai/langchain-nvidia/compare/libs/ai-endpoints/v1.4.0...libs/ai-endpoints/v1.4.1\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003eRelease - langchain-nvidia-ai-endpoints==1.4.0\u003c/h2\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003echore(deps): bump the pip group across 3 directories with 2 updates by \u003ca href=\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/302\"\u003elangchain-ai/langchain-nvidia#302\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(ai-endpoints): report per-invocation model in traces by \u003ca href=\"https://github.com/mdrxy\"\u003e\u003ccode\u003e@​mdrxy\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/305\"\u003elangchain-ai/langchain-nvidia#305\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): bump the pip group across 3 directories with 1 update by \u003ca href=\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/304\"\u003elangchain-ai/langchain-nvidia#304\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix Feature/nvidia retriever support for RAG v2.6.0 by \u003ca href=\"https://github.com/shubhadeepd\"\u003e\u003ccode\u003e@​shubhadeepd\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/306\"\u003elangchain-ai/langchain-nvidia#306\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): bump the pip group across 3 directories with 1 update by \u003ca href=\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/308\"\u003elangchain-ai/langchain-nvidia#308\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003erelease: langchain-nvidia-ai-endpoints 1.4.0 by \u003ca href=\"https://github.com/jiayin-nvidia\"\u003e\u003ccode\u003e@​jiayin-nvidia\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/309\"\u003elangchain-ai/langchain-nvidia#309\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/langchain-ai/langchain-nvidia/compare/libs/ai-endpoints/v1.3.0...libs/ai-endpoints/v1.4.0\"\u003ehttps://github.com/langchain-ai/langchain-nvidia/compare/libs/ai-endpoints/v1.3.0...libs/ai-endpoints/v1.4.0\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003eRelease - langchain-nvidia-ai-endpoints==1.3.0\u003c/h2\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003echore(deps): bump the pip group across 2 directories with 1 update by \u003ca href=\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/277\"\u003elangchain-ai/langchain-nvidia#277\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): bump the pip group across 2 directories with 1 update by \u003ca href=\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/279\"\u003elangchain-ai/langchain-nvidia#279\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix 3 Dependabot security alerts (Pygments, orjson, requests) by \u003ca href=\"https://github.com/jkennedyvz\"\u003e\u003ccode\u003e@​jkennedyvz\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/280\"\u003elangchain-ai/langchain-nvidia#280\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): bump aiohttp from 3.13.3 to 3.13.4 in /libs/ai-endpoints in the pip group across 1 directory by \u003ca href=\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/281\"\u003elangchain-ai/langchain-nvidia#281\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix: Deduplicate models from /v1/models API response by \u003ca href=\"https://github.com/bbednarski9\"\u003e\u003ccode\u003e@​bbednarski9\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/282\"\u003elangchain-ai/langchain-nvidia#282\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): bump the pip group across 2 directories with 1 update by \u003ca href=\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/283\"\u003elangchain-ai/langchain-nvidia#283\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eadding glm models by \u003ca href=\"https://github.com/soumilinandi\"\u003e\u003ccode\u003e@​soumilinandi\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/276\"\u003elangchain-ai/langchain-nvidia#276\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eqwen/qwen3.5-122b-a10b\u003c/code\u003e and \u003ccode\u003emistralai/mistral-small-4-119b-2603\u003c/code\u003e by \u003ca href=\"https://github.com/jiayin-nvidia\"\u003e\u003ccode\u003e@​jiayin-nvidia\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/285\"\u003elangchain-ai/langchain-nvidia#285\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix: xfail unsupported thinking-mode case on self-hosted NIM by \u003ca href=\"https://github.com/jiayin-nvidia\"\u003e\u003ccode\u003e@​jiayin-nvidia\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/286\"\u003elangchain-ai/langchain-nvidia#286\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): bump the pip group across 3 directories with 2 updates by \u003ca href=\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/pull/287\"\u003elangchain-ai/langchain-nvidia#287\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langchain-nvidia/commit/984db834e83461f93520b88b7377c26bb895574c\"\u003e\u003ccode\u003e984db83\u003c/code\u003e\u003c/a\u003e Release/1.4.2 (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/issues/324\"\u003e#324\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langchain-nvidia/commit/648e3fb16c73e5e79986ef2e48802db101d583ee\"\u003e\u003ccode\u003e648e3fb\u003c/code\u003e\u003c/a\u003e fix: use inactivity timeouts for async streaming (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/issues/323\"\u003e#323\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langchain-nvidia/commit/b483c7cad07dd9d5fd0fee2668238c4a08825d86\"\u003e\u003ccode\u003eb483c7c\u003c/code\u003e\u003c/a\u003e Merge commit from fork\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langchain-nvidia/commit/7ebc4cb23a756cd54931b6deb8c6f0450f32ff02\"\u003e\u003ccode\u003e7ebc4cb\u003c/code\u003e\u003c/a\u003e chore: pin aiohttp below 3.14 for vcrpy compatibility (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/issues/320\"\u003e#320\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langchain-nvidia/commit/5ad40e077b33beb29849313625056518facc9200\"\u003e\u003ccode\u003e5ad40e0\u003c/code\u003e\u003c/a\u003e Fix ChatNVIDIA timeout being treated as a model parameter (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/issues/317\"\u003e#317\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langchain-nvidia/commit/875325c3cd3c61a59f80243eb4efee17287e2e32\"\u003e\u003ccode\u003e875325c\u003c/code\u003e\u003c/a\u003e chore(deps): bump aiohttp from 3.14.0 to 3.14.1 in /libs/ai-endpoints in the ...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langchain-nvidia/commit/8a0588d97f06a91204ee466a4a68baa0dc5ccb7e\"\u003e\u003ccode\u003e8a0588d\u003c/code\u003e\u003c/a\u003e feat(ai-endpoints): add version metadata to NVIDIA models (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/issues/318\"\u003e#318\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langchain-nvidia/commit/7a56ac888f9eab2af44c16885d572f981d2534cf\"\u003e\u003ccode\u003e7a56ac8\u003c/code\u003e\u003c/a\u003e chore(deps): bump aiohttp from 3.13.4 to 3.14.0 in /libs/ai-endpoints in the ...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langchain-nvidia/commit/bba3386a02dcf4b94276ebfeab3643de639162e4\"\u003e\u003ccode\u003ebba3386\u003c/code\u003e\u003c/a\u003e bumping version for release (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/issues/315\"\u003e#315\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langchain-nvidia/commit/8bcea30e7dcbd7e5eaa3abf5caf7b3676d380298\"\u003e\u003ccode\u003e8bcea30\u003c/code\u003e\u003c/a\u003e Keep ChatNVIDIA verify_ssl out of payload (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain-nvidia/issues/314\"\u003e#314\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/langchain-ai/langchain-nvidia/compare/libs/ai-endpoints/v1.0.4...libs/ai-endpoints/v1.4.2\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `gitpython` from 3.1.57 to 3.1.62\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/gitpython-developers/GitPython/releases\"\u003egitpython's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e3.1.62\u003c/h2\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eprepare next release by \u003ca href=\"https://github.com/Byron\"\u003e\u003ccode\u003e@​Byron\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/gitpython-developers/GitPython/pull/2222\"\u003egitpython-developers/GitPython#2222\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eKeep bare-repository worktrees non-bare by \u003ca href=\"https://github.com/Byron\"\u003e\u003ccode\u003e@​Byron\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/gitpython-developers/GitPython/pull/2224\"\u003egitpython-developers/GitPython#2224\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eReject unsafe submodule checkout paths by \u003ca href=\"https://github.com/Byron\"\u003e\u003ccode\u003e@​Byron\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/gitpython-developers/GitPython/pull/2225\"\u003egitpython-developers/GitPython#2225\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ebuild(deps): bump \u003ca href=\"https://github.com/astral-sh/ruff-pre-commit\"\u003ehttps://github.com/astral-sh/ruff-pre-commit\u003c/a\u003e from v0.16.0 to 0.16.5 in the pre-commit group by \u003ca href=\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/gitpython-developers/GitPython/pull/2226\"\u003egitpython-developers/GitPython#2226\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix: join backslash line continuations when reading config values by \u003ca href=\"https://github.com/nkbeast\"\u003e\u003ccode\u003e@​nkbeast\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/gitpython-developers/GitPython/pull/2227\"\u003egitpython-developers/GitPython#2227\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/nkbeast\"\u003e\u003ccode\u003e@​nkbeast\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/gitpython-developers/GitPython/pull/2227\"\u003egitpython-developers/GitPython#2227\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/gitpython-developers/GitPython/compare/3.1.61...3.1.62\"\u003ehttps://github.com/gitpython-developers/GitPython/compare/3.1.61...3.1.62\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e3.1.61\u003c/h2\u003e\n\u003cp\u003eFix accidental removal of exploitable regex in \u003ccode\u003eActor\u003c/code\u003e by bringing it back, and deprecating it.\u003c/p\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eFix repository discovery precedence by \u003ca href=\"https://github.com/Byron\"\u003e\u003ccode\u003e@​Byron\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/gitpython-developers/GitPython/pull/2218\"\u003egitpython-developers/GitPython#2218\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix: wait for git daemon to listen before connecting by \u003ca href=\"https://github.com/Vogtinator\"\u003e\u003ccode\u003e@​Vogtinator\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/gitpython-developers/GitPython/pull/2219\"\u003egitpython-developers/GitPython#2219\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix: restore Actor.name_email_regex by \u003ca href=\"https://github.com/Byron\"\u003e\u003ccode\u003e@​Byron\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/gitpython-developers/GitPython/pull/2221\"\u003egitpython-developers/GitPython#2221\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/Vogtinator\"\u003e\u003ccode\u003e@​Vogtinator\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/gitpython-developers/GitPython/pull/2219\"\u003egitpython-developers/GitPython#2219\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/gitpython-developers/GitPython/compare/3.1.60...3.1.61\"\u003ehttps://github.com/gitpython-developers/GitPython/compare/3.1.60...3.1.61\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e3.1.60 Security\u003c/h2\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eprepare changelog prior to release by \u003ca href=\"https://github.com/Byron\"\u003e\u003ccode\u003e@​Byron\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/gitpython-developers/GitPython/pull/2212\"\u003egitpython-developers/GitPython#2212\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ePreserve Git config escape semantics by \u003ca href=\"https://github.com/Byron\"\u003e\u003ccode\u003e@​Byron\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/gitpython-developers/GitPython/pull/2213\"\u003egitpython-developers/GitPython#2213\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eHarden diff path and actor identity parsing by \u003ca href=\"https://github.com/Byron\"\u003e\u003ccode\u003e@​Byron\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/gitpython-developers/GitPython/pull/2215\"\u003egitpython-developers/GitPython#2215\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRequire explicit opt-in for filesystem diffs by \u003ca href=\"https://github.com/Byron\"\u003e\u003ccode\u003e@​Byron\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/gitpython-developers/GitPython/pull/2217\"\u003egitpython-developers/GitPython#2217\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/gitpython-developers/GitPython/compare/3.1.59...3.1.60\"\u003ehttps://github.com/gitpython-developers/GitPython/compare/3.1.59...3.1.60\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e3.1.59 - Security\u003c/h2\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eprepare changelog for upcoming release by \u003ca href=\"https://github.com/Byron\"\u003e\u003ccode\u003e@​Byron\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/gitpython-developers/GitPython/pull/2207\"\u003egitpython-developers/GitPython#2207\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBlock file-reading Git options by \u003ca href=\"https://github.com/Byron\"\u003e\u003ccode\u003e@​Byron\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/gitpython-developers/GitPython/pull/2208\"\u003egitpython-developers/GitPython#2208\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eindex: write blobs via git hash-object, not gitdb's odb.store by \u003ca href=\"https://github.com/caroescm\"\u003e\u003ccode\u003e@​caroescm\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/gitpython-developers/GitPython/pull/2209\"\u003egitpython-developers/GitPython#2209\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBlock separate git directories during clone by \u003ca href=\"https://github.com/Byron\"\u003e\u003ccode\u003e@​Byron\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/gitpython-developers/GitPython/pull/2210\"\u003egitpython-developers/GitPython#2210\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix: harden config parsing boundaries by \u003ca href=\"https://github.com/Byron\"\u003e\u003ccode\u003e@​Byron\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/gitpython-developers/GitPython/pull/2211\"\u003egitpython-developers/GitPython#2211\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003erepo.index.add()\u003c/code\u003e now respects worktree filters  \u003ca href=\"https://redirect.github.com/gitpython-developers/GitPython/pull/2209\"\u003egitpython-developers/GitPython#2209\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/gitpython-developers/GitPython/compare/3.1.58...3.1.59\"\u003ehttps://github.com/gitpython-developers/GitPython/compare/3.1.58...3.1.59\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e3.1.58 - Security and Fixes\u003c/h2\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003etest: allow Python startup before timeout by \u003ca href=\"https://github.com/Byron\"\u003e\u003ccode\u003e@​Byron\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/gitpython-developers/GitPython/pull/2195\"\u003egitpython-developers/GitPython#2195\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/gitpython-developers/GitPython/blob/main/doc/source/changes.rst\"\u003egitpython's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e3.1.62\u003c/h1\u003e\n\u003cp\u003eSecurity fixes for\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gitpython-developers/GitPython/security/advisories/GHSA-59cr-6r3x-644w\"\u003ehttps://github.com/gitpython-developers/GitPython/security/advisories/GHSA-59cr-6r3x-644w\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eIf you can, also try and provide feedback on the upcoming v4 branch\n\u003ca href=\"https://redirect.github.com/gitpython-developers/GitPython/pull/2274\"\u003egitpython-developers/GitPython#2274\u003c/a\u003e - patches welcome.\u003c/p\u003e\n\u003cp\u003eSee the following for all changes.\n\u003ca href=\"https://github.com/gitpython-developers/GitPython/releases/tag/3.1.62\"\u003ehttps://github.com/gitpython-developers/GitPython/releases/tag/3.1.62\u003c/a\u003e\u003c/p\u003e\n\u003ch1\u003e3.1.61\u003c/h1\u003e\n\u003cp\u003eA fixup release to avoid accidental removal of public class regex on Actor.\nIt's now deprecated instead.\u003c/p\u003e\n\u003cp\u003eIf you can, also try and provide feedback on the upcoming v4 branch\n\u003ca href=\"https://redirect.github.com/gitpython-developers/GitPython/pull/2274\"\u003egitpython-developers/GitPython#2274\u003c/a\u003e - patches welcome.\u003c/p\u003e\n\u003cp\u003eSee the following for all changes.\n\u003ca href=\"https://github.com/gitpython-developers/GitPython/releases/tag/3.1.61\"\u003ehttps://github.com/gitpython-developers/GitPython/releases/tag/3.1.61\u003c/a\u003e\u003c/p\u003e\n\u003ch1\u003e3.1.60\u003c/h1\u003e\n\u003cp\u003eSecurity fixes for\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gitpython-developers/GitPython/security/advisories/GHSA-g5vv-9gxw-82hx\"\u003ehttps://github.com/gitpython-developers/GitPython/security/advisories/GHSA-g5vv-9gxw-82hx\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gitpython-developers/GitPython/security/advisories/GHSA-whh4-5q6c-9v3x\"\u003ehttps://github.com/gitpython-developers/GitPython/security/advisories/GHSA-whh4-5q6c-9v3x\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gitpython-developers/GitPython/security/advisories/GHSA-239g-whfq-7xj9\"\u003ehttps://github.com/gitpython-developers/GitPython/security/advisories/GHSA-239g-whfq-7xj9\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eIf you can, also try and provide feedback on the upcoming v4 branch\n\u003ca href=\"https://redirect.github.com/gitpython-developers/GitPython/pull/2274\"\u003egitpython-developers/GitPython#2274\u003c/a\u003e - patches welcome.\u003c/p\u003e\n\u003cp\u003eSee the following for all changes.\n\u003ca href=\"https://github.com/gitpython-developers/GitPython/releases/tag/3.1.60\"\u003ehttps://github.com/gitpython-developers/GitPython/releases/tag/3.1.60\u003c/a\u003e\u003c/p\u003e\n\u003ch1\u003e3.1.59\u003c/h1\u003e\n\u003cp\u003eSecurity fixes for\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gitpython-developers/GitPython/security/advisories/GHSA-5xxx-qhh7-9287\"\u003ehttps://github.com/gitpython-developers/GitPython/security/advisories/GHSA-5xxx-qhh7-9287\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gitpython-developers/GitPython/security/advisories/GHSA-3wxw-xv34-2frg\"\u003ehttps://github.com/gitpython-developers/GitPython/security/advisories/GHSA-3wxw-xv34-2frg\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gitpython-developers/GitPython/security/advisories/GHSA-8mcc-hrx5-hvxc\"\u003ehttps://github.com/gitpython-developers/GitPython/security/advisories/GHSA-8mcc-hrx5-hvxc\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gitpython-developers/GitPython/security/advisories/GHSA-284h-m62q-gf8w\"\u003ehttps://github.com/gitpython-developers/GitPython/security/advisories/GHSA-284h-m62q-gf8w\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gitpython-developers/GitPython/security/advisories/GHSA-7833-fr7j-v32q\"\u003ehttps://github.com/gitpython-developers/GitPython/security/advisories/GHSA-7833-fr7j-v32q\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gitpython-developers/GitPython/commit/1ed0ebc2f2e74d979cdc367a4864a7731fdcc093\"\u003e\u003ccode\u003e1ed0ebc\u003c/code\u003e\u003c/a\u003e Reject submodule checkout paths outside the repository\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gitpython-developers/GitPython/commit/5346d1b587a790bac4dc4f100a28fae9db0fd7c8\"\u003e\u003ccode\u003e5346d1b\u003c/code\u003e\u003c/a\u003e prepare next release\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gitpython-developers/GitPython/commit/c7cf4d13b1ed0a2e70f2a1f3c6b4fc6c2652cf0b\"\u003e\u003ccode\u003ec7cf4d1\u003c/code\u003e\u003c/a\u003e fix: prefer \u003ccode\u003e.git\u003c/code\u003e during repository discovery\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gitpython-developers/GitPython/commit/09f2cf383a992d1af697364569e9f384748c1bd8\"\u003e\u003ccode\u003e09f2cf3\u003c/code\u003e\u003c/a\u003e fix: require opt-in for no-index diffs\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gitpython-developers/GitPython/commit/751473a5f3221d6f989291cbebcc404353fd3ba8\"\u003e\u003ccode\u003e751473a\u003c/code\u003e\u003c/a\u003e fix: parse actor identities without regular expressions\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gitpython-developers/GitPython/commit/66340d77aab9a7468f4aed3681d4ef1e3c0ec931\"\u003e\u003ccode\u003e66340d7\u003c/code\u003e\u003c/a\u003e prepare changelog prior to release\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gitpython-developers/GitPython/commit/ce9d8e8d150e06ae2e2cc2efa229071cd3048a93\"\u003e\u003ccode\u003ece9d8e8\u003c/code\u003e\u003c/a\u003e prepare next release\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gitpython-developers/GitPython/commit/30be45d786e95023e23c616fec5cbabca861b44c\"\u003e\u003ccode\u003e30be45d\u003c/code\u003e\u003c/a\u003e prepare changelog for upcoming release\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/gitpython-developers/GitPython/compare/3.1.57...3.1.62\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `litellm` from 1.93.0 to 1.93.2\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/BerriAI/litellm/releases\"\u003elitellm's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev1.93.2\u003c/h2\u003e\n\u003ch2\u003eVerify Docker Image Signature\u003c/h2\u003e\n\u003cp\u003eAll LiteLLM Docker images are signed with \u003ca href=\"https://docs.sigstore.dev/cosign/overview/\"\u003ecosign\u003c/a\u003e. Every release is signed with the same key introduced in \u003ca href=\"https://github.com/BerriAI/litellm/commit/0112e53046018d726492c814b3644b7d376029d0\"\u003ecommit \u003ccode\u003e0112e53\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eVerify using the pinned commit hash (recommended):\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eA commit hash is cryptographically immutable, so this is the strongest way to ensure you are using the original signing key:\u003c/p\u003e\n\u003cpre lang=\"bash\"\u003e\u003ccode\u003ecosign verify \\\n  --key https://raw.githubusercontent.com/BerriAI/litellm/0112e53046018d726492c814b3644b7d376029d0/cosign.pub \\\n  ghcr.io/berriai/litellm:v1.93.2\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cstrong\u003eVerify using the release tag (convenience):\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eTags are protected in this repository and resolve to the same key. This option is easier to read but relies on tag protection rules:\u003c/p\u003e\n\u003cpre lang=\"bash\"\u003e\u003ccode\u003ecosign verify \\\n  --key https://raw.githubusercontent.com/BerriAI/litellm/v1.93.2/cosign.pub \\\n  ghcr.io/berriai/litellm:v1.93.2\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eExpected output:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eThe following checks were performed on each of these signatures:\n  - The cosign claims were validated\n  - The signatures were verified against the specified public key\n\u003c/code\u003e\u003c/pre\u003e\n\u003chr /\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003echore(release): backport proxy request-handling fixes and refresh runtime deps for 1.93.2 by \u003ca href=\"https://github.com/yuneng-berri\"\u003e\u003ccode\u003e@​yuneng-berri\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/BerriAI/litellm/pull/36318\"\u003eBerriAI/litellm#36318\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/BerriAI/litellm/compare/v1.93.1...v1.93.2\"\u003ehttps://github.com/BerriAI/litellm/compare/v1.93.1...v1.93.2\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003ev1.93.1\u003c/h2\u003e\n\u003ch2\u003eVerify Docker Image Signature\u003c/h2\u003e\n\u003cp\u003eAll LiteLLM Docker images are signed with \u003ca href=\"https://docs.sigstore.dev/cosign/overview/\"\u003ecosign\u003c/a\u003e. Every release is signed with the same key introduced in \u003ca href=\"https://github.com/BerriAI/litellm/commit/0112e53046018d726492c814b3644b7d376029d0\"\u003ecommit \u003ccode\u003e0112e53\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eVerify using the pinned commit hash (recommended):\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eA commit hash is cryptographically immutable, so this is the strongest way to ensure you are using the original signing key:\u003c/p\u003e\n\u003cpre lang=\"bash\"\u003e\u003ccode\u003e\u0026lt;/tr\u0026gt;\u0026lt;/table\u0026gt; \n\u003c/code\u003e\u003c/pre\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/BerriAI/litellm/commit/cd1bd0f4b8af865f8d05fbd938392fdd4703babc\"\u003e\u003ccode\u003ecd1bd0f\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/BerriAI/litellm/issues/36318\"\u003e#36318\u003c/a\u003e from BerriAI/litellm_backport_1_93_x_bp-193x-0808sec2\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/BerriAI/litellm/commit/d7a85d9904f16ce937cb61e600a6544fd7c3256b\"\u003e\u003ccode\u003ed7a85d9\u003c/code\u003e\u003c/a\u003e bump: version 1.93.1 → 1.93.2\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/BerriAI/litellm/commit/c5113d4e5b388d1b696f2397a8ced5a0823c7b31\"\u003e\u003ccode\u003ec5113d4\u003c/code\u003e\u003c/a\u003e chore(deps): bump h2 to 4.4.1\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/BerriAI/litellm/commit/7bd1a3bb08ddfc92053b22219ed01d3ffb32f054\"\u003e\u003ccode\u003e7bd1a3b\u003c/code\u003e\u003c/a\u003e chore(deps): bump gitpython to 3.1.58\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/BerriAI/litellm/commit/8c5d90bb021fa76943a0cc5adc20dba92f3ddaa1\"\u003e\u003ccode\u003e8c5d90b\u003c/code\u003e\u003c/a\u003e chore(deps): upgrade cryptography to 50.0.0 (\u003ca href=\"https://redirect.github.com/BerriAI/litellm/issues/35803\"\u003e#35803\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/BerriAI/litellm/commit/a4fa48f0cf4b483ab49577d5414d3c52d8886abe\"\u003e\u003ccode\u003ea4fa48f\u003c/code\u003e\u003c/a\u003e fix(deps): raise aiohttp floor to 3.14.2 to clear pooled-connection timeouts\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/BerriAI/litellm/commit/1bb9f5d0eea673ca716cc87ae2bdd1670d94b5f2\"\u003e\u003ccode\u003e1bb9f5d\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/BerriAI/litellm/issues/36011\"\u003e#36011\u003c/a\u003e from BerriAI/litellm_maint_batch_2026_07\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/BerriAI/litellm/commit/29be951c770bbcff790aecfb156f03a60dfb08a2\"\u003e\u003ccode\u003e29be951\u003c/code\u003e\u003c/a\u003e chore(proxy): clean up request parameter validation and provider destination ...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/BerriAI/litellm/commit/fc69949d74de4eb364b58ab531ec151a2f266f8f\"\u003e\u003ccode\u003efc69949\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/BerriAI/litellm/issues/34670\"\u003e#34670\u003c/a\u003e from BerriAI/litellm_/stable-backport-1-93-x-d8c02a\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/BerriAI/litellm/commit/e7be74a0b7bbdae20c0c146e2aefdd1973467a71\"\u003e\u003ccode\u003ee7be74a\u003c/code\u003e\u003c/a\u003e chore: refresh uv.lock for 1.93.1\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/BerriAI/litellm/compare/v1.93.0...v1.93.2\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `docling` from 2.115.0 to 2.132.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/docling-project/docling/releases\"\u003edocling's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev2.132.0\u003c/h2\u003e\n\u003ch3\u003eFeature\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003epdf, reading-order:\u003c/strong\u003e Updating the reading-order algoirthm (\u003ca href=\"https://redirect.github.com/docling-project/docling/issues/4276\"\u003e#4276\u003c/a\u003e) (\u003ca href=\"https://github.com/docling-project/docling/commit/42de1e20fe2783c0c30c5b3c0f9c60ab5eef9e16\"\u003e\u003ccode\u003e42de1e2\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eFix\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003ePreserve fidelity when mapping external VLM output (Chandra, dots, MinerU) (\u003ca href=\"https://redirect.github.com/docling-project/docling/issues/4470\"\u003e#4470\u003c/a\u003e) (\u003ca href=\"https://github.com/docling-project/docling/commit/20ba84719e1c9e29f7ddfb731eca7ad00488180d\"\u003e\u003ccode\u003e20ba847\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ecsv:\u003c/strong\u003e Validate first-line dialect before accepting a sniff (\u003ca href=\"https://redirect.github.com/docling-project/docling/issues/4453\"\u003e#4453\u003c/a\u003e) (\u003ca href=\"https://github.com/docling-project/docling/commit/d6f03078ad364108df3e7e82e8f0dcc3fd7f39ea\"\u003e\u003ccode\u003ed6f0307\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003edocx:\u003c/strong\u003e Exclude '\u0026lt;w:bCs\u0026gt;' from bold detection (\u003ca href=\"https://redirect.github.com/docling-project/docling/issues/4366\"\u003e#4366\u003c/a\u003e) (\u003ca href=\"https://github.com/docling-project/docling/commit/bf836f244d92dc001d68230a44a4afa23926df17\"\u003e\u003ccode\u003ebf836f2\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eimage:\u003c/strong\u003e Recognize .gif files as images (\u003ca href=\"https://redirect.github.com/docling-project/docling/issues/4326\"\u003e#4326\u003c/a\u003e) (\u003ca href=\"...\n\n_Description has been truncated_","html_url":"https://github.com/TW199501/langflow/pull/1","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/TW199501%2Flangflow/issues/1","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/1/packages"}},{"old_version":"21.14.3","new_version":"21.14.7","update_type":"patch","path":null,"pr_created_at":"2026-10-16T15:48:47.000Z","version_change":"21.14.3 → 21.14.7","issue":{"uuid":"5887062298","node_id":"PR_kwDOTAduXc8AAAABI4O91Q","number":122,"state":"closed","title":"chore(deps)(deps): bump the minor-and-patch group across 1 directory with 39 updates","user":"dependabot[bot]","labels":[],"assignees":[],"locked":false,"comments_count":3,"pull_request":true,"closed_at":"2026-10-17T11:11:30.000Z","author_association":null,"state_reason":null,"created_at":"2026-10-16T15:48:47.000Z","updated_at":"2026-10-17T11:11:33.000Z","time_to_close":69763,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"chore(deps)(deps): bump","group_name":"minor-and-patch","update_count":39,"packages":[{"name":"fastapi","old_version":"0.138.1","new_version":"0.143.0","repository_url":"https://github.com/fastapi/fastapi"},{"name":"langgraph","old_version":"1.2.6","new_version":"1.2.15","repository_url":"https://github.com/langchain-ai/langgraph"},{"name":"langgraph-checkpoint-sqlite","old_version":"3.1.1","new_version":"3.1.2","repository_url":"https://github.com/langchain-ai/langgraph"},{"name":"pydantic","old_version":"2.13.4","new_version":"2.14.1","repository_url":"https://github.com/pydantic/pydantic"},{"name":"langchain-core","old_version":"1.4.8","new_version":"1.6.10","repository_url":"https://github.com/langchain-ai/langchain"},{"name":"langfuse","old_version":"4.12.0","new_version":"4.17.0","repository_url":"https://github.com/langfuse/langfuse"},{"name":"packaging","old_version":"26.2","new_version":"26.3","repository_url":"https://github.com/pypa/packaging"},{"name":"textual","old_version":"8.2.7","new_version":"8.2.8","repository_url":"https://github.com/Textualize/textual"},{"name":"trafilatura","old_version":"2.1.0","new_version":"2.3.1","repository_url":"https://github.com/adbar/trafilatura"},{"name":"markdown","old_version":"3.10.2","new_version":"3.11","repository_url":"https://github.com/Python-Markdown/markdown"},{"name":"pygments","old_version":"2.20.0","new_version":"2.21.0","repository_url":"https://github.com/pygments/pygments"},{"name":"tzdata","old_version":"2026.2","new_version":"2026.5","repository_url":"https://github.com/python/tzdata"},{"name":"click","old_version":"8.4.2","new_version":"8.5.0","repository_url":"https://github.com/pallets/click"},{"name":"python-dotenv","old_version":"1.2.2","new_version":"1.2.4","repository_url":"https://github.com/theskumar/python-dotenv"},{"name":"python-bidi","old_version":"0.6.10","new_version":"0.6.11","repository_url":"https://github.com/MeirKriheli/python-bidi"},{"name":"reportlab","old_version":"5.0.0","new_version":"5.0.1"},{"name":"pypdf","old_version":"6.19.0","new_version":"6.20.1","repository_url":"https://github.com/py-pdf/pypdf"},{"name":"langgraph-sdk","old_version":"0.4.6","new_version":"0.4.7","repository_url":"https://github.com/langchain-ai/langgraph"},{"name":"pytest-mock","old_version":"3.15.1","new_version":"3.16.0","repository_url":"https://github.com/pytest-dev/pytest-mock"},{"name":"ruff","old_version":"0.15.20","new_version":"0.17.0","repository_url":"https://github.com/astral-sh/ruff"},{"name":"mypy","old_version":"2.1.0","new_version":"2.4.0","repository_url":"https://github.com/python/mypy"},{"name":"locust","old_version":"2.45.0","new_version":"2.46.7","repository_url":"https://github.com/locustio/locust"},{"name":"pre-commit","old_version":"4.6.2","new_version":"4.7.0","repository_url":"https://github.com/pre-commit/pre-commit"},{"name":"virtualenv","old_version":"21.14.3","new_version":"21.14.7","repository_url":"https://github.com/pypa/virtualenv"},{"name":"sqlglot","old_version":"30.21.0","new_version":"30.22.0","repository_url":"https://github.com/tobymao/sqlglot"},{"name":"fakeredis","old_version":"2.36.2","new_version":"2.39.0","repository_url":"https://github.com/cunla/fakeredis-py"},{"name":"pywebpush","old_version":"2.4.0","new_version":"2.5.0","repository_url":"https://github.com/web-push-libs/pywebpush"},{"name":"aiohttp","old_version":"3.14.3","new_version":"3.14.5","repository_url":"https://github.com/aio-libs/aiohttp"},{"name":"transformers","old_version":"5.12.1","new_version":"5.19.0","repository_url":"https://github.com/huggingface/transformers"},{"name":"prometheus-client","old_version":"0.25.0","new_version":"0.26.0","repository_url":"https://github.com/prometheus/client_python"},{"name":"playwright","old_version":"1.61.0","new_version":"1.63.0","repository_url":"https://github.com/microsoft/playwright-python"},{"name":"langgraph-checkpoint-postgres","old_version":"3.1.2","new_version":"3.1.3","repository_url":"https://github.com/langchain-ai/langgraph"},{"name":"onnxruntime","old_version":"1.27.0","new_version":"1.31.0","repository_url":"https://github.com/microsoft/onnxruntime"},{"name":"pypdfium2","old_version":"5.12.1","new_version":"5.14.0","repository_url":"https://github.com/pypdfium2-team/pypdfium2"},{"name":"docling","old_version":"2.123.0","new_version":"2.138.0","repository_url":"https://github.com/docling-project/docling"},{"name":"e2b-code-interpreter","old_version":"2.9.2","new_version":"2.11.0","repository_url":"https://github.com/e2b-dev/e2b"},{"name":"temporalio","old_version":"1.32.0","new_version":"1.34.0","repository_url":"https://github.com/temporalio/sdk-python"},{"name":"pymysql","old_version":"1.2.0","new_version":"1.2.3","repository_url":"https://github.com/PyMySQL/PyMySQL"},{"name":"pymongo","old_version":"4.17.0","new_version":"4.18.3","repository_url":"https://github.com/mongodb/mongo-python-driver"}],"path":null,"ecosystem":"pip"},"body":"Bumps the minor-and-patch group with 39 updates in the / directory:\n\n| Package | From | To |\n| --- | --- | --- |\n| [fastapi](https://github.com/fastapi/fastapi) | `0.138.1` | `0.143.0` |\n| [langgraph](https://github.com/langchain-ai/langgraph) | `1.2.6` | `1.2.15` |\n| [langgraph-checkpoint-sqlite](https://github.com/langchain-ai/langgraph) | `3.1.1` | `3.1.2` |\n| [pydantic](https://github.com/pydantic/pydantic) | `2.13.4` | `2.14.1` |\n| [langchain-core](https://github.com/langchain-ai/langchain) | `1.4.8` | `1.6.10` |\n| [langfuse](https://github.com/langfuse/langfuse) | `4.12.0` | `4.17.0` |\n| [packaging](https://github.com/pypa/packaging) | `26.2` | `26.3` |\n| [textual](https://github.com/Textualize/textual) | `8.2.7` | `8.2.8` |\n| [trafilatura](https://github.com/adbar/trafilatura) | `2.1.0` | `2.3.1` |\n| [markdown](https://github.com/Python-Markdown/markdown) | `3.10.2` | `3.11` |\n| [pygments](https://github.com/pygments/pygments) | `2.20.0` | `2.21.0` |\n| [tzdata](https://github.com/python/tzdata) | `2026.2` | `2026.5` |\n| [click](https://github.com/pallets/click) | `8.4.2` | `8.5.0` |\n| [python-dotenv](https://github.com/theskumar/python-dotenv) | `1.2.2` | `1.2.4` |\n| [python-bidi](https://github.com/MeirKriheli/python-bidi) | `0.6.10` | `0.6.11` |\n| [reportlab](https://www.reportlab.com/) | `5.0.0` | `5.0.1` |\n| [pypdf](https://github.com/py-pdf/pypdf) | `6.19.0` | `6.20.1` |\n| [langgraph-sdk](https://github.com/langchain-ai/langgraph) | `0.4.6` | `0.4.7` |\n| [pytest-mock](https://github.com/pytest-dev/pytest-mock) | `3.15.1` | `3.16.0` |\n| [ruff](https://github.com/astral-sh/ruff) | `0.15.20` | `0.17.0` |\n| [mypy](https://github.com/python/mypy) | `2.1.0` | `2.4.0` |\n| [locust](https://github.com/locustio/locust) | `2.45.0` | `2.46.7` |\n| [pre-commit](https://github.com/pre-commit/pre-commit) | `4.6.2` | `4.7.0` |\n| [virtualenv](https://github.com/pypa/virtualenv) | `21.14.3` | `21.14.7` |\n| [sqlglot](https://github.com/tobymao/sqlglot) | `30.21.0` | `30.22.0` |\n| [fakeredis](https://github.com/cunla/fakeredis-py) | `2.36.2` | `2.39.0` |\n| [pywebpush](https://github.com/web-push-libs/pywebpush) | `2.4.0` | `2.5.0` |\n| [aiohttp](https://github.com/aio-libs/aiohttp) | `3.14.3` | `3.14.5` |\n| [transformers](https://github.com/huggingface/transformers) | `5.12.1` | `5.19.0` |\n| [prometheus-client](https://github.com/prometheus/client_python) | `0.25.0` | `0.26.0` |\n| [playwright](https://github.com/microsoft/playwright-python) | `1.61.0` | `1.63.0` |\n| [langgraph-checkpoint-postgres](https://github.com/langchain-ai/langgraph) | `3.1.2` | `3.1.3` |\n| [onnxruntime](https://github.com/microsoft/onnxruntime) | `1.27.0` | `1.31.0` |\n| [pypdfium2](https://github.com/pypdfium2-team/pypdfium2) | `5.12.1` | `5.14.0` |\n| [docling](https://github.com/docling-project/docling) | `2.123.0` | `2.138.0` |\n| [e2b-code-interpreter](https://github.com/e2b-dev/e2b) | `2.9.2` | `2.11.0` |\n| [temporalio](https://github.com/temporalio/sdk-python) | `1.32.0` | `1.34.0` |\n| [pymysql](https://github.com/PyMySQL/PyMySQL) | `1.2.0` | `1.2.3` |\n| [pymongo](https://github.com/mongodb/mongo-python-driver) | `4.17.0` | `4.18.3` |\n\n\nUpdates `fastapi` from 0.138.1 to 0.143.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/fastapi/fastapi/releases\"\u003efastapi's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e0.143.0\u003c/h2\u003e\n\u003cp\u003eAutomatic OpenTelemetry exporter setup is now opt-in. If you rely on FastAPI to configure exporters from \u003ccode\u003eOTEL_*\u003c/code\u003e environment variables, set \u003ccode\u003eFASTAPI_OTEL_AUTO_CONFIGURE=true\u003c/code\u003e or use \u003ccode\u003eFastAPI(telemetry={\u0026quot;auto_configure\u0026quot;: True})\u003c/code\u003e to retain the previous behavior.\u003c/p\u003e\n\u003cp\u003eApplications that configure their own providers and exporters require no changes. FastAPI Cloud enables automatic setup for you.\u003c/p\u003e\n\u003ch3\u003eBreaking Changes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e💥 Require opt-in for automatic OpenTelemetry exporter setup. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16476\"\u003e#16476\u003c/a\u003e by \u003ca href=\"https://github.com/tiangolo\"\u003e\u003ccode\u003e@​tiangolo\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e0.142.4\u003c/h2\u003e\n\u003ch3\u003eFixes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e🐛 Isolate FastAPI telemetry for excluded requests. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16470\"\u003e#16470\u003c/a\u003e by \u003ca href=\"https://github.com/tiangolo\"\u003e\u003ccode\u003e@​tiangolo\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e0.142.3\u003c/h2\u003e\n\u003ch3\u003eFixes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e🐛 Cache OpenTelemetry tracers to preserve warning deduplication. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16468\"\u003e#16468\u003c/a\u003e by \u003ca href=\"https://github.com/tiangolo\"\u003e\u003ccode\u003e@​tiangolo\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eDocs\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e📝 Remove HTML title from newsletter to avoid the tooltip. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16461\"\u003e#16461\u003c/a\u003e by \u003ca href=\"https://github.com/tiangolo\"\u003e\u003ccode\u003e@​tiangolo\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e📝 Embed the FastAPI and friends newsletter signup form. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16459\"\u003e#16459\u003c/a\u003e by \u003ca href=\"https://github.com/tiangolo\"\u003e\u003ccode\u003e@​tiangolo\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e📝 Update skill, use Asyncer for blocking code in threads. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16420\"\u003e#16420\u003c/a\u003e by \u003ca href=\"https://github.com/tiangolo\"\u003e\u003ccode\u003e@​tiangolo\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eTranslations\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e🌐 Update translations for fr (add-missing). PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16436\"\u003e#16436\u003c/a\u003e by \u003ca href=\"https://github.com/apps/pr-submit\"\u003e\u003ccode\u003e@​pr-submit[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🌐 Update translations for hi (add-missing). PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16435\"\u003e#16435\u003c/a\u003e by \u003ca href=\"https://github.com/apps/pr-submit\"\u003e\u003ccode\u003e@​pr-submit[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🌐 Update translations for tr (add-missing). PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16434\"\u003e#16434\u003c/a\u003e by \u003ca href=\"https://github.com/apps/pr-submit\"\u003e\u003ccode\u003e@​pr-submit[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🌐 Update translations for zh (add-missing). PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16433\"\u003e#16433\u003c/a\u003e by \u003ca href=\"https://github.com/apps/pr-submit\"\u003e\u003ccode\u003e@​pr-submit[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🌐 Update translations for zh-hant (add-missing). PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16432\"\u003e#16432\u003c/a\u003e by \u003ca href=\"https://github.com/apps/pr-submit\"\u003e\u003ccode\u003e@​pr-submit[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🌐 Update translations for pt (add-missing). PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16431\"\u003e#16431\u003c/a\u003e by \u003ca href=\"https://github.com/apps/pr-submit\"\u003e\u003ccode\u003e@​pr-submit[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🌐 Update translations for de (add-missing). PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16430\"\u003e#16430\u003c/a\u003e by \u003ca href=\"https://github.com/apps/pr-submit\"\u003e\u003ccode\u003e@​pr-submit[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🌐 Update translations for uk (add-missing). PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16429\"\u003e#16429\u003c/a\u003e by \u003ca href=\"https://github.com/apps/pr-submit\"\u003e\u003ccode\u003e@​pr-submit[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🌐 Update translations for ja (add-missing). PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16428\"\u003e#16428\u003c/a\u003e by \u003ca href=\"https://github.com/apps/pr-submit\"\u003e\u003ccode\u003e@​pr-submit[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🌐 Update translations for ko (add-missing). PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16425\"\u003e#16425\u003c/a\u003e by \u003ca href=\"https://github.com/apps/pr-submit\"\u003e\u003ccode\u003e@​pr-submit[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🌐 Update translations for es (add-missing). PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16426\"\u003e#16426\u003c/a\u003e by \u003ca href=\"https://github.com/apps/pr-submit\"\u003e\u003ccode\u003e@​pr-submit[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🌐 Update translations for ru (add-missing). PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16427\"\u003e#16427\u003c/a\u003e by \u003ca href=\"https://github.com/apps/pr-submit\"\u003e\u003ccode\u003e@​pr-submit[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🌐 Update Russian LLM-prompt. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16449\"\u003e#16449\u003c/a\u003e by \u003ca href=\"https://github.com/YuriiMotov\"\u003e\u003ccode\u003e@​YuriiMotov\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eInternal\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e👷 Fix deprecated command in \u003ccode\u003ebump-pre-commit-hooks\u003c/code\u003e workflow. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16463\"\u003e#16463\u003c/a\u003e by \u003ca href=\"https://github.com/YuriiMotov\"\u003e\u003ccode\u003e@​YuriiMotov\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🔧 Update sponsors: remove Render. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16457\"\u003e#16457\u003c/a\u003e by \u003ca href=\"https://github.com/tiangolo\"\u003e\u003ccode\u003e@​tiangolo\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🔨 Use \u003ccode\u003egpt-6-astra\u003c/code\u003e model for translations. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16453\"\u003e#16453\u003c/a\u003e by \u003ca href=\"https://github.com/YuriiMotov\"\u003e\u003ccode\u003e@​YuriiMotov\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e⬆ Bump the python-packages group across 1 directory with 14 updates. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16447\"\u003e#16447\u003c/a\u003e by \u003ca href=\"https://github.com/apps/dependabot\"\u003e\u003ccode\u003e@​dependabot[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e⬆ Bump starlette from 1.6.0 to 1.7.0. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16440\"\u003e#16440\u003c/a\u003e by \u003ca href=\"https://github.com/apps/dependabot\"\u003e\u003ccode\u003e@​dependabot[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e⬆ Bump pyjwt from 2.13.0 to 2.15.0. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16423\"\u003e#16423\u003c/a\u003e by \u003ca href=\"https://github.com/apps/dependabot\"\u003e\u003ccode\u003e@​dependabot[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e⬆ Bump gitpython from 3.1.60 to 3.1.62. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16444\"\u003e#16444\u003c/a\u003e by \u003ca href=\"https://github.com/apps/dependabot\"\u003e\u003ccode\u003e@​dependabot[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fastapi/fastapi/commit/f5c6e9b4f9cadc1bf0f9a1fd672e621206b63007\"\u003e\u003ccode\u003ef5c6e9b\u003c/code\u003e\u003c/a\u003e 🔖 Release version 0.143.0 (\u003ca href=\"https://redirect.github.com/fastapi/fastapi/issues/16477\"\u003e#16477\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fastapi/fastapi/commit/182c8b8c83a0c3f19b61e31e092570af7d4e637b\"\u003e\u003ccode\u003e182c8b8\u003c/code\u003e\u003c/a\u003e 📝 Update release notes\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fastapi/fastapi/commit/af889e400baeb33c1594c84618a806c9c6a7f7ff\"\u003e\u003ccode\u003eaf889e4\u003c/code\u003e\u003c/a\u003e 💥 Require opt-in for automatic OpenTelemetry exporter setup (\u003ca href=\"https://redirect.github.com/fastapi/fastapi/issues/16476\"\u003e#16476\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fastapi/fastapi/commit/9269f17524e7990c39a9a1708db532810ceffc06\"\u003e\u003ccode\u003e9269f17\u003c/code\u003e\u003c/a\u003e 🔖 Release version 0.142.4 (\u003ca href=\"https://redirect.github.com/fastapi/fastapi/issues/16471\"\u003e#16471\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fastapi/fastapi/commit/78ede017de7ef596b91be036aa31ba331cf77bb6\"\u003e\u003ccode\u003e78ede01\u003c/code\u003e\u003c/a\u003e 📝 Update release notes\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fastapi/fastapi/commit/4e31a07bafd08f247f39ab1e9144ba2a62395757\"\u003e\u003ccode\u003e4e31a07\u003c/code\u003e\u003c/a\u003e 🐛 Isolate FastAPI telemetry for excluded requests (\u003ca href=\"https://redirect.github.com/fastapi/fastapi/issues/16470\"\u003e#16470\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fastapi/fastapi/commit/cb8dabcd4a7b44e180d7c258377ae4b0abf99bff\"\u003e\u003ccode\u003ecb8dabc\u003c/code\u003e\u003c/a\u003e 🔖 Release version 0.142.3 (\u003ca href=\"https://redirect.github.com/fastapi/fastapi/issues/16469\"\u003e#16469\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fastapi/fastapi/commit/787dc561d524349a6eadca365d4f2844d66b1b9d\"\u003e\u003ccode\u003e787dc56\u003c/code\u003e\u003c/a\u003e 📝 Update release notes\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fastapi/fastapi/commit/6eae2f3456c889ad791de38dd45c14e17de775d3\"\u003e\u003ccode\u003e6eae2f3\u003c/code\u003e\u003c/a\u003e 🐛 Cache OpenTelemetry tracers to preserve warning deduplication (\u003ca href=\"https://redirect.github.com/fastapi/fastapi/issues/16468\"\u003e#16468\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fastapi/fastapi/commit/94918c1d40afb27065c64d523219ed2ad9822f76\"\u003e\u003ccode\u003e94918c1\u003c/code\u003e\u003c/a\u003e 📝 Update release notes\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/fastapi/fastapi/compare/0.138.1...0.143.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `langgraph` from 1.2.6 to 1.2.15\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/langchain-ai/langgraph/releases\"\u003elanggraph's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003elanggraph==1.2.15\u003c/h2\u003e\n\u003cp\u003eChanges since 1.2.14\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003erelease(langgraph): 1.2.15 (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9283\"\u003e#9283\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(langgraph): give every message written to a messages DeltaChannel an id (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9275\"\u003e#9275\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(langgraph): save a cached node's writes like a node that ran (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9259\"\u003e#9259\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(langgraph): stop at an interrupt_before breakpoint when a drain is requested before it (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9281\"\u003e#9281\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(langgraph): keep an exit run from a checkpoint the thread moved past out of its newer branch (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9269\"\u003e#9269\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(langgraph): store an update_state input's writes on the checkpoint it updates (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9258\"\u003e#9258\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(langgraph): read a run's DeltaChannel input back only on its own checkpoints (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9260\"\u003e#9260\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(langgraph): snapshot a DeltaChannel that an update_state Overwrite resets (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9263\"\u003e#9263\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(langgraph): keep a fork's DeltaChannel snapshot from starting nodes that never ran (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9264\"\u003e#9264\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(langgraph): don't save a checkpoint past a failed DeltaChannel write (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9235\"\u003e#9235\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(langgraph,prebuilt): stop ToolNode from swallowing invalid resume values (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9232\"\u003e#9232\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(langgraph): never store exit-mode delta writes under the null task id (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9229\"\u003e#9229\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(langgraph): stop astream_events dropping control/interrupts on v1/v2 (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9219\"\u003e#9219\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003echore(deps): bump notebook from 7.5.7 to 7.6.3 in /libs/langgraph (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9206\"\u003e#9206\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(langgraph): give each bulk_update_state update its own task id (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9128\"\u003e#9128\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(langgraph): replay a resumed exit-mode run's delta writes in live order (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9114\"\u003e#9114\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix: order delta channel replay by task path (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/8544\"\u003e#8544\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003elanggraph==1.2.14\u003c/h2\u003e\n\u003cp\u003eChanges since 1.2.13\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003erelease(langgraph): 1.2.14 (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9215\"\u003e#9215\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003elanggraph==1.2.13\u003c/h2\u003e\n\u003cp\u003eChanges since 1.2.12\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003efix(langgraph): fork before replaying an update checkpoint the thread moved past (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9170\"\u003e#9170\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(langgraph): keep an update_state on an older checkpoint out of its other branches (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9165\"\u003e#9165\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(langgraph): keep DeltaChannel counters on every update_state path (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9142\"\u003e#9142\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003erelease(langgraph): 1.2.13 (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9205\"\u003e#9205\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(langgraph): don't walk history for a DeltaChannel that was never written (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9141\"\u003e#9141\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(langgraph): don't replay an abandoned branch into a DeltaChannel fork (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/8548\"\u003e#8548\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003echore(deps): bump notebook from 7.5.6 to 7.5.7 in /libs/langgraph (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9168\"\u003e#9168\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(langgraph): hydrate subgraph delta channels with the caller-resolved saver (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/8538\"\u003e#8538\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(langgraph): stop reporting answered interrupts in get_state (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9103\"\u003e#9103\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003echore(deps-dev): bump the minor-and-patch group across 1 directory with 5 updates (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9155\"\u003e#9155\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003echore(deps-dev): bump the minor-and-patch group in /libs/checkpoint-conformance with 2 updates (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9145\"\u003e#9145\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003echore(deps): bump the minor-and-patch group in /libs/sdk-py with 5 updates (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9149\"\u003e#9149\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003echore(deps): bump tornado from 6.5.8 to 6.5.9 in /libs/langgraph (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9160\"\u003e#9160\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003echore(deps-dev): bump types-requests from 2.33.0.20260712 to 2.33.0.20260906 in /libs/langgraph (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9156\"\u003e#9156\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003echore(deps): bump pyjwt from 2.15.0 to 2.15.1 in /libs/langgraph (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9140\"\u003e#9140\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003echore(deps): bump urllib3 from 2.7.0 to 2.8.0 in /libs/langgraph (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9138\"\u003e#9138\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003echore(deps): bump pyjwt from 2.14.0 to 2.15.0 in /libs/langgraph (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9139\"\u003e#9139\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003echore(deps): bump pyjwt from 2.13.0 to 2.14.0 in /libs/langgraph (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9126\"\u003e#9126\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003elanggraph==1.2.12\u003c/h2\u003e\n\u003cp\u003eChanges since 1.2.11\u003c/p\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langgraph/commit/08a345637fb2bd499f69c90056a22c478a468817\"\u003e\u003ccode\u003e08a3456\u003c/code\u003e\u003c/a\u003e release(langgraph): 1.2.15 (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9283\"\u003e#9283\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langgraph/commit/b7d053b256157ac6b8e8ff5a0783f8a446a9c89e\"\u003e\u003ccode\u003eb7d053b\u003c/code\u003e\u003c/a\u003e fix(langgraph): give every message written to a messages DeltaChannel an id (...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langgraph/commit/395c145c047aaf962a4f599582bbc8d717bd9fa1\"\u003e\u003ccode\u003e395c145\u003c/code\u003e\u003c/a\u003e fix(langgraph): save a cached node's writes like a node that ran (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9259\"\u003e#9259\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langgraph/commit/10f1fabb3b2f2d550b8133fba1217391c27694c4\"\u003e\u003ccode\u003e10f1fab\u003c/code\u003e\u003c/a\u003e fix(langgraph): stop at an interrupt_before breakpoint when a drain is reques...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langgraph/commit/799c2f04fd3a56186e24e9fb8bbf3568e543cfbe\"\u003e\u003ccode\u003e799c2f0\u003c/code\u003e\u003c/a\u003e fix(langgraph): keep an exit run from a checkpoint the thread moved past out ...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langgraph/commit/b4991f1ba36a2449ab59c38ab71828ee865bff84\"\u003e\u003ccode\u003eb4991f1\u003c/code\u003e\u003c/a\u003e fix(langgraph): store an update_state input's writes on the checkpoint it upd...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langgraph/commit/6aa0afba682b0308fbcace31f66fb532978d4dca\"\u003e\u003ccode\u003e6aa0afb\u003c/code\u003e\u003c/a\u003e fix(checkpoint): default InMemorySaver delta history to the latest checkpoint...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langgraph/commit/12aeb0fddb5e835a5745a10a72358c2de37a66a6\"\u003e\u003ccode\u003e12aeb0f\u003c/code\u003e\u003c/a\u003e fix(langgraph): read a run's DeltaChannel input back only on its own checkpoi...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langgraph/commit/d05236f8050c28d38449f81e25382d5991a29223\"\u003e\u003ccode\u003ed05236f\u003c/code\u003e\u003c/a\u003e fix(langgraph): snapshot a DeltaChannel that an update_state Overwrite resets...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langgraph/commit/9d92f33cca143926c563deb87ce377397883cd92\"\u003e\u003ccode\u003e9d92f33\u003c/code\u003e\u003c/a\u003e fix(langgraph): keep a fork's DeltaChannel snapshot from starting nodes that ...\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/langchain-ai/langgraph/compare/1.2.6...1.2.15\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `langgraph-checkpoint-sqlite` from 3.1.1 to 3.1.2\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/langchain-ai/langgraph/releases\"\u003elanggraph-checkpoint-sqlite's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003elanggraph-checkpoint-postgres==3.1.2\u003c/h2\u003e\n\u003cp\u003eChanges since checkpointpostgres==3.1.1\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003erelease(checkpoint-postgres): 3.1.2 (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/8565\"\u003e#8565\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003erelease(checkpoint): 4.2.0 (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/8563\"\u003e#8563\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003etest(checkpoint-postgres,checkpoint-sqlite): run the conformance suite (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/8537\"\u003e#8537\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(checkpoint-postgres): find plain-value seeds when walking delta history (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/8535\"\u003e#8535\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003echore: enable RUF100 and clear unused noqa directives (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/8546\"\u003e#8546\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003echore(checkpoint-postgres,checkpoint-sqlite): enable PLC0415 lint rule (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/8540\"\u003e#8540\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003echore(deps): bump the minor-and-patch group in /libs/checkpoint-postgres with 5 updates (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/8497\"\u003e#8497\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003elanggraph-checkpoint-sqlite==3.1.2\u003c/h2\u003e\n\u003cp\u003eChanges since checkpointsqlite==3.1.1\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003erelease(checkpoint-sqlite): 3.1.2 (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9288\"\u003e#9288\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(checkpoint-postgres,checkpoint-sqlite): treat an empty checkpoint_id as the latest in delta history (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9262\"\u003e#9262\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(checkpoint,checkpoint-postgres,checkpoint-sqlite): validate namespace labels before store dispatch (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9217\"\u003e#9217\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix: order delta channel replay by task path (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/8544\"\u003e#8544\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003echore(deps-dev): bump the minor-and-patch group in /libs/checkpoint-sqlite with 3 updates (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9146\"\u003e#9146\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003echore(deps): bump urllib3 from 2.7.0 to 2.8.0 in /libs/checkpoint-sqlite (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9135\"\u003e#9135\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(checkpoint-sqlite): walk delta ancestors by parent pointer (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/8557\"\u003e#8557\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003echore(deps): bump anyio from 4.12.1 to 4.14.2 in /libs/checkpoint-sqlite (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/8993\"\u003e#8993\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003echore(deps-dev): bump the minor-and-patch group in /libs/checkpoint-sqlite with 2 updates (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/8772\"\u003e#8772\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(checkpoint): widen \u003ccode\u003eStore\u003c/code\u003e \u003ccode\u003eput\u003c/code\u003e value type to \u003ccode\u003eMapping[str, Any]\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/8617\"\u003e#8617\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003erelease(checkpoint): 4.2.0 (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/8563\"\u003e#8563\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003etest(checkpoint-postgres,checkpoint-sqlite): run the conformance suite (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/8537\"\u003e#8537\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003echore: enable RUF100 and clear unused noqa directives (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/8546\"\u003e#8546\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003echore(checkpoint-postgres,checkpoint-sqlite): enable PLC0415 lint rule (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/8540\"\u003e#8540\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003echore(deps): bump the minor-and-patch group in /libs/checkpoint-sqlite with 4 updates (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/8494\"\u003e#8494\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langgraph/commit/1074714c260486900d9bec9b5dd48e13883dd5df\"\u003e\u003ccode\u003e1074714\u003c/code\u003e\u003c/a\u003e release(checkpoint-sqlite): 3.1.2 (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9288\"\u003e#9288\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langgraph/commit/740461ed50f89f867b0c3a1e46fa6d2a4e339cf4\"\u003e\u003ccode\u003e740461e\u003c/code\u003e\u003c/a\u003e release(sdk-py): 0.4.7 (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9289\"\u003e#9289\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langgraph/commit/08a345637fb2bd499f69c90056a22c478a468817\"\u003e\u003ccode\u003e08a3456\u003c/code\u003e\u003c/a\u003e release(langgraph): 1.2.15 (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9283\"\u003e#9283\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langgraph/commit/b7d053b256157ac6b8e8ff5a0783f8a446a9c89e\"\u003e\u003ccode\u003eb7d053b\u003c/code\u003e\u003c/a\u003e fix(langgraph): give every message written to a messages DeltaChannel an id (...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langgraph/commit/395c145c047aaf962a4f599582bbc8d717bd9fa1\"\u003e\u003ccode\u003e395c145\u003c/code\u003e\u003c/a\u003e fix(langgraph): save a cached node's writes like a node that ran (\u003ca href=\"https://redirect.github.com/langchain-ai/langgraph/issues/9259\"\u003e#9259\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langgraph/commit/10f1fabb3b2f2d550b8133fba1217391c27694c4\"\u003e\u003ccode\u003e10f1fab\u003c/code\u003e\u003c/a\u003e fix(langgraph): stop at an interrupt_before breakpoint when a drain is reques...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langgraph/commit/799c2f04fd3a56186e24e9fb8bbf3568e543cfbe\"\u003e\u003ccode\u003e799c2f0\u003c/code\u003e\u003c/a\u003e fix(langgraph): keep an exit run from a checkpoint the thread moved past out ...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langgraph/commit/b4991f1ba36a2449ab59c38ab71828ee865bff84\"\u003e\u003ccode\u003eb4991f1\u003c/code\u003e\u003c/a\u003e fix(langgraph): store an update_state input's writes on the checkpoint it upd...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langgraph/commit/6aa0afba682b0308fbcace31f66fb532978d4dca\"\u003e\u003ccode\u003e6aa0afb\u003c/code\u003e\u003c/a\u003e fix(checkpoint): default InMemorySaver delta history to the latest checkpoint...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langgraph/commit/12aeb0fddb5e835a5745a10a72358c2de37a66a6\"\u003e\u003ccode\u003e12aeb0f\u003c/code\u003e\u003c/a\u003e fix(langgraph): read a run's DeltaChannel input back only on its own checkpoi...\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/langchain-ai/langgraph/compare/checkpointsqlite==3.1.1...checkpointsqlite==3.1.2\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `pydantic` from 2.13.4 to 2.14.1\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pydantic/pydantic/releases\"\u003epydantic's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev2.14.1 2026-10-11\u003c/h2\u003e\n\u003ch3\u003eWhat's Changed\u003c/h3\u003e\n\u003ch4\u003ePerformance\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eAvoid Python tuple allocation during model fields validation by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13955\"\u003e#13955\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAvoid unnecessary extra dict allocation in model validation by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13956\"\u003e#13956\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4\u003eFixes\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eFix \u003ccode\u003earguments-v3\u003c/code\u003e schema with variadic keywords by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13954\"\u003e#13954\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix \u003ccode\u003eTypeError\u003c/code\u003e on \u003ccode\u003eForwardRef\u003c/code\u003e on Python 3.10.0 by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13964\"\u003e#13964\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eclosed\u003c/code\u003e and \u003ccode\u003eextra_items\u003c/code\u003e via inheritance in \u003ccode\u003eTypedDict\u003c/code\u003e by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13967\"\u003e#13967\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eEnforce the \u003ccode\u003emax_digits\u003c/code\u003e whole-digits limit in the Python \u003ccode\u003eDecimal\u003c/code\u003e validator by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13972\"\u003e#13972\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eReject out-of-range int inputs for \u003ccode\u003etimedelta\u003c/code\u003e by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13973\"\u003e#13973\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eSupport named tuples in \u003ccode\u003eSequence\u003c/code\u003e validation by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13978\"\u003e#13978\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pydantic/pydantic/compare/v2.14.0...v2.14.1\"\u003ehttps://github.com/pydantic/pydantic/compare/v2.14.0...v2.14.1\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003ev2.14.0 2026-10-08\u003c/h2\u003e\n\u003ch3\u003eWhat's Changed\u003c/h3\u003e\n\u003cp\u003eThe highlights of the v2.14 release are available in the \u003ca href=\"https://pydantic.dev/articles/pydantic-v2-14-release\"\u003eblog post\u003c/a\u003e.\nSeveral minor changes (considered non-breaking changes according to our \u003ca href=\"https://pydantic.dev/docs/validation/2.14/get-started/version-policy/#pydantic-v2\"\u003eversioning policy\u003c/a\u003e) are also included in this release. Make sure to look into them before upgrading.\u003c/p\u003e\n\u003cp\u003eThis release drops support for Python 3.9 and adds support for Python 3.15.\u003c/p\u003e\n\u003ch4\u003eNew Features\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eAdd support for \u003ccode\u003emultiple_of\u003c/code\u003e constraint in \u003ccode\u003efraction\u003c/code\u003e and \u003ccode\u003etimedelta\u003c/code\u003e core schemas by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13873\"\u003e#13873\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003e__namespace__\u003c/code\u003e parameter to \u003ccode\u003ecreate_model()\u003c/code\u003e by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13895\"\u003e#13895\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4\u003eChanges\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eAdd an \u003ccode\u003eordered-dict\u003c/code\u003e core schema by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13796\"\u003e#13796\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdd a \u003ccode\u003ecounter\u003c/code\u003e core schema by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13824\"\u003e#13824\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eDo not mutate \u003ccode\u003emodel_config\u003c/code\u003e attribute by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13825\"\u003e#13825\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eReject newlines in \u003ccode\u003eNameEmail\u003c/code\u003e validation by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13897\"\u003e#13897\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4\u003eFixes\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eCall enum constructors in both validation modes by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13792\"\u003e#13792\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix documentation examples not raising and remove unused \u003ccode\u003estring_sub_type\u003c/code\u003e unused error code by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13821\"\u003e#13821\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eCatch \u003ccode\u003eOverflowError\u003c/code\u003e during \u003ccode\u003eByteSize\u003c/code\u003e validation by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13850\"\u003e#13850\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRequire \u003ccode\u003emultiple_of\u003c/code\u003e constraints to be positive by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13862\"\u003e#13862\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAlways pop field name and model type stacks during schema generation by \u003ca href=\"https://github.com/saquibjawedbit\"\u003e\u003ccode\u003e@​saquibjawedbit\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13859\"\u003e#13859\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eHandle \u003ccode\u003eTypeError\u003c/code\u003e gracefully during docstring extraction by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13874\"\u003e#13874\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix config propagation of stdlib dataclasses and \u003ccode\u003eTypedDict\u003c/code\u003es in JSON Schema by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13891\"\u003e#13891\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eDon't apply \u003ccode\u003eser_json_timedelta\u003c/code\u003e to all datetime types in serialization inference by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13892\"\u003e#13892\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eEncode JSON Schema defaults with a consistent configuration by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13893\"\u003e#13893\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pydantic/pydantic/blob/main/HISTORY.md\"\u003epydantic's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003ev2.14.0 (2026-10-08)\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/pydantic/pydantic/releases/tag/v2.14.0\"\u003eGitHub release\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eWhat's Changed\u003c/h3\u003e\n\u003cp\u003eThe highlights of the v2.14 release are available in the \u003ca href=\"https://pydantic.dev/articles/pydantic-v2-14-release\"\u003eblog post\u003c/a\u003e.\nSeveral minor changes (considered non-breaking changes according to our \u003ca href=\"https://pydantic.dev/docs/validation/2.14/get-started/version-policy/#pydantic-v2\"\u003eversioning policy\u003c/a\u003e)\nare also included in this release. Make sure to look into them before upgrading.\u003c/p\u003e\n\u003cp\u003eThis release drops support for Python 3.9 and adds support for Python 3.15.\u003c/p\u003e\n\u003ch4\u003eNew Features\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eAdd support for \u003ccode\u003emultiple_of\u003c/code\u003e constraint in \u003ccode\u003efraction\u003c/code\u003e and \u003ccode\u003etimedelta\u003c/code\u003e core schemas by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13873\"\u003e#13873\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003e__namespace__\u003c/code\u003e parameter to \u003ccode\u003ecreate_model()\u003c/code\u003e by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13895\"\u003e#13895\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4\u003eChanges\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eAdd an \u003ccode\u003eordered-dict\u003c/code\u003e core schema by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13796\"\u003e#13796\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdd a \u003ccode\u003ecounter\u003c/code\u003e core schema by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13824\"\u003e#13824\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eDo not mutate \u003ccode\u003emodel_config\u003c/code\u003e attribute by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13825\"\u003e#13825\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eReject newlines in \u003ccode\u003eNameEmail\u003c/code\u003e validation by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13897\"\u003e#13897\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4\u003eFixes\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eCall enum constructors in both validation modes by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13792\"\u003e#13792\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix documentation examples not raising and remove unused \u003ccode\u003estring_sub_type\u003c/code\u003e unused error code by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13821\"\u003e#13821\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eCatch \u003ccode\u003eOverflowError\u003c/code\u003e during \u003ccode\u003eByteSize\u003c/code\u003e validation by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13850\"\u003e#13850\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRequire \u003ccode\u003emultiple_of\u003c/code\u003e constraints to be positive by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13862\"\u003e#13862\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAlways pop field name and model type stacks during schema generation by \u003ca href=\"https://github.com/saquibjawedbit\"\u003e\u003ccode\u003e@​saquibjawedbit\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13859\"\u003e#13859\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eHandle \u003ccode\u003eTypeError\u003c/code\u003e gracefully during docstring extraction by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13874\"\u003e#13874\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix config propagation of stdlib dataclasses and \u003ccode\u003eTypedDict\u003c/code\u003es in JSON Schema by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13891\"\u003e#13891\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eDon't apply \u003ccode\u003eser_json_timedelta\u003c/code\u003e to all datetime types in serialization inference by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13892\"\u003e#13892\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eEncode JSON Schema defaults with a consistent configuration by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13893\"\u003e#13893\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ePropagate \u003ccode\u003einit\u003c/code\u003e and \u003ccode\u003ekw_only=False\u003c/code\u003e from \u003ccode\u003eField()\u003c/code\u003e to stdlib dataclass fields by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13898\"\u003e#13898\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRespect propagated extra config in the JSON Schema of stdlib dataclasses by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13899\"\u003e#13899\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eHandle OS errors during \u003ccode\u003eZoneInfo\u003c/code\u003e validation by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13912\"\u003e#13912\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eHandle exceptions during \u003ccode\u003eDecimal\u003c/code\u003e validation by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13940\"\u003e#13940\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRebuild incomplete types during serialization inference by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13922\"\u003e#13922\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eReject large exponents in \u003ccode\u003eFraction\u003c/code\u003e validation by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13944\"\u003e#13944\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAvoid validating URL prefix multiple times in multi host URLs by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13945\"\u003e#13945\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eNew Contributors\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/saquibjawedbit\"\u003e\u003ccode\u003e@​saquibjawedbit\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13859\"\u003e#13859\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pydantic/pydantic/commit/b2212c787fb5c73386dc770681ec49cd09da8e73\"\u003e\u003ccode\u003eb2212c7\u003c/code\u003e\u003c/a\u003e Prepare release v2.14.1\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pydantic/pydantic/commit/968fb2b6eed196a3f17ca9a3aa4697b518614531\"\u003e\u003ccode\u003e968fb2b\u003c/code\u003e\u003c/a\u003e Fix docs conversion table\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pydantic/pydantic/commit/6adc8b3f6146cabf290bdefd51c87486dd659091\"\u003e\u003ccode\u003e6adc8b3\u003c/code\u003e\u003c/a\u003e Support named tuples in \u003ccode\u003eSequence\u003c/code\u003e validation\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pydantic/pydantic/commit/7637fbc31c91f86870c3b34d220d5b7fd62c54db\"\u003e\u003ccode\u003e7637fbc\u003c/code\u003e\u003c/a\u003e Reject out-of-range int inputs for \u003ccode\u003etimedelta\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pydantic/pydantic/commit/dfdbfcb5fa6cf0ae291cb8aebc5bf2153670fe9c\"\u003e\u003ccode\u003edfdbfcb\u003c/code\u003e\u003c/a\u003e Enforce the \u003ccode\u003emax_digits\u003c/code\u003e whole-digits limit in the Python \u003ccode\u003eDecimal\u003c/code\u003e validator\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pydantic/pydantic/commit/e2456d3161d0969b917fc769b2e06b7e076cb886\"\u003e\u003ccode\u003ee2456d3\u003c/code\u003e\u003c/a\u003e Support \u003ccode\u003eclosed\u003c/code\u003e and \u003ccode\u003eextra_items\u003c/code\u003e via inheritance in \u003ccode\u003eTypedDict\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pydantic/pydantic/commit/317655dfe022ebfc818c8e8e744b671fe53d8c3f\"\u003e\u003ccode\u003e317655d\u003c/code\u003e\u003c/a\u003e Harden CI security\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pydantic/pydantic/commit/3ba1dd48939542a04748a9bcfd3248496fa0bcc5\"\u003e\u003ccode\u003e3ba1dd4\u003c/code\u003e\u003c/a\u003e Fix \u003ccode\u003eTypeError\u003c/code\u003e on \u003ccode\u003eForwardRef\u003c/code\u003e on Python 3.10.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pydantic/pydantic/commit/43681abc488119808fcdae2f60cadd5520ceed26\"\u003e\u003ccode\u003e43681ab\u003c/code\u003e\u003c/a\u003e Bump \u003ccode\u003esamuelcolvin/check-python-version\u003c/code\u003e action to v5.1\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pydantic/pydantic/commit/d6bc53a8559d93814009eb2043db133a90f7f921\"\u003e\u003ccode\u003ed6bc53a\u003c/code\u003e\u003c/a\u003e Avoid unnecessary extra dict allocation in model validation\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/pydantic/pydantic/compare/v2.13.4...v2.14.1\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `langchain-core` from 1.4.8 to 1.6.10\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/langchain-ai/langchain/releases\"\u003elangchain-core's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003elangchain-core==1.6.10\u003c/h2\u003e\n\u003cp\u003eChanges since langchain-core==1.6.9\u003c/p\u003e\n\u003cp\u003erelease(core): 1.6.10 (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/41220\"\u003e#41220\u003c/a\u003e)\nfeat(core,anthropic,openai): declare mid-conversation support in model profiles (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/41180\"\u003e#41180\u003c/a\u003e)\u003c/p\u003e\n\u003ch2\u003elangchain-core==1.6.9\u003c/h2\u003e\n\u003cp\u003eChanges since langchain-core==1.6.8\u003c/p\u003e\n\u003cp\u003erelease(core): 1.6.9 (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/41160\"\u003e#41160\u003c/a\u003e)\nfeat(core): accept a callable in with_retry (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/41158\"\u003e#41158\u003c/a\u003e)\u003c/p\u003e\n\u003ch2\u003elangchain-core==1.6.8\u003c/h2\u003e\n\u003cp\u003eChanges since langchain-core==1.6.7\u003c/p\u003e\n\u003cp\u003erelease(core): 1.6.8 (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/41153\"\u003e#41153\u003c/a\u003e)\nfix(core): harden scoped and compatible IPv6 SSRF checks (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/41151\"\u003e#41151\u003c/a\u003e)\u003c/p\u003e\n\u003ch2\u003elangchain-core==1.6.7\u003c/h2\u003e\n\u003cp\u003eChanges since langchain-core==1.6.6\u003c/p\u003e\n\u003cp\u003erelease(core): 1.6.7 (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/41087\"\u003e#41087\u003c/a\u003e)\nfix(core): include openai redacted_content in v1 output for bedrock converse (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/41086\"\u003e#41086\u003c/a\u003e)\nfix(core): python 3.14 hardening around \u003ccode\u003einspect.signature\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/41059\"\u003e#41059\u003c/a\u003e)\nchore(deps): bump notebook from 7.5.7 to 7.6.3 in /libs/core (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/41057\"\u003e#41057\u003c/a\u003e)\nchore(deps): bump notebook from 7.5.6 to 7.5.7 in /libs/core (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/40992\"\u003e#40992\u003c/a\u003e)\nchore(deps): bump urllib3 from 2.7.0 to 2.8.0 in /libs/core (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/40972\"\u003e#40972\u003c/a\u003e)\nchore(deps): bump tornado from 6.5.8 to 6.5.9 in /libs/core (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/40970\"\u003e#40970\u003c/a\u003e)\u003c/p\u003e\n\u003ch2\u003elangchain-core==1.6.6\u003c/h2\u003e\n\u003cp\u003eChanges since langchain-core==1.6.5\u003c/p\u003e\n\u003cp\u003erelease(core): 1.6.6 (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/40906\"\u003e#40906\u003c/a\u003e)\nfix(anthropic): support Claude Sonnet 5.5 compatibility (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/40882\"\u003e#40882\u003c/a\u003e)\ndocs(core): fix docstring examples that don't run as copied (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/40815\"\u003e#40815\u003c/a\u003e)\u003c/p\u003e\n\u003ch2\u003elangchain-core==1.6.5\u003c/h2\u003e\n\u003cp\u003eChanges since langchain-core==1.6.4\u003c/p\u003e\n\u003cp\u003erelease(core): 1.6.5 (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/40816\"\u003e#40816\u003c/a\u003e)\nfix(core): abbreviate long tool IDs in XML buffer strings (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/40792\"\u003e#40792\u003c/a\u003e)\u003c/p\u003e\n\u003ch2\u003elangchain-core==1.6.4\u003c/h2\u003e\n\u003cp\u003eChanges since langchain-core==1.6.3\u003c/p\u003e\n\u003cp\u003erelease(core): 1.6.4 (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/40718\"\u003e#40718\u003c/a\u003e)\nchore(core): deprecate chat message history (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/40711\"\u003e#40711\u003c/a\u003e)\nchore(deps): bump anyio from 4.12.0 to 4.14.2 in /libs/core (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/40634\"\u003e#40634\u003c/a\u003e)\nchore(deps): bump soupsieve from 2.8.4 to 2.9 in /libs/core (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/40574\"\u003e#40574\u003c/a\u003e)\u003c/p\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langchain/commit/fddca066031a2122b3562485bd9c961a46978a1e\"\u003e\u003ccode\u003efddca06\u003c/code\u003e\u003c/a\u003e release(core): 1.6.10 (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/41220\"\u003e#41220\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langchain/commit/e4b143729ffb3c6307376909d3aa9921b360c1f5\"\u003e\u003ccode\u003ee4b1437\u003c/code\u003e\u003c/a\u003e chore(model-profiles): refresh model profile data (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/41145\"\u003e#41145\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langchain/commit/b060a7466482ed5dac5fa1ef12e3ad21cccce385\"\u003e\u003ccode\u003eb060a74\u003c/code\u003e\u003c/a\u003e feat(core,anthropic,openai): declare mid-conversation support in model profil...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langchain/commit/34489d61433cbf5044a630de2e7797e361672900\"\u003e\u003ccode\u003e34489d6\u003c/code\u003e\u003c/a\u003e release(langchain): 1.4.4 (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/41163\"\u003e#41163\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langchain/commit/e7ca68b92062312221d7768a9d731a2d4942416b\"\u003e\u003ccode\u003ee7ca68b\u003c/code\u003e\u003c/a\u003e fix(langchain): (SummarizationMiddleware) retry summary step on context overf...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langchain/commit/fc7dc7757a46ebb444be1ead0efdeab5ca7ad8ce\"\u003e\u003ccode\u003efc7dc77\u003c/code\u003e\u003c/a\u003e release(core): 1.6.9 (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/41160\"\u003e#41160\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langchain/commit/a055e836fd4ff75bfc2fe4adda33d06f0d625a63\"\u003e\u003ccode\u003ea055e83\u003c/code\u003e\u003c/a\u003e feat(core): accept a callable in with_retry (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/41158\"\u003e#41158\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langchain/commit/2baf2f33c72cf027383a0b123e9be5077eb483d5\"\u003e\u003ccode\u003e2baf2f3\u003c/code\u003e\u003c/a\u003e release(openai): 1.7.0 (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/41154\"\u003e#41154\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langchain/commit/4acca6482ca3fefca9cfa2f961bbd8819eaa23ae\"\u003e\u003ccode\u003e4acca64\u003c/code\u003e\u003c/a\u003e release(core): 1.6.8 (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/41153\"\u003e#41153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langchain-ai/langchain/commit/b53209be4c01f17217ac0a00ef679f493dde23b3\"\u003e\u003ccode\u003eb53209b\u003c/code\u003e\u003c/a\u003e feat(openai): support decisions api (\u003ca href=\"https://redirect.github.com/langchain-ai/langchain/issues/41125\"\u003e#41125\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/langchain-ai/langchain/compare/langchain-core==1.4.8...langchain-core==1.6.10\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `langfuse` from 4.12.0 to 4.17.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/langfuse/langfuse/releases\"\u003elangfuse's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev4.17.0\u003c/h2\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003ch3\u003eFeatures\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003efeat(evals): new evaluation UX by \u003ca href=\"https://github.com/wochinge\"\u003e\u003ccode\u003e@​wochinge\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/15906\"\u003elangfuse/langfuse#15906\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat(annotation-queues): create queues from trace table by \u003ca href=\"https://github.com/bezbac\"\u003e\u003ccode\u003e@​bezbac\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16355\"\u003elangfuse/langfuse#16355\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat(modern-session): display arbitrary metadata by \u003ca href=\"https://github.com/nimarb\"\u003e\u003ccode\u003e@​nimarb\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16063\"\u003elangfuse/langfuse#16063\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat(billing): CHB project events to event bus by \u003ca href=\"https://github.com/Steffen911\"\u003e\u003ccode\u003e@​Steffen911\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/15461\"\u003elangfuse/langfuse#15461\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat(v4-migration): show the migration UI by default on dual write mode by \u003ca href=\"https://github.com/Steffen911\"\u003e\u003ccode\u003e@​Steffen911\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16316\"\u003elangfuse/langfuse#16316\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat(web): make markdown render character limit configurable at container runtime by \u003ca href=\"https://github.com/DavidTraina\"\u003e\u003ccode\u003e@​DavidTraina\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16166\"\u003elangfuse/langfuse#16166\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat(in-app-agent): emit sandbox lifecycle metrics for MicroVMs by \u003ca href=\"https://github.com/LysanderKie\"\u003e\u003ccode\u003e@​LysanderKie\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16394\"\u003elangfuse/langfuse#16394\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat(annotation-queues): create queues from events table by \u003ca href=\"https://github.com/bezbac\"\u003e\u003ccode\u003e@​bezbac\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16427\"\u003elangfuse/langfuse#16427\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat(in-app-agent): cache stable Bedrock prefixes across turns by \u003ca href=\"https://github.com/LysanderKie\"\u003e\u003ccode\u003e@​LysanderKie\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16459\"\u003elangfuse/langfuse#16459\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat(evals): show and filter evaluator models by \u003ca href=\"https://github.com/wochinge\"\u003e\u003ccode\u003e@​wochinge\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16466\"\u003elangfuse/langfuse#16466\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat(in-app-agent): Add Anthropic Messages as a supported model provider for Langfuse Assistant (OSS) by \u003ca href=\"https://github.com/LysanderKie\"\u003e\u003ccode\u003e@​LysanderKie\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16385\"\u003elangfuse/langfuse#16385\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat(onboarding): Ask to enable AI features during onboarding by \u003ca href=\"https://github.com/bezbac\"\u003e\u003ccode\u003e@​bezbac\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16389\"\u003elangfuse/langfuse#16389\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eFixes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003efix(in-app-agent): explain failed background runs without leaking internals by \u003ca href=\"https://github.com/LysanderKie\"\u003e\u003ccode\u003e@​LysanderKie\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16387\"\u003elangfuse/langfuse#16387\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(in-app-agent): refuse to delete user project keys during MCP cleanup by \u003ca href=\"https://github.com/LysanderKie\"\u003e\u003ccode\u003e@​LysanderKie\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16393\"\u003elangfuse/langfuse#16393\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(structure): restore the sensor's import graph and re-snapshot the baseline by \u003ca href=\"https://github.com/nkabardin\"\u003e\u003ccode\u003e@​nkabardin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16390\"\u003elangfuse/langfuse#16390\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(in-app-agent): mark loop errors on the APM span after ACK by \u003ca href=\"https://github.com/LysanderKie\"\u003e\u003ccode\u003e@​LysanderKie\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16404\"\u003elangfuse/langfuse#16404\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(assistant): preserve model prompts in traces by \u003ca href=\"https://github.com/bezbac\"\u003e\u003ccode\u003e@​bezbac\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16407\"\u003elangfuse/langfuse#16407\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix: remove score chart style prop overrides by \u003ca href=\"https://github.com/wochinge\"\u003e\u003ccode\u003e@​wochinge\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16403\"\u003elangfuse/langfuse#16403\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(modern-session): format tokens with thousands by \u003ca href=\"https://github.com/nimarb\"\u003e\u003ccode\u003e@​nimarb\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16423\"\u003elangfuse/langfuse#16423\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(web): drop stale-version toast in favor of the update banner by \u003ca href=\"https://github.com/nkabardin\"\u003e\u003ccode\u003e@​nkabardin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16422\"\u003elangfuse/langfuse#16422\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(trace): stop the timeline describing its own geometry by \u003ca href=\"https://github.com/nkabardin\"\u003e\u003ccode\u003e@​nkabardin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16419\"\u003elangfuse/langfuse#16419\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(monitors): bound the monitor scheduler's claim query and fix redis instrumentation by \u003ca href=\"https://github.com/marksalpeter\"\u003e\u003ccode\u003e@​marksalpeter\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16213\"\u003elangfuse/langfuse#16213\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(in-app-agent): rewrite step-limit wrap-up so Bedrock never sees assistant prefill by \u003ca href=\"https://github.com/LysanderKie\"\u003e\u003ccode\u003e@​LysanderKie\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16424\"\u003elangfuse/langfuse#16424\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(evals): link code evaluators to their scores by \u003ca href=\"https://github.com/wochinge\"\u003e\u003ccode\u003e@​wochinge\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16438\"\u003elangfuse/langfuse#16438\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(scores): support evaluator metadata filters by \u003ca href=\"https://github.com/wochinge\"\u003e\u003ccode\u003e@​wochinge\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16439\"\u003elangfuse/langfuse#16439\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(api): keep migrated evaluation rules manageable by \u003ca href=\"https://github.com/wochinge\"\u003e\u003ccode\u003e@​wochinge\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16449\"\u003elangfuse/langfuse#16449\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(annotation-queues): Don't reset trace expansion state between traces by \u003ca href=\"https://github.com/bezbac\"\u003e\u003ccode\u003e@​bezbac\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16417\"\u003elangfuse/langfuse#16417\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix: sidestep 500 on NextAuth HTML routes when callback URL is invalid  by \u003ca href=\"https://github.com/sumerman\"\u003e\u003ccode\u003e@​sumerman\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16461\"\u003elangfuse/langfuse#16461\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(evals): stop validating rule mappings when updating an evaluator by \u003ca href=\"https://github.com/cursor\"\u003e\u003ccode\u003e@​cursor\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16460\"\u003elangfuse/langfuse#16460\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(evals): activate disabled rules on evaluator attach by \u003ca href=\"https://github.com/wochinge\"\u003e\u003ccode\u003e@​wochinge\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16465\"\u003elangfuse/langfuse#16465\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(mcp): Use matches observation filters by \u003ca href=\"https://github.com/bezbac\"\u003e\u003ccode\u003e@​bezbac\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16410\"\u003elangfuse/langfuse#16410\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eChores\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003erefactor(web): Convert some components to the dialog / popover controller pattern by \u003ca href=\"https://github.com/bezbac\"\u003e\u003ccode\u003e@​bezbac\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/15893\"\u003elangfuse/langfuse#15893\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eci(assistant): publish sandbox MicroVM image to the preview account by \u003ca href=\"https://github.com/LysanderKie\"\u003e\u003ccode\u003e@​LysanderKie\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16386\"\u003elangfuse/langfuse#16386\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(assistant): remove beta label by \u003ca href=\"https://github.com/nimarb\"\u003e\u003ccode\u003e@​nimarb\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16388\"\u003elangfuse/langfuse#16388\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(pricing): add flex and fast prices by \u003ca href=\"https://github.com/langfuse-bot\"\u003e\u003ccode\u003e@​langfuse-bot\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16335\"\u003elangfuse/langfuse#16335\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003erefactor(web): Clean up \u003ccode\u003eLocalIsoDate\u003c/code\u003e by \u003ca href=\"https://github.com/bezbac\"\u003e\u003ccode\u003e@​bezbac\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16400\"\u003elangfuse/langfuse#16400\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003erefactor(web): Extract \u003ccode\u003eSearchInput\u003c/code\u003e component with dropdown by \u003ca href=\"https://github.com/bezbac\"\u003e\u003ccode\u003e@​bezbac\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16406\"\u003elangfuse/langfuse#16406\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore: disable prod-jp from cloud deployments by \u003ca href=\"https://github.com/hassiebp\"\u003e\u003ccode\u003e@​hassiebp\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16415\"\u003elangfuse/langfuse#16415\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003erefactor(web): Lint \u0026amp; merge duplicate imports by \u003ca href=\"https://github.com/bezbac\"\u003e\u003ccode\u003e@​bezbac\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16413\"\u003elangfuse/langfuse#16413\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore: Add design system code owner by \u003ca href=\"https://github.com/bezbac\"\u003e\u003ccode\u003e@​bezbac\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16420\"\u003elangfuse/langfuse#16420\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(assistant): medium thinking with opus by \u003ca href=\"https://github.com/nimarb\"\u003e\u003ccode\u003e@​nimarb\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16421\"\u003elangfuse/langfuse#16421\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003edocs(seeder): show \u003ccode\u003esupportsV4\u003c/code\u003e marker in \u003ccode\u003elist\u003c/code\u003e subcommand text output by \u003ca href=\"https://github.com/Harsh23Kashyap\"\u003e\u003ccode\u003e@​Harsh23Kashyap\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/langfuse/langfuse/pull/16430\"\u003elangfuse/langfuse#16430\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langfuse/langfuse/commit/7b481ce546645cf96aea27b27cd34c187e7e4fe7\"\u003e\u003ccode\u003e7b481ce\u003c/code\u003e\u003c/a\u003e chore: release v4.17.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langfuse/langfuse/commit/014a2d9ff132ed3b7bdb8a28cf4da4df2b34b6c0\"\u003e\u003ccode\u003e014a2d9\u003c/code\u003e\u003c/a\u003e feat(in-app-agent): Add Anthropic Messages as a supported model provider for ...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langfuse/langfuse/commit/7d62bce084f2a7a3f5a7521cd4f1a3bdcbc4ec3d\"\u003e\u003ccode\u003e7d62bce\u003c/code\u003e\u003c/a\u003e feat(evals): show and filter evaluator models (\u003ca href=\"https://redirect.github.com/langfuse/langfuse/issues/16466\"\u003e#16466\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langfuse/langfuse/commit/9f6c433ccbf4cd72fcc797bac8762515def24bd9\"\u003e\u003ccode\u003e9f6c433\u003c/code\u003e\u003c/a\u003e fix(mcp): Use matches observation filters (\u003ca href=\"https://redirect.github.com/langfuse/langfuse/issues/16410\"\u003e#16410\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langfuse/langfuse/commit/81b1e751ae1930461a430224f77adc3bee6b2985\"\u003e\u003ccode\u003e81b1e75\u003c/code\u003e\u003c/a\u003e fix(evals): activate disabled rules on evaluator attach (\u003ca href=\"https://redirect.github.com/langfuse/langfuse/issues/16465\"\u003e#16465\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langfuse/langfuse/commit/37582971f037df670f3ab29a9be27ddad9a2ae60\"\u003e\u003ccode\u003e3758297\u003c/code\u003e\u003c/a\u003e test: stabilize evaluator and SSRF integration coverage (\u003ca href=\"https://redirect.github.com/langfuse/langfuse/issues/16468\"\u003e#16468\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langfuse/langfuse/commit/cb823daddc00ad9630009cdac88b6e8d7ce1b4b0\"\u003e\u003ccode\u003ecb823da\u003c/code\u003e\u003c/a\u003e fix(evals): stop validating rule mappings when updating an evaluator (\u003ca href=\"https://redirect.github.com/langfuse/langfuse/issues/16460\"\u003e#16460\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langfuse/langfuse/commit/e9b6cbfe3297658ca4511f881d9c5a0b9a48335b\"\u003e\u003ccode\u003ee9b6cbf\u003c/code\u003e\u003c/a\u003e feat(onboarding): Ask to enable AI features during onboarding (\u003ca href=\"https://redirect.github.com/langfuse/langfuse/issues/16389\"\u003e#16389\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langfuse/langfuse/commit/8f5fff8d3da6618f24ff79e32d585a6341c09bd3\"\u003e\u003ccode\u003e8f5fff8\u003c/code\u003e\u003c/a\u003e fix: sidestep 500 on NextAuth HTML routes when callback URL is invalid  (\u003ca href=\"https://redirect.github.com/langfuse/langfuse/issues/16461\"\u003e#16461\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/langfuse/langfuse/commit/ce7c979ba8f629c9c03ec41d62bd3a0d6c224d5e\"\u003e\u003ccode\u003ece7c979\u003c/code\u003e\u003c/a\u003e feat(in-app-agent): cache stable Bedrock prefixes across turns (\u003ca href=\"https://redirect.github.com/langfuse/langfuse/issues/16459\"\u003e#16459\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/langfuse/langfuse/compare/v4.12.0...v4.17.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `packaging` from 26.2 to 26.3\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pypa/packaging/releases\"\u003epackaging's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e26.3\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003ch3\u003eFeatures\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAdd a public \u003ccode\u003eVersionRange\u003c/code\u003e API and \u003ccode\u003eSpecifierSet.to_range()\u003c/code\u003e, representing the versions a specifier set accepts as an interval set that supports intersection, union, difference, complement, set relations, membership tests, and filtering. \u003ccode\u003eVersionRange.to_specifier_set()\u003c/code\u003e converts a range back to a \u003ccode\u003eSpecifierSet\u003c/code\u003e where a PEP 440 form exists. (\u003ca href=\"https://redirect.github.com/pypa/packaging/pull/1267\"\u003e#1267\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/pypa/packaging/pull/1270\"\u003e#1270\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/pypa/packaging/pull/1298\"\u003e#1298\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ePEP 808: accept \u003ccode\u003eMetadata-Version: 2.6\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/pypa/packaging/pull/1194\"\u003e#1194\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd a \u003ccode\u003elimit\u003c/code\u003e argument to \u003ccode\u003eparse_tag()\u003c/code\u003e for compressed tag sets. (\u003ca href=\"https://redirect.github.com/pypa/packaging/issues/1220\"\u003e#1220\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd a \u003ccode\u003eprefer_sdist_predicate\u003c/code\u003e argument to \u003ccode\u003ePylock.select()\u003c/code\u003e to prefer source distributions over wheels for selected packages. (\u003ca href=\"https://redirect.github.com/pypa/packaging/pull/1334\"\u003e#1334\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003epure_python_tags()\u003c/code\u003e to generate the pure-Python tags for a Python version without touching the running platform. (\u003ca href=\"https://redirect.github.com/pypa/packaging/pull/1346\"\u003e#1346\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eSpecifierSet.is_subset()\u003c/code\u003e, \u003ccode\u003eSpecifierSet.is_superset()\u003c/code\u003e, and \u003ccode\u003eSpecifierSet.is_disjoint()\u003c/code\u003e, which compare the versions two specifier sets accept. (\u003ca href=\"https://redirect.github.com/pypa/packaging/pull/1313\"\u003e#1313\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eBehavior adaptations\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eDrop support for Python 3.8; packaging now requires Python 3.9 or later. (\u003ca href=\"https://redirect.github.com/pypa/packaging/pull/1157\"\u003e#1157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ePrefer native \u003ccode\u003elinux_*\u003c/code\u003e platform tags over \u003ccode\u003emanylinux\u003c/code\u003e and \u003ccode\u003emusllinux\u003c/code\u003e tags on Linux. (\u003ca href=\"https://redirect.github.com/pypa/packaging/issues/160\"\u003e#160\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eFixes for versions and specifiers\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eRaise \u003ccode\u003eInvalidVersion\u003c/code\u003e instead of \u003ccode\u003eTypeError\u003c/code\u003e when \u003ccode\u003eVersion\u003c/code\u003e is given a non-string. (\u003ca href=\"https://redirect.github.com/pypa/packaging/pull/1319\"\u003e#1319\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eRaise \u003ccode\u003eInvalidVersion\u003c/code\u003e for non-string pre-release letters passed to \u003ccode\u003eVersion.from_parts\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/pypa/packaging/pull/1241\"\u003e#1241\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix an \u003ccode\u003eAttributeError\u003c/code\u003e when hashing internally trimmed versions. (\u003ca href=\"https://redirect.github.com/pypa/packaging/pull/1242\"\u003e#1242\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix \u003ccode\u003eSpecifierSet.is_unsatisfiable\u003c/code\u003e for post-release boundary intersections. (\u003ca href=\"https://redirect.github.com/pypa/packaging/pull/1257\"\u003e#1257\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eFixes for requirements and markers\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eMake \u003ccode\u003eRequirement.__hash__\u003c/code\u003e consistent with \u003ccode\u003e__eq__\u003c/code\u003e for trailing-zero-equivalent specifiers (e.g. \u003ccode\u003efoo==1.0.0\u003c/code\u003e and \u003ccode\u003efoo==1.0.0.0\u003c/code\u003e), so equal requirements hash equal and deduplicate in sets and dicts. (\u003ca href=\"https://redirect.github.com/pypa/packaging/pull/1232\"\u003e#1232\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eNormalize requested extra names before comparing or hashing requirements. (\u003ca href=\"https://redirect.github.com/pypa/packaging/issues/644\"\u003e#644\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ePreserve a \u003ccode\u003eRequirement\u003c/cod...\n\n_Description has been truncated_","html_url":"https://github.com/Mubder/kazma/pull/122","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/Mubder%2Fkazma/issues/122","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/122/packages"}},{"old_version":"21.9.1","new_version":"21.14.7","update_type":"minor","path":null,"pr_created_at":"2026-10-16T10:36:48.000Z","version_change":"21.9.1 → 21.14.7","issue":{"uuid":"5882671784","node_id":"PR_kwDOSWKloM8AAAABI0to5A","number":125,"state":"open","title":"chore(deps): bump the pip-minor-patch group across 1 directory with 23 updates","user":"dependabot[bot]","labels":[],"assignees":[],"locked":false,"comments_count":3,"pull_request":true,"closed_at":null,"author_association":null,"state_reason":null,"created_at":"2026-10-16T10:36:48.000Z","updated_at":"2026-10-16T10:38:00.000Z","time_to_close":null,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"chore(deps): bump","group_name":"pip-minor-patch","update_count":23,"packages":[{"name":"ruff","old_version":"0.16.4","new_version":"0.17.0","repository_url":"https://github.com/astral-sh/ruff"},{"name":"ast-serialize","old_version":"0.11.2","new_version":"0.13.0","repository_url":"https://github.com/mypyc/ast_serialize"},{"name":"cachetools","old_version":"7.2.0","new_version":"7.2.1","repository_url":"https://github.com/tkem/cachetools"},{"name":"coverage","old_version":"7.16.1","new_version":"7.16.2","repository_url":"https://github.com/coveragepy/coveragepy"},{"name":"fonttools","old_version":"4.64.0","new_version":"4.65.0","repository_url":"https://github.com/fonttools/fonttools"},{"name":"hypothesis","old_version":"6.168.0","new_version":"6.168.5","repository_url":"https://github.com/HypothesisWorks/hypothesis"},{"name":"identify","old_version":"2.6.19","new_version":"2.6.20","repository_url":"https://github.com/pre-commit/identify"},{"name":"iniconfig","old_version":"2.3.0","new_version":"2.3.1","repository_url":"https://github.com/pytest-dev/iniconfig"},{"name":"librt","old_version":"0.15.0","new_version":"0.16.0","repository_url":"https://github.com/mypyc/librt"},{"name":"matplotlib","old_version":"3.10.0","new_version":"3.10.9","repository_url":"https://github.com/matplotlib/matplotlib"},{"name":"mypy","old_version":"2.3.1","new_version":"2.4.0","repository_url":"https://github.com/python/mypy"},{"name":"nodeenv","old_version":"1.10.0","new_version":"1.11.0","repository_url":"https://github.com/ekalinin/nodeenv"},{"name":"numpy","old_version":"2.1.3","new_version":"2.2.6","repository_url":"https://github.com/numpy/numpy"},{"name":"platformdirs","old_version":"4.11.7","new_version":"4.12.4","repository_url":"https://github.com/tox-dev/platformdirs"},{"name":"pyparsing","old_version":"3.3.2","new_version":"3.3.3","repository_url":"https://github.com/pyparsing/pyparsing"},{"name":"pyproject-api","old_version":"1.11.2","new_version":"1.11.4","repository_url":"https://github.com/tox-dev/pyproject-api"},{"name":"python-discovery","old_version":"1.6.1","new_version":"1.6.2","repository_url":"https://github.com/tox-dev/python-discovery"},{"name":"scikit-learn","old_version":"1.6.1","new_version":"1.7.2","repository_url":"https://github.com/scikit-learn/scikit-learn"},{"name":"threadpoolctl","old_version":"3.6.0","new_version":"3.7.0","repository_url":"https://github.com/joblib/threadpoolctl"},{"name":"tomli","old_version":"2.4.1","new_version":"2.5.0","repository_url":"https://github.com/hukkin/tomli"},{"name":"tox","old_version":"4.63.0","new_version":"4.65.0","repository_url":"https://github.com/tox-dev/tox"},{"name":"tzdata","old_version":"2026.3","new_version":"2026.5","repository_url":"https://github.com/python/tzdata"},{"name":"virtualenv","old_version":"21.9.1","new_version":"21.14.7","repository_url":"https://github.com/pypa/virtualenv"}],"path":null,"ecosystem":"pip"},"body":"Bumps the pip-minor-patch group with 23 updates in the / directory:\n\n| Package | From | To |\n| --- | --- | --- |\n| [ruff](https://github.com/astral-sh/ruff) | `0.16.4` | `0.17.0` |\n| [ast-serialize](https://github.com/mypyc/ast_serialize) | `0.11.2` | `0.13.0` |\n| [cachetools](https://github.com/tkem/cachetools) | `7.2.0` | `7.2.1` |\n| [coverage](https://github.com/coveragepy/coveragepy) | `7.16.1` | `7.16.2` |\n| [fonttools](https://github.com/fonttools/fonttools) | `4.64.0` | `4.65.0` |\n| [hypothesis](https://github.com/HypothesisWorks/hypothesis) | `6.168.0` | `6.168.5` |\n| [identify](https://github.com/pre-commit/identify) | `2.6.19` | `2.6.20` |\n| [iniconfig](https://github.com/pytest-dev/iniconfig) | `2.3.0` | `2.3.1` |\n| [librt](https://github.com/mypyc/librt) | `0.15.0` | `0.16.0` |\n| [matplotlib](https://github.com/matplotlib/matplotlib) | `3.10.0` | `3.10.9` |\n| [mypy](https://github.com/python/mypy) | `2.3.1` | `2.4.0` |\n| [nodeenv](https://github.com/ekalinin/nodeenv) | `1.10.0` | `1.11.0` |\n| [numpy](https://github.com/numpy/numpy) | `2.1.3` | `2.2.6` |\n| [platformdirs](https://github.com/tox-dev/platformdirs) | `4.11.7` | `4.12.4` |\n| [pyparsing](https://github.com/pyparsing/pyparsing) | `3.3.2` | `3.3.3` |\n| [pyproject-api](https://github.com/tox-dev/pyproject-api) | `1.11.2` | `1.11.4` |\n| [python-discovery](https://github.com/tox-dev/python-discovery) | `1.6.1` | `1.6.2` |\n| [scikit-learn](https://github.com/scikit-learn/scikit-learn) | `1.6.1` | `1.7.2` |\n| [threadpoolctl](https://github.com/joblib/threadpoolctl) | `3.6.0` | `3.7.0` |\n| [tomli](https://github.com/hukkin/tomli) | `2.4.1` | `2.5.0` |\n| [tox](https://github.com/tox-dev/tox) | `4.63.0` | `4.65.0` |\n| [tzdata](https://github.com/python/tzdata) | `2026.3` | `2026.5` |\n| [virtualenv](https://github.com/pypa/virtualenv) | `21.9.1` | `21.14.7` |\n\n\nUpdates `ruff` from 0.16.4 to 0.17.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/astral-sh/ruff/releases\"\u003eruff's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e0.17.0\u003c/h2\u003e\n\u003ch2\u003eRelease Notes\u003c/h2\u003e\n\u003cp\u003eReleased on 2026-10-09.\u003c/p\u003e\n\u003cp\u003eThe executables in our macOS and Windows release archives and \u003ccode\u003eruff\u003c/code\u003e wheels are now code-signed. macOS executables are signed with an Apple Developer ID certificate and notarized by Apple. Windows executables have timestamped Authenticode signatures from Azure Artifact Signing. This enables verification of the release publisher and binary integrity, supports publisher-based allowlisting, and should reduce security warnings and antivirus false positives.\u003c/p\u003e\n\u003ch3\u003eBreaking changes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate the default and latest Python versions for 3.15 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28792\"\u003e#28792\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eRuff now defaults to Python 3.11 instead of 3.10 when no Python version is configured through \u003ca href=\"https://docs.astral.sh/ruff/settings/#target-version\"\u003e\u003ccode\u003etarget-version\u003c/code\u003e\u003c/a\u003e or \u003ca href=\"https://docs.astral.sh/ruff/configuration/#inferring-the-python-version\"\u003e\u003ccode\u003erequires-python\u003c/code\u003e\u003c/a\u003e. When checking for syntax errors without a configured Python version, Ruff now defaults to Python 3.15 instead of 3.14.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate the default rule set (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28786\"\u003e#28786\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eSeveral of the \u003ccode\u003eflake8-datetimez\u003c/code\u003e rules (\u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-without-tzinfo/\"\u003e\u003ccode\u003eDTZ001\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-now-without-tzinfo/\"\u003e\u003ccode\u003eDTZ005\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-fromtimestamp/\"\u003e\u003ccode\u003eDTZ006\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-strptime-without-zone/\"\u003e\u003ccode\u003eDTZ007\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://docs.astral.sh/ruff/rules/call-date-today/\"\u003e\u003ccode\u003eDTZ011\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://docs.astral.sh/ruff/rules/call-date-fromtimestamp/\"\u003e\u003ccode\u003eDTZ012\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://docs.astral.sh/ruff/rules/datetime-min-max/\"\u003e\u003ccode\u003eDTZ901\u003c/code\u003e\u003c/a\u003e) are no longer enabled by default, while \u003ca href=\"https://docs.astral.sh/ruff/rules/undefined-local-with-nested-import-star-usage/\"\u003e\u003ccode\u003eundefined-local-with-nested-import-star-usage\u003c/code\u003e\u003c/a\u003e (\u003ccode\u003eF406\u003c/code\u003e), which corresponds to a syntax error, is now enabled by default.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate Rust crate quick-junit to 0.8.0 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/27295\"\u003e#27295\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eJUnit output now uses a \u003ccode\u003eskipped\u003c/code\u003e attribute instead of \u003ccode\u003edisabled\u003c/code\u003e on \u003ccode\u003e\u0026lt;testsuite\u0026gt;\u003c/code\u003e elements and includes a \u003ccode\u003eskipped\u003c/code\u003e attribute on the root \u003ccode\u003e\u0026lt;testsuites\u0026gt;\u003c/code\u003e element.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e[\u003ccode\u003eflake8-import-conventions\u003c/code\u003e] Add \u003ccode\u003edatetime as dt\u003c/code\u003e as a conventional alias (\u003ccode\u003eICN001\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28790\"\u003e#28790\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSupport Unicode dummy variable names (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28722\"\u003e#28722\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eThe default \u003ca href=\"https://docs.astral.sh/ruff/settings/#lint_dummy-variable-rgx\"\u003e\u003ccode\u003elint.dummy-variable-rgx\u003c/code\u003e\u003c/a\u003e now recognizes underscore-prefixed Unicode names, such as \u003ccode\u003e_次\u003c/code\u003e, as dummy variables.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate to Unicode 17 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/21229\"\u003e#21229\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28784\"\u003e#28784\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eRuff now uses Unicode 17 data for identifier normalization and named character escapes (\u003ccode\u003e\u0026quot;\\N{...}\u0026quot;\u003c/code\u003e).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAlways show unsafe and display-only fixes in the CLI (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/27810\"\u003e#27810\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eThe default \u003ccode\u003efull\u003c/code\u003e output format now shows unsafe fixes and suggestions requiring manual review, regardless of the \u003ca href=\"https://docs.astral.sh/ruff/settings/#unsafe-fixes\"\u003e\u003ccode\u003eunsafe-fixes\u003c/code\u003e\u003c/a\u003e setting. Actually applying unsafe fixes still requires explicit opt-in.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRemove the Python dependency from conda-forge builds (\u003ca href=\"https://redirect.github.com/conda-forge/ruff-feedstock/pull/361\"\u003econda-forge/ruff-feedstock#361\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eThe conda-forge build no longer depends on Python, now supports linux-riscv64, win-arm64, and linux-ppc64le platforms, and now includes shell completions. However, no longer depending on Python means that \u003ccode\u003epython -m ruff\u003c/code\u003e and \u003ccode\u003eimport ruff\u003c/code\u003e will no longer work. Use \u003ccode\u003eruff\u003c/code\u003e directly from \u003ccode\u003ePATH\u003c/code\u003e instead. PyPI installations and those from the standalone installer are unaffected.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRemove support for ruff-lsp (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28750\"\u003e#28750\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eSupport for \u003ccode\u003eruff-lsp\u003c/code\u003e, the legacy Python language server \u003ca href=\"https://github.com/astral-sh/ruff/releases/tag/0.9.5\"\u003edeprecated in Ruff v0.9.5\u003c/a\u003e, has been removed. The Ruff VS Code extension now always uses the native language server; \u003ccode\u003eruff.nativeServer\u003c/code\u003e is deprecated and ignored. See the \u003ca href=\"https://docs.astral.sh/ruff/editors/migration/\"\u003emigration guide\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eStabilization\u003c/h3\u003e\n\u003cp\u003eThe following rules have been stabilized and are no longer in preview:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://docs.astral.sh/ruff/rules/lazy-import-mismatch\"\u003e\u003ccode\u003elazy-import-mismatch\u003c/code\u003e\u003c/a\u003e (\u003ccode\u003eTID254\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://docs.astral.sh/ruff/rules/lazy-import-immediately-resolved\"\u003e\u003ccode\u003elazy-import-immediately-resolved\u003c/code\u003e\u003c/a\u003e (\u003ccode\u003eTID255\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://docs.astral.sh/ruff/rules/os-path-commonprefix\"\u003e\u003ccode\u003eos-path-commonprefix\u003c/code\u003e\u003c/a\u003e (\u003ccode\u003eRUF071\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md\"\u003eruff's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e0.17.0\u003c/h2\u003e\n\u003cp\u003eReleased on 2026-10-09.\u003c/p\u003e\n\u003cp\u003eThe executables in our macOS and Windows release archives and \u003ccode\u003eruff\u003c/code\u003e wheels are now code-signed.\nmacOS executables are signed with an Apple Developer ID certificate and notarized by Apple. Windows\nexecutables have timestamped Authenticode signatures from Azure Artifact Signing. This enables\nverification of the release publisher and binary integrity, supports publisher-based allowlisting,\nand should reduce security warnings and antivirus false positives.\u003c/p\u003e\n\u003ch3\u003eBreaking changes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate the default and latest Python versions for 3.15 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28792\"\u003e#28792\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eRuff now defaults to Python 3.11 instead of 3.10 when no Python version is configured through\n\u003ca href=\"https://docs.astral.sh/ruff/settings/#target-version\"\u003e\u003ccode\u003etarget-version\u003c/code\u003e\u003c/a\u003e or\n\u003ca href=\"https://docs.astral.sh/ruff/configuration/#inferring-the-python-version\"\u003e\u003ccode\u003erequires-python\u003c/code\u003e\u003c/a\u003e. When\nchecking for syntax errors without a configured Python version, Ruff now defaults to Python 3.15\ninstead of 3.14.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate the default rule set (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28786\"\u003e#28786\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eSeveral of the \u003ccode\u003eflake8-datetimez\u003c/code\u003e rules\n(\u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-without-tzinfo/\"\u003e\u003ccode\u003eDTZ001\u003c/code\u003e\u003c/a\u003e,\n\u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-now-without-tzinfo/\"\u003e\u003ccode\u003eDTZ005\u003c/code\u003e\u003c/a\u003e,\n\u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-fromtimestamp/\"\u003e\u003ccode\u003eDTZ006\u003c/code\u003e\u003c/a\u003e,\n\u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-strptime-without-zone/\"\u003e\u003ccode\u003eDTZ007\u003c/code\u003e\u003c/a\u003e,\n\u003ca href=\"https://docs.astral.sh/ruff/rules/call-date-today/\"\u003e\u003ccode\u003eDTZ011\u003c/code\u003e\u003c/a\u003e,\n\u003ca href=\"https://docs.astral.sh/ruff/rules/call-date-fromtimestamp/\"\u003e\u003ccode\u003eDTZ012\u003c/code\u003e\u003c/a\u003e, and\n\u003ca href=\"https://docs.astral.sh/ruff/rules/datetime-min-max/\"\u003e\u003ccode\u003eDTZ901\u003c/code\u003e\u003c/a\u003e) are no longer enabled by default,\nwhile \u003ca href=\"https://docs.astral.sh/ruff/rules/undefined-local-with-nested-import-star-usage/\"\u003e\u003ccode\u003eundefined-local-with-nested-import-star-usage\u003c/code\u003e\u003c/a\u003e\n(\u003ccode\u003eF406\u003c/code\u003e), which corresponds to a syntax error, is now enabled by default.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate Rust crate quick-junit to 0.8.0 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/27295\"\u003e#27295\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eJUnit output now uses a \u003ccode\u003eskipped\u003c/code\u003e attribute instead of \u003ccode\u003edisabled\u003c/code\u003e on \u003ccode\u003e\u0026lt;testsuite\u0026gt;\u003c/code\u003e elements and\nincludes a \u003ccode\u003eskipped\u003c/code\u003e attribute on the root \u003ccode\u003e\u0026lt;testsuites\u0026gt;\u003c/code\u003e element.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e[\u003ccode\u003eflake8-import-conventions\u003c/code\u003e] Add \u003ccode\u003edatetime as dt\u003c/code\u003e as a conventional alias (\u003ccode\u003eICN001\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28790\"\u003e#28790\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSupport Unicode dummy variable names (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28722\"\u003e#28722\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eThe default \u003ca href=\"https://docs.astral.sh/ruff/settings/#lint_dummy-variable-rgx\"\u003e\u003ccode\u003elint.dummy-variable-rgx\u003c/code\u003e\u003c/a\u003e\nnow recognizes underscore-prefixed Unicode names, such as \u003ccode\u003e_次\u003c/code\u003e, as dummy variables.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate to Unicode 17 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/21229\"\u003e#21229\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28784\"\u003e#28784\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eRuff now uses Unicode 17 data for identifier normalization and named character escapes (\u003ccode\u003e\u0026quot;\\N{...}\u0026quot;\u003c/code\u003e).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAlways show unsafe and display-only fixes in the CLI (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/27810\"\u003e#27810\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/5b27c1ccfaa230fb195855f5cf3404a21e3379cd\"\u003e\u003ccode\u003e5b27c1c\u003c/code\u003e\u003c/a\u003e Bump version to 0.17.0 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/29259\"\u003e#29259\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/8f362bf4cb5dbad095ac416602496705d41fc843\"\u003e\u003ccode\u003e8f362bf\u003c/code\u003e\u003c/a\u003e Integrate vendored Unicode names into Ruff\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/88a50d695c1142294bb4c780fad47d3306173885\"\u003e\u003ccode\u003e88a50d6\u003c/code\u003e\u003c/a\u003e Revert upstream Unicode loose matching\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/276832aa91f2086a6ec880884fcdd987991cddf2\"\u003e\u003ccode\u003e276832a\u003c/code\u003e\u003c/a\u003e Revert upstream Unicode alias normalization\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/26911caa2800758779965510d2f222b438abbb38\"\u003e\u003ccode\u003e26911ca\u003c/code\u003e\u003c/a\u003e Vendor unicode_names2 from upstream\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/27e3797508d1a7ad69e4900d51e38d78785aaf73\"\u003e\u003ccode\u003e27e3797\u003c/code\u003e\u003c/a\u003e [\u003ccode\u003eruff\u003c/code\u003e] Stabilize \u003ccode\u003eos-path-commonprefix\u003c/code\u003e (\u003ccode\u003eRUF071\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/28764\"\u003e#28764\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/bbb52c1267cf39aba67e54c2b5800878d23073a9\"\u003e\u003ccode\u003ebbb52c1\u003c/code\u003e\u003c/a\u003e [\u003ccode\u003eflake8-tidy-imports\u003c/code\u003e] Stabilize \u003ccode\u003elazy-import-immediately-resolved\u003c/code\u003e (`TID255...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/5aa9cbd3a49d32b24ac21fa7797ca87a330792a2\"\u003e\u003ccode\u003e5aa9cbd\u003c/code\u003e\u003c/a\u003e [\u003ccode\u003eflake8-tidy-imports\u003c/code\u003e] Stabilize \u003ccode\u003elazy-import-mismatch\u003c/code\u003e (\u003ccode\u003eTID254\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/28760\"\u003e#28760\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/dba1bc893aedfeea2064c4e8e764135f0d44dc3f\"\u003e\u003ccode\u003edba1bc8\u003c/code\u003e\u003c/a\u003e [\u003ccode\u003eflake8-import-conventions\u003c/code\u003e] Add \u003ccode\u003edatetime as dt\u003c/code\u003e as a conventional alias (`...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/ef23c9c39eb3029bab0139c3ea7ae6d95c4131e0\"\u003e\u003ccode\u003eef23c9c\u003c/code\u003e\u003c/a\u003e Update default and latest Python versions for 3.15 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/28792\"\u003e#28792\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/astral-sh/ruff/compare/0.16.4...0.17.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `ast-serialize` from 0.11.2 to 0.13.0\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mypyc/ast_serialize/commit/42628bd687c583025775f4c404235f73d43ca875\"\u003e\u003ccode\u003e42628bd\u003c/code\u003e\u003c/a\u003e Bump version to 0.13.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mypyc/ast_serialize/commit/67659a0bd5f46d6a91e4db907b06a71fdb659e76\"\u003e\u003ccode\u003e67659a0\u003c/code\u003e\u003c/a\u003e Straighten type comment parsing (\u003ca href=\"https://redirect.github.com/mypyc/ast_serialize/issues/95\"\u003e#95\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mypyc/ast_serialize/commit/8d0a5c6d1c87e29aa37c7292149086b514ccac93\"\u003e\u003ccode\u003e8d0a5c6\u003c/code\u003e\u003c/a\u003e Bump version to 0.12.1\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mypyc/ast_serialize/commit/a7f11b17731c0c3b9afc683e977e3faf90ba6c19\"\u003e\u003ccode\u003ea7f11b1\u003c/code\u003e\u003c/a\u003e Fix parsing plain None type in a string (\u003ca href=\"https://redirect.github.com/mypyc/ast_serialize/issues/96\"\u003e#96\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mypyc/ast_serialize/commit/bcf707f0d2c59a8033d2d8734849b2233f36f70d\"\u003e\u003ccode\u003ebcf707f\u003c/code\u003e\u003c/a\u003e Bump version to 0.12.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mypyc/ast_serialize/commit/89b6e832250fbc4d80739b318237f9571d6c32cc\"\u003e\u003ccode\u003e89b6e83\u003c/code\u003e\u003c/a\u003e Allow colon in error codes (\u003ca href=\"https://redirect.github.com/mypyc/ast_serialize/issues/94\"\u003e#94\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/mypyc/ast_serialize/compare/v0.11.2...v0.13.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `cachetools` from 7.2.0 to 7.2.1\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tkem/cachetools/blob/master/CHANGELOG.rst\"\u003ecachetools's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003ev7.2.1 (2026-10-05)\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eImprove error handling for \u003ccode\u003eRRCache.popitem()\u003c/code\u003e when the cache is\nempty.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMinor style and documentation improvements.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate CI environment.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tkem/cachetools/commit/9976f1a8076631560f49c5b0dfda7e4d00ee0a4a\"\u003e\u003ccode\u003e9976f1a\u003c/code\u003e\u003c/a\u003e Release v7.2.1.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tkem/cachetools/commit/ffe21c44d3f7de9c7a89870c8cf1fd7aa583a2ae\"\u003e\u003ccode\u003effe21c4\u003c/code\u003e\u003c/a\u003e Fix \u003ca href=\"https://redirect.github.com/tkem/cachetools/issues/430\"\u003e#430\u003c/a\u003e: Honor falsey getsizeof callables (\u003ca href=\"https://redirect.github.com/tkem/cachetools/issues/431\"\u003e#431\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tkem/cachetools/commit/110fe5d03e7b4b8f5c5ec97533c94254cdf8733f\"\u003e\u003ccode\u003e110fe5d\u003c/code\u003e\u003c/a\u003e Bump codecov/codecov-action\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tkem/cachetools/commit/11153c947675edae9da06a5295bfa4a54b8a4f53\"\u003e\u003ccode\u003e11153c9\u003c/code\u003e\u003c/a\u003e Prefer pyright file-level comments over relaxing rules globally.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tkem/cachetools/commit/bcf9e8176ebe16da58751fce971c98ffe045ede1\"\u003e\u003ccode\u003ebcf9e81\u003c/code\u003e\u003c/a\u003e Fix \u003ca href=\"https://redirect.github.com/tkem/cachetools/issues/423\"\u003e#423\u003c/a\u003e: Detect an empty RRCache before calling choice.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tkem/cachetools/commit/eadb91cc9d54a57d6738386bc5c575ff3c7d22ec\"\u003e\u003ccode\u003eeadb91c\u003c/code\u003e\u003c/a\u003e docs: clarify that unbounded TTL caches still expire entries\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/tkem/cachetools/compare/v7.2.0...v7.2.1\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `coverage` from 7.16.1 to 7.16.2\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/coveragepy/coveragepy/releases\"\u003ecoverage's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e7.16.2\u003c/h2\u003e\n\u003ch2\u003eVersion 7.16.2 — 2026-09-27\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eFix: on Python 3.14 and later, a \u003ccode\u003efor\u003c/code\u003e loop completing immediately before a function return could mistakenly report an uncovered branch. This is now fixed, closing \u003ca href=\"https://redirect.github.com/coveragepy/coveragepy/issues/2168\"\u003eissue 2168\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003eFix: on Python 3.14 and later, the \u003ccode\u003eelse\u003c/code\u003e clause of a \u003ccode\u003etry\u003c/code\u003e whose body is a \u003ccode\u003ewith\u003c/code\u003e statement could incorrectly be reported as covered when the \u003ccode\u003ewith\u003c/code\u003e raised. This is now fixed, closing \u003ca href=\"https://redirect.github.com/coveragepy/coveragepy/issues/2289\"\u003eissue 2289\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003eFix: with \u003ccode\u003edynamic_context = test_function\u003c/code\u003e, test methods written as \u003ccode\u003e@staticmethod\u003c/code\u003e or \u003ccode\u003e@classmethod\u003c/code\u003e were not given a context of their own. Now they are, on Python 3.11 and later. Closes \u003ca href=\"https://redirect.github.com/coveragepy/coveragepy/issues/1923\"\u003eissue 1923\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e:arrow_right:  PyPI page: \u003ca href=\"https://pypi.org/project/coverage/7.16.2\"\u003ecoverage 7.16.2\u003c/a\u003e.\n:arrow_right:  To install: \u003ccode\u003epython3 -m pip install coverage==7.16.2\u003c/code\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/coveragepy/coveragepy/blob/main/CHANGES.rst\"\u003ecoverage's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003eVersion 7.16.2 — 2026-09-27\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eFix: on Python 3.14 and later, a \u003ccode\u003efor\u003c/code\u003e loop completing immediately before a\nfunction return could mistakenly report an uncovered branch. This is now\nfixed, closing \u003ccode\u003eissue 2168\u003c/code\u003e_.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFix: on Python 3.14 and later, the \u003ccode\u003eelse\u003c/code\u003e clause of a \u003ccode\u003etry\u003c/code\u003e whose body is\na \u003ccode\u003ewith\u003c/code\u003e statement could incorrectly be reported as covered when the\n\u003ccode\u003ewith\u003c/code\u003e raised.  This is now fixed, closing \u003ccode\u003eissue 2289\u003c/code\u003e_.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFix: with \u003ccode\u003edynamic_context = test_function\u003c/code\u003e, test methods written as\n\u003ccode\u003e@staticmethod\u003c/code\u003e or \u003ccode\u003e@classmethod\u003c/code\u003e were not given a context of their own.\nNow they are, on Python 3.11 and later.  Closes \u003ccode\u003eissue 1923\u003c/code\u003e_.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e.. _issue 1923: \u003ca href=\"https://redirect.github.com/coveragepy/coveragepy/issues/1923\"\u003ecoveragepy/coveragepy#1923\u003c/a\u003e\n.. _issue 2168: \u003ca href=\"https://redirect.github.com/coveragepy/coveragepy/issues/2168\"\u003ecoveragepy/coveragepy#2168\u003c/a\u003e\n.. _issue 2289: \u003ca href=\"https://redirect.github.com/coveragepy/coveragepy/issues/2289\"\u003ecoveragepy/coveragepy#2289\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e.. _changes_7-16-1:\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/coveragepy/coveragepy/commit/5643ae7c682bbd56ee1ac2b11556145ab8c2cab0\"\u003e\u003ccode\u003e5643ae7\u003c/code\u003e\u003c/a\u003e docs: prep for 7.16.2\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/coveragepy/coveragepy/commit/a3e969fc6ce8273538702a2336d8c2674f8017d8\"\u003e\u003ccode\u003ea3e969f\u003c/code\u003e\u003c/a\u003e fix: dynamic_context for \u003ca href=\"https://github.com/staticmethod\"\u003e\u003ccode\u003e@​staticmethod\u003c/code\u003e\u003c/a\u003e and \u003ca href=\"https://github.com/classmethod\"\u003e\u003ccode\u003e@​classmethod\u003c/code\u003e\u003c/a\u003e tests (issue 1923) (#...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/coveragepy/coveragepy/commit/8ad72362f03e59643865d15ffadd002529a777a9\"\u003e\u003ccode\u003e8ad7236\u003c/code\u003e\u003c/a\u003e fix: stop counting the try/else line when a with statement raises (\u003ca href=\"https://redirect.github.com/coveragepy/coveragepy/issues/2301\"\u003e#2301\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/coveragepy/coveragepy/commit/c6dab1fc387d161fe5938ce9421a7a38ca81ae7f\"\u003e\u003ccode\u003ec6dab1f\u003c/code\u003e\u003c/a\u003e fix(debug): debug output doesn't mis-handle odd line separators \u003ca href=\"https://redirect.github.com/coveragepy/coveragepy/issues/2296\"\u003e#2296\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/coveragepy/coveragepy/commit/08fbc3229adc8e7681a0d9134d3d5beb1684ae54\"\u003e\u003ccode\u003e08fbc32\u003c/code\u003e\u003c/a\u003e style: Protocols should use \u003ccode\u003e...\u003c/code\u003e for method bodies\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/coveragepy/coveragepy/commit/bc7b0e386388148687241cadcab56ac3e17aea9c\"\u003e\u003ccode\u003ebc7b0e3\u003c/code\u003e\u003c/a\u003e refactor: positional-only args are better than pragmas\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/coveragepy/coveragepy/commit/52afd6be360c3b949d69ff83aca873c119a7959a\"\u003e\u003ccode\u003e52afd6b\u003c/code\u003e\u003c/a\u003e Document parallel tox coverage data files (\u003ca href=\"https://redirect.github.com/coveragepy/coveragepy/issues/2284\"\u003e#2284\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/coveragepy/coveragepy/commit/f653aaec4c58f89375716389e4ca17dd056d2069\"\u003e\u003ccode\u003ef653aae\u003c/code\u003e\u003c/a\u003e fix: loop completion arcs on Python 3.14 (\u003ca href=\"https://redirect.github.com/coveragepy/coveragepy/issues/2281\"\u003e#2281\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/coveragepy/coveragepy/commit/cc1ced4d4c8ef7674a824002aa5157d1f37acd78\"\u003e\u003ccode\u003ecc1ced4\u003c/code\u003e\u003c/a\u003e test: PyPy still compiles comprehensions as functions\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/coveragepy/coveragepy/commit/85a9088395e89840cb11c1c86735ba1f7a62d50d\"\u003e\u003ccode\u003e85a9088\u003c/code\u003e\u003c/a\u003e chore: make upgrade\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/coveragepy/coveragepy/compare/7.16.1...7.16.2\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `fonttools` from 4.64.0 to 4.65.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/fonttools/fonttools/releases\"\u003efonttools's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e4.65.0\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e[glyf] Add \u003ccode\u003e__iter__\u003c/code\u003e, \u003ccode\u003eitems\u003c/code\u003e and \u003ccode\u003evalues\u003c/code\u003e methods to the \u003ccode\u003eglyf\u003c/code\u003e table to make it more dict-like (\u003ca href=\"https://redirect.github.com/fonttools/fonttools/issues/4156\"\u003e#4156\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003e[feaLib] Escape the anonymous block tag when scanning for its terminator, so tags containing regex metacharacters are matched literally (\u003ca href=\"https://redirect.github.com/fonttools/fonttools/issues/4167\"\u003e#4167\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003e[varLib] Strip directory components from \u003ccode\u003e\u0026lt;variable-font name=\u0026quot;...\u0026quot;/\u0026gt;\u003c/code\u003e when deriving the output filename in the \u003ccode\u003evarLib\u003c/code\u003e command line, so a designspace cannot write outside the output directory (\u003ca href=\"https://redirect.github.com/fonttools/fonttools/issues/4168\"\u003e#4168\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003e[feaLib] Fix tracking of the current script and language across redundant \u003ccode\u003escript\u003c/code\u003e statements. Rules following a \u003ccode\u003escript\u003c/code\u003e statement that names the first declared language system no longer end up under the \u003ccode\u003eDFLT\u003c/code\u003e script, and a \u003ccode\u003escript\u003c/code\u003e statement naming the already-current script still narrows the language systems and terminates the current lookup while leaving the \u003ccode\u003elookupflag\u003c/code\u003e alone, matching makeotf (\u003ca href=\"https://redirect.github.com/fonttools/fonttools/issues/1824\"\u003e#1824\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/fonttools/fonttools/issues/2522\"\u003e#2522\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/fonttools/fonttools/issues/4169\"\u003e#4169\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003e[varLib.interpolatable] Escape glyph names in the HTML report (\u003ca href=\"https://redirect.github.com/fonttools/fonttools/issues/4172\"\u003e#4172\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003e[otlLib] Fix overflow handling when building contextual lookups: offset overflows now raise \u003ccode\u003eOTLOffsetOverflowError\u003c/code\u003e instead of \u003ccode\u003eAttributeError\u003c/code\u003e so another contextual format can be tried (regression from \u003ca href=\"https://redirect.github.com/fonttools/fonttools/issues/3439\"\u003e#3439\u003c/a\u003e). When all formats overflow, split the ruleset in halves until it fits (\u003ca href=\"https://redirect.github.com/fonttools/fonttools/issues/4171\"\u003e#4171\u003c/a\u003e).\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/fonttools/fonttools/blob/main/NEWS.rst\"\u003efonttools's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e4.65.0 (released 2026-09-10)\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e[glyf] Add \u003ccode\u003e__iter__\u003c/code\u003e, \u003ccode\u003eitems\u003c/code\u003e and \u003ccode\u003evalues\u003c/code\u003e methods to the \u003ccode\u003eglyf\u003c/code\u003e table\nto make it more dict-like (\u003ca href=\"https://redirect.github.com/fonttools/fonttools/issues/4156\"\u003e#4156\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003e[feaLib] Escape the anonymous block tag when scanning for its terminator, so tags\ncontaining regex metacharacters are matched literally (\u003ca href=\"https://redirect.github.com/fonttools/fonttools/issues/4167\"\u003e#4167\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003e[varLib] Strip directory components from \u003ccode\u003e\u0026lt;variable-font name=\u0026quot;...\u0026quot;/\u0026gt;\u003c/code\u003e when\nderiving the output filename in the \u003ccode\u003evarLib\u003c/code\u003e command line, so a designspace\ncannot write outside the output directory (\u003ca href=\"https://redirect.github.com/fonttools/fonttools/issues/4168\"\u003e#4168\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003e[feaLib] Fix tracking of the current script and language across redundant\n\u003ccode\u003escript\u003c/code\u003e statements. Rules following a \u003ccode\u003escript\u003c/code\u003e statement that names the\nfirst declared language system no longer end up under the \u003ccode\u003eDFLT\u003c/code\u003e script, and\na \u003ccode\u003escript\u003c/code\u003e statement naming the already-current script still narrows the\nlanguage systems and terminates the current lookup while leaving the\n\u003ccode\u003elookupflag\u003c/code\u003e alone, matching makeotf (\u003ca href=\"https://redirect.github.com/fonttools/fonttools/issues/1824\"\u003e#1824\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/fonttools/fonttools/issues/2522\"\u003e#2522\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/fonttools/fonttools/issues/4169\"\u003e#4169\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003e[varLib.interpolatable] Escape glyph names in the HTML report (\u003ca href=\"https://redirect.github.com/fonttools/fonttools/issues/4172\"\u003e#4172\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003e[otlLib] Fix overflow handling when building contextual lookups: offset overflows\nnow raise \u003ccode\u003eOTLOffsetOverflowError\u003c/code\u003e instead of \u003ccode\u003eAttributeError\u003c/code\u003e so another\ncontextual format can be tried (regression from \u003ca href=\"https://redirect.github.com/fonttools/fonttools/issues/3439\"\u003e#3439\u003c/a\u003e). When all formats\noverflow, split the ruleset in halves until it fits (\u003ca href=\"https://redirect.github.com/fonttools/fonttools/issues/4171\"\u003e#4171\u003c/a\u003e).\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fonttools/fonttools/commit/656f89dbf2026a7225aafba4fa11218210a765f5\"\u003e\u003ccode\u003e656f89d\u003c/code\u003e\u003c/a\u003e Release 4.65.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fonttools/fonttools/commit/16439502571fa73669743960aeab082a1d1d965d\"\u003e\u003ccode\u003e1643950\u003c/code\u003e\u003c/a\u003e Update NEWS.rst [skip ci]\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fonttools/fonttools/commit/fd0f083404d89ca61b9a8ce030b5b3006b709734\"\u003e\u003ccode\u003efd0f083\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/fonttools/fonttools/issues/4177\"\u003e#4177\u003c/a\u003e from fonttools/sbix-to-otsvg-snippet\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fonttools/fonttools/commit/9c625d410065e5006502bee9d4c734b2bf8c5c54\"\u003e\u003ccode\u003e9c625d4\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/fonttools/fonttools/issues/4171\"\u003e#4171\u003c/a\u003e from fonttools/fix-contextual-size-overflow\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fonttools/fonttools/commit/5f04c3853b5d20185f4913f63a863d1b1a652cc3\"\u003e\u003ccode\u003e5f04c38\u003c/code\u003e\u003c/a\u003e Add sbix to OT-SVG conversion snippet\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fonttools/fonttools/commit/48a0cf93bbca4983455d2d31e85de42377b83bd2\"\u003e\u003ccode\u003e48a0cf9\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/fonttools/fonttools/issues/4172\"\u003e#4172\u003c/a\u003e from insaf021/interpolatable-html-escape\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fonttools/fonttools/commit/d30db24fc883f27c3ea5e0560c52dfe501a38918\"\u003e\u003ccode\u003ed30db24\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/fonttools/fonttools/issues/4169\"\u003e#4169\u003c/a\u003e from cmyr/fealib-script-tracking-afdko\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fonttools/fonttools/commit/ac342d76483071017dfc56cb02be4d18f5f6460d\"\u003e\u003ccode\u003eac342d7\u003c/code\u003e\u003c/a\u003e [varLib.interpolatable] escape glyph name in HTML report\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fonttools/fonttools/commit/2a93de2209317546d4016ea09b229e0417f59eb8\"\u003e\u003ccode\u003e2a93de2\u003c/code\u003e\u003c/a\u003e Split contextual rulesets when all formats overflow\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fonttools/fonttools/commit/e6bb5fe394b418b17f27ac22b96da2d39fb4a472\"\u003e\u003ccode\u003ee6bb5fe\u003c/code\u003e\u003c/a\u003e Fix overflow reporting when sizing contextual lookups\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/fonttools/fonttools/compare/4.64.0...4.65.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `hypothesis` from 6.168.0 to 6.168.5\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/ca2a4c6e3c6b979d9fbb5ef9db614885a736d2aa\"\u003e\u003ccode\u003eca2a4c6\u003c/code\u003e\u003c/a\u003e Bump hypothesis version to 6.168.5 and update changelog\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/c1c9957de83aad3facea6610b0bccecf141632f6\"\u003e\u003ccode\u003ec1c9957\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/HypothesisWorks/hypothesis/issues/4894\"\u003e#4894\u003c/a\u003e from MarcoGorelli/django-from-field-return-type\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/d8625019d00324ac8d7571db26d6180ebcd0b2eb\"\u003e\u003ccode\u003ed862501\u003c/code\u003e\u003c/a\u003e Bump hypothesis version to 6.168.4 and update changelog\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/de4ec1c1bae27e5f1364b32b21295274c12b3e6f\"\u003e\u003ccode\u003ede4ec1c\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/HypothesisWorks/hypothesis/issues/4887\"\u003e#4887\u003c/a\u003e from HypothesisWorks/create-pull-request/patch\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/8a808891a388e538b41ae758e6c4a100bf4c6379\"\u003e\u003ccode\u003e8a80889\u003c/code\u003e\u003c/a\u003e add pypy312 support\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/9ee265d9e7523351ab30c337c78b022e03e14e21\"\u003e\u003ccode\u003e9ee265d\u003c/code\u003e\u003c/a\u003e Update pinned dependencies\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/f92f61c2d2f3c8aabd4946ae6cc2ddaf6941a011\"\u003e\u003ccode\u003ef92f61c\u003c/code\u003e\u003c/a\u003e Fix the return type of django's from_field\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/44b82b24cb40c72afd1f6e10c2af7a5d82c6539a\"\u003e\u003ccode\u003e44b82b2\u003c/code\u003e\u003c/a\u003e Bump hypothesis version to 6.168.3 and update changelog\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/aeaafb590194c03e30d0fbbfe11d29061204d756\"\u003e\u003ccode\u003eaeaafb5\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/HypothesisWorks/hypothesis/issues/4888\"\u003e#4888\u003c/a\u003e from gpacix/fix-quadratic-statistics\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/f3f4a294e9de0ddc1d5fbda23275bdfe57d78981\"\u003e\u003ccode\u003ef3f4a29\u003c/code\u003e\u003c/a\u003e wording, remove hardcoded test\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/HypothesisWorks/hypothesis/compare/v6.168.0...v6.168.5\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `identify` from 2.6.19 to 2.6.20\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pre-commit/identify/commit/aa34031fb31db554aa02e61dc703604a19cba0a0\"\u003e\u003ccode\u003eaa34031\u003c/code\u003e\u003c/a\u003e v2.6.20\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pre-commit/identify/commit/116099f59f9e603de9385b9f7f36a38f47f2cb36\"\u003e\u003ccode\u003e116099f\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/pre-commit/identify/issues/609\"\u003e#609\u003c/a\u003e from Malix-Labs/feat/add-nushell\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pre-commit/identify/commit/971546cb3e5102681e143602c3b513e8153ddc65\"\u003e\u003ccode\u003e971546c\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/pre-commit/identify/issues/610\"\u003e#610\u003c/a\u003e from pre-commit/lock-file-tags\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pre-commit/identify/commit/da45cb15e5c40e03253066cbfc6259cc2ef17520\"\u003e\u003ccode\u003eda45cb1\u003c/code\u003e\u003c/a\u003e Add support for 'nu' extension and Nushell interpreters\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pre-commit/identify/commit/a35b99bcf29f016f574f52c39d1c83533fa37d5d\"\u003e\u003ccode\u003ea35b99b\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/pre-commit/identify/issues/608\"\u003e#608\u003c/a\u003e from steovd/profile-sh\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pre-commit/identify/commit/bd5cdb7c18f5cb74adba9619fe9bd06747e8a8a7\"\u003e\u003ccode\u003ebd5cdb7\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/pre-commit/identify/issues/601\"\u003e#601\u003c/a\u003e from ngie-eign/issue-258\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pre-commit/identify/commit/66faf04d79b064020901da66a648239039efcb2b\"\u003e\u003ccode\u003e66faf04\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/pre-commit/identify/issues/597\"\u003e#597\u003c/a\u003e from edgarrmondragon/patch-1\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pre-commit/identify/commit/c75a0a21564ed6e1721394255af3ddd4f40bbd06\"\u003e\u003ccode\u003ec75a0a2\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/pre-commit/identify/issues/593\"\u003e#593\u003c/a\u003e from NinjaMandalorian/main\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pre-commit/identify/commit/ea6c9f914a6d7507777ca54ba86b9af52ae6f026\"\u003e\u003ccode\u003eea6c9f9\u003c/code\u003e\u003c/a\u003e Add support for 'luau' file extension\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pre-commit/identify/commit/d28c5712db75b16bd715b7c7b545e3eb5f6f2a35\"\u003e\u003ccode\u003ed28c571\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/pre-commit/identify/issues/585\"\u003e#585\u003c/a\u003e from Kvan7/patch-1\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/pre-commit/identify/compare/v2.6.19...v2.6.20\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `iniconfig` from 2.3.0 to 2.3.1\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pytest-dev/iniconfig/releases\"\u003einiconfig's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003eVersion 2.3.1\u003c/h2\u003e\n\u003ch2\u003eFixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eParsing values with many continuation lines is now linear instead of quadratic in time (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/78\"\u003e#78\u003c/a\u003e, regarding \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/77\"\u003e#77\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003eA leading UTF-8 BOM is now stripped when reading INI files. Files saved by Windows editors used to fail with \u003ccode\u003eParseError\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/76\"\u003e#76\u003c/a\u003e, thanks \u003ca href=\"https://github.com/Pitchfork-and-Torch\"\u003e\u003ccode\u003e@​Pitchfork-and-Torch\u003c/code\u003e\u003c/a\u003e).\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eInternal\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003einiconfig._parse.ParsedLine.value\u003c/code\u003e is now a list of lines. This is private API.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eDocs\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eThe README example now uses \u003ccode\u003eIniConfig.parse()\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/79\"\u003e#79\u003c/a\u003e, thanks \u003ca href=\"https://github.com/MbappeWU\"\u003e\u003ccode\u003e@​MbappeWU\u003c/code\u003e\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003eFixed the issue tracker link (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/74\"\u003e#74\u003c/a\u003e, thanks \u003ca href=\"https://github.com/stefan6419846\"\u003e\u003ccode\u003e@​stefan6419846\u003c/code\u003e\u003c/a\u003e).\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull diff:\u003c/strong\u003e \u003ca href=\"https://github.com/pytest-dev/iniconfig/compare/v2.3.0...v2.3.1\"\u003ehttps://github.com/pytest-dev/iniconfig/compare/v2.3.0...v2.3.1\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e[pre-commit.ci] pre-commit autoupdate by \u003ca href=\"https://github.com/pre-commit-ci\"\u003e\u003ccode\u003e@​pre-commit-ci\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/71\"\u003epytest-dev/iniconfig#71\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[pre-commit.ci] pre-commit autoupdate by \u003ca href=\"https://github.com/pre-commit-ci\"\u003e\u003ccode\u003e@​pre-commit-ci\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/72\"\u003epytest-dev/iniconfig#72\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix link to issues by \u003ca href=\"https://github.com/stefan6419846\"\u003e\u003ccode\u003e@​stefan6419846\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/74\"\u003epytest-dev/iniconfig#74\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eparse_lines: keep values as list of lines, join once by \u003ca href=\"https://github.com/RonnyPfannschmidt\"\u003e\u003ccode\u003e@​RonnyPfannschmidt\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/78\"\u003epytest-dev/iniconfig#78\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[pre-commit.ci] pre-commit autoupdate by \u003ca href=\"https://github.com/pre-commit-ci\"\u003e\u003ccode\u003e@​pre-commit-ci\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/73\"\u003epytest-dev/iniconfig#73\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003etest: expect sorted \u003cstrong\u003eall\u003c/strong\u003e after ruff autofix by \u003ca href=\"https://github.com/RonnyPfannschmidt\"\u003e\u003ccode\u003e@​RonnyPfannschmidt\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/80\"\u003epytest-dev/iniconfig#80\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003edocs: use parse API in the README example by \u003ca href=\"https://github.com/MbappeWU\"\u003e\u003ccode\u003e@​MbappeWU\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/79\"\u003epytest-dev/iniconfig#79\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eStrip leading UTF-8 BOM when reading INI files by \u003ca href=\"https://github.com/Pitchfork-and-Torch\"\u003e\u003ccode\u003e@​Pitchfork-and-Torch\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/76\"\u003epytest-dev/iniconfig#76\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echangelog: add BOM stripping (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/76\"\u003e#76\u003c/a\u003e) to 2.3.1 by \u003ca href=\"https://github.com/RonnyPfannschmidt\"\u003e\u003ccode\u003e@​RonnyPfannschmidt\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/81\"\u003epytest-dev/iniconfig#81\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/stefan6419846\"\u003e\u003ccode\u003e@​stefan6419846\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/74\"\u003epytest-dev/iniconfig#74\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/MbappeWU\"\u003e\u003ccode\u003e@​MbappeWU\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/79\"\u003epytest-dev/iniconfig#79\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/Pitchfork-and-Torch\"\u003e\u003ccode\u003e@​Pitchfork-and-Torch\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/76\"\u003epytest-dev/iniconfig#76\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pytest-dev/iniconfig/compare/v2.3.0...v2.3.1\"\u003ehttps://github.com/pytest-dev/iniconfig/compare/v2.3.0...v2.3.1\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pytest-dev/iniconfig/blob/main/CHANGELOG\"\u003einiconfig's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e2.3.1\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003efix quadratic parse time for values with many continuation lines (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/78\"\u003e#78\u003c/a\u003e, regarding \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/77\"\u003e#77\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003estrip a leading UTF-8 BOM when reading INI files, which previously raised \u003ccode\u003eParseError\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/76\"\u003e#76\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003einternal: \u003ccode\u003einiconfig._parse.ParsedLine.value\u003c/code\u003e is now a list of lines\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/316fbfaf2752d89326e1e75b45cd070f5b5ace9a\"\u003e\u003ccode\u003e316fbfa\u003c/code\u003e\u003c/a\u003e changelog: add BOM stripping (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/76\"\u003e#76\u003c/a\u003e) to 2.3.1 (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/81\"\u003e#81\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/d2dcb7289291e7e7019c183659814d42f7264b2d\"\u003e\u003ccode\u003ed2dcb72\u003c/code\u003e\u003c/a\u003e Strip leading UTF-8 BOM when reading INI files (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/76\"\u003e#76\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/40d8c03a1553953350d787e45f1cb768e2c14e6a\"\u003e\u003ccode\u003e40d8c03\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/79\"\u003e#79\u003c/a\u003e from MbappeWU/codex/docs-parse-inline-comments\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/48359c3a7c2c8648a134ea8469e802b5aa8d5030\"\u003e\u003ccode\u003e48359c3\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/80\"\u003e#80\u003c/a\u003e from pytest-dev/claude/fix-iniconfig-test-eukh2n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/b153213a011fa92f4370c83cef614cf73c987f57\"\u003e\u003ccode\u003eb153213\u003c/code\u003e\u003c/a\u003e test: expect sorted \u003cstrong\u003eall\u003c/strong\u003e after ruff RUF022 autofix\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/4fddfabc850afee28178931c62535ba1c2b30c72\"\u003e\u003ccode\u003e4fddfab\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/73\"\u003e#73\u003c/a\u003e from pytest-dev/pre-commit-ci-update-config\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/15852c2d1f9178ff960bf6c39a6f0f1495f1009e\"\u003e\u003ccode\u003e15852c2\u003c/code\u003e\u003c/a\u003e [pre-commit.ci] auto fixes from pre-commit.com hooks\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/2e68639c3f41ea5b693f89807172cf304c94fb9e\"\u003e\u003ccode\u003e2e68639\u003c/code\u003e\u003c/a\u003e [pre-commit.ci] pre-commit autoupdate\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/23c9e088a909f16d0d8dc03b5090c66964c428b0\"\u003e\u003ccode\u003e23c9e08\u003c/code\u003e\u003c/a\u003e docs: use parse API in the README example\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/e038536fbee6b5e76b180fce6694fd54661ced12\"\u003e\u003ccode\u003ee038536\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/78\"\u003e#78\u003c/a\u003e from RonnyPfannschmidt/claude/dazzling-einstein-h8zq7m\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/pytest-dev/iniconfig/compare/v2.3.0...v2.3.1\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `librt` from 0.15.0 to 0.16.0\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mypyc/librt/commit/b2508063e86e012301e09432a6d58e74224f1e24\"\u003e\u003ccode\u003eb250806\u003c/code\u003e\u003c/a\u003e Sync mypy and bump version\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/mypyc/librt/compare/v0.15.0...v0.16.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `matplotlib` from 3.10.0 to 3.10.9\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/matplotlib/matplotlib/releases\"\u003ematplotlib's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev3.10.9\u003c/h2\u003e\n\u003cp\u003eThis is a micro release of the v3.10.x series.\nHighlights of this release include:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eVarious minor bug and doc fixes\u003c/li\u003e\n\u003cli\u003eSecurity hardening validation of cyclers - Removing eval usage\u003c/li\u003e\n\u003cli\u003eSecurity hardening in Latex and PS calls - Removing shell escapes\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eREL: v3.10.8\u003c/h2\u003e\n\u003cp\u003eThis is a bugfix release in the 3.10.x series.\u003c/p\u003e\n\u003cp\u003eThe primary highlights of this release are:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eProperly allow freethreaded mode in the MacOS backend\u003c/li\u003e\n\u003cli\u003eBetter error handling for MacOS backend\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eREL: v3.10.7\u003c/h2\u003e\n\u003cp\u003eThis is the latest bugfix release in the 3.10.x series.\u003c/p\u003e\n\u003cp\u003eThe most important update in this release is that the minimum version\nof \u003ccode\u003epyparsing\u003c/code\u003e has been updated to version 3.0.\u003c/p\u003e\n\u003ch2\u003eREL: v3.10.6\u003c/h2\u003e\n\u003cp\u003eThis is a bugfix release in the 3.10.x series.\u003c/p\u003e\n\u003cp\u003eHighlights from this release include:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e- Fix regression of hi-dpi support for Qt\r\n- Fix race condition in TexManager.make_dvi \u0026amp; make_png\r\n- Various documentation and other bugfixes\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2\u003eREL: v3.10.5\u003c/h2\u003e\n\u003cp\u003eThis is the fourth bugfix release of the 3.10.x series.\u003c/p\u003e\n\u003cp\u003eIncluded in this release is distributed wheels for Python 3.14 (including freethreaded) and Windows ARM.\u003c/p\u003e\n\u003cp\u003eThere are also several smaller bugfixes.\u003c/p\u003e\n\u003ch2\u003eREL: v3.10.3\u003c/h2\u003e\n\u003cp\u003eThis is the third bugfix release of the 3.10.x series\u003c/p\u003e\n\u003ch2\u003eREL: v3.10.1\u003c/h2\u003e\n\u003cp\u003eThis is the first bugfix release of the 3.10.x series.\u003c/p\u003e\n\u003cp\u003eThis release contains several bug-fixes and adjustments:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eRespect array alpha with interpolation_stage='rgba' in _Imagebase::_make_image\u003c/li\u003e\n\u003cli\u003eRemove md5 usage to prevent issues on FIPS enabled systems\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/matplotlib/matplotlib/commit/dd8d78b8dce60b6c8db86132892577a0b9dbe469\"\u003e\u003ccode\u003edd8d78b\u003c/code\u003e\u003c/a\u003e REL: v3.10.9\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/matplotlib/matplotlib/commit/2fb18915bcfe69a188832c776fe18d88337de9bc\"\u003e\u003ccode\u003e2fb1891\u003c/code\u003e\u003c/a\u003e REL: Release prep v3.10.9\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/matplotlib/matplotlib/commit/d0e923abfa016c04901fe4e315b9d215949f6fc5\"\u003e\u003ccode\u003ed0e923a\u003c/code\u003e\u003c/a\u003e Merge branch 'v3.10.8-doc' into v3.10.x\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/matplotlib/matplotlib/commit/163793248a5fc9f23a560e45551c44351a8bd716\"\u003e\u003ccode\u003e1637932\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/matplotlib/matplotlib/issues/31558\"\u003e#31558\u003c/a\u003e from meeseeksmachine/auto-backport-of-pr-31556-on-v...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/matplotlib/matplotlib/commit/a83faacb0dbe7edd1bae38e1e715b77b6aaebb84\"\u003e\u003ccode\u003ea83faac\u003c/code\u003e\u003c/a\u003e Backport PR \u003ca href=\"https://redirect.github.com/matplotlib/matplotlib/issues/31556\"\u003e#31556\u003c/a\u003e: FIX: Inverted PyErr_Occurred check in enum type caster (_...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/matplotlib/matplotlib/commit/a4f57ab0623f9d26be29e0a3b0de904667c7eeb7\"\u003e\u003ccode\u003ea4f57ab\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/matplotlib/matplotlib/issues/31545\"\u003e#31545\u003c/a\u003e from ksunden/backport-of-pr-31282-on-v3.10.x\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/matplotlib/matplotlib/commit/063288d0cc912aa2af5cc1b7e7ca3d228d9f8976\"\u003e\u003ccode\u003e063288d\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/matplotlib/matplotlib/issues/31544\"\u003e#31544\u003c/a\u003e from ksunden/backport-of-pr-31248-on-v3.10.x\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/matplotlib/matplotlib/commit/b2ed1969191a03ec8927f96573664474662ab4c1\"\u003e\u003ccode\u003eb2ed196\u003c/code\u003e\u003c/a\u003e Backport PR \u003ca href=\"https://redirect.github.com/matplotlib/matplotlib/issues/31248\"\u003e#31248\u003c/a\u003e: SEC: Remove eval() from validate_cycler\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/matplotlib/matplotlib/commit/acc60241a70b920eaf04fce41a8cf0a77010fb7d\"\u003e\u003ccode\u003eacc6024\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/matplotlib/matplotlib/issues/31282\"\u003e#31282\u003c/a\u003e from scottshambaugh/tex_no_shell\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/matplotlib/matplotlib/commit/e3fb54163b1ce9dbc1a9e8e0973289dc14e366c2\"\u003e\u003ccode\u003ee3fb541\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/matplotlib/matplotlib/issues/31078\"\u003e#31078\u003c/a\u003e from meeseeksmachine/auto-backport-of-pr-31075-on-v...\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/matplotlib/matplotlib/compare/v3.10.0...v3.10.9\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `mypy` from 2.3.1 to 2.4.0\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/python/mypy/blob/master/CHANGELOG.md\"\u003emypy's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003eMypy Release Notes\u003c/h1\u003e\n\u003ch2\u003eNext Release\u003c/h2\u003e\n\u003ch2\u003eMypy 2.4\u003c/h2\u003e\n\u003cp\u003eWe've just uploaded mypy 2.4.0 to the Python Package Index (\u003ca href=\"https://pypi.org/project/mypy/\"\u003ePyPI\u003c/a\u003e).\nMypy is a static type checker for Python. This release includes new features, performance\nimprovements and bug fixes. You can install it as follows:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003epython3 -m pip install -U mypy\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eYou can read the full documentation for this release on \u003ca href=\"http://mypy.readthedocs.io\"\u003eRead the Docs\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003ePython 3.15 Support\u003c/h3\u003e\n\u003cp\u003eMypy 2.4 supports running on Python 3.15 and type checking most Python\n3.15 features. This includes the new builtin \u003ccode\u003esentinel\u003c/code\u003e type for\nsentinel values (PEP 661), which mypy now supports (see below for\ndetails). Lazy imports (PEP 810) and unpacking in comprehensions\n(PEP 798) are also supported. Closed TypedDicts (PEP 728) have been\nsupported since mypy 2.2, but the \u003ccode\u003eextra_items\u003c/code\u003e TypedDict argument,\nalso introduced in PEP 728, is still unsupported. Support for\n\u003ccode\u003eextra_items\u003c/code\u003e will be added in a future mypy release.\u003c/p\u003e\n\u003ch3\u003eNative Parser Enabled by Default\u003c/h3\u003e\n\u003cp\u003eMypy now uses the new native parser by default. It's based on the Ruff\nparser, and it's significantly faster than the legacy parser, which\nuses the stdlib \u003ccode\u003east\u003c/code\u003e module. The native parser also has other\nbenefits:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eYou can target newer Python versions and use recent Python syntax\neven when running mypy on an older Python version. For example, you\ncan use \u003ccode\u003e--python-version 3.15\u003c/code\u003e when running mypy on Python 3.14.\u003c/li\u003e\n\u003cli\u003eStub files can use syntax that is newer than the target Python\nversion. For example, stubs can use the PEP 695 generic class syntax\n(\u003ccode\u003eclass Box[T]: ...\u003c/code\u003e) when running on or targeting Python 3.10.\u003c/li\u003e\n\u003cli\u003eParallel type checking requires the native parser.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe legacy parser is still available through \u003ccode\u003e--no-native-parser\u003c/code\u003e, or\n\u003ccode\u003enative_parser = False\u003c/code\u003e in the config file (\u003ccode\u003enative_parser = false\u003c/code\u003e\nunder \u003ccode\u003e[tool.mypy]\u003c/code\u003e in pyproject.toml). We are planning to remove the\nlegacy parser in early 2027. If you run into a problem with the native\nparser, please report it on the\n\u003ca href=\"https://github.com/python/mypy/issues\"\u003eissue tracker\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eUnlike the legacy parser, the native parser doesn't support type\ncomments for variables defined by \u003ccode\u003efor\u003c/code\u003e and \u003ccode\u003ewith\u003c/code\u003e statements. These\ntype comments are silently ignored, and the types of the variables are\u003c/p\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/935ba8afba7ceacca0651579450c74339f343016\"\u003e\u003ccode\u003e935ba8a\u003c/code\u003e\u003c/a\u003e Bump version to 2.4.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/334a678967dc6bcda3d3f8cb82e253dd61fa2be9\"\u003e\u003ccode\u003e334a678\u003c/code\u003e\u003c/a\u003e Add link for PR 22066 in mypy 2.4 changelog (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22082\"\u003e#22082\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/fe69660bcdaa76cccb1aedbb4b9c1c7627215571\"\u003e\u003ccode\u003efe69660\u003c/code\u003e\u003c/a\u003e Finalize mypy 2.4 changelog (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22080\"\u003e#22080\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/541fd87ac53581fb3c511b277fd780ec4e869c95\"\u003e\u003ccode\u003e541fd87\u003c/code\u003e\u003c/a\u003e Various mypy 2.4 changelog updates (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22077\"\u003e#22077\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/b231182c0b2993918f74594236bda7d3ec6fcbe5\"\u003e\u003ccode\u003eb231182\u003c/code\u003e\u003c/a\u003e Update native parser docs (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22078\"\u003e#22078\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/04fe42ce217f120a4de2c1fd62b71ef77452d699\"\u003e\u003ccode\u003e04fe42c\u003c/code\u003e\u003c/a\u003e Initial Changelog for Mypy 2.4 (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22071\"\u003e#22071\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/06174941bca0e88567441ee3cb0ffaef0dd22e2c\"\u003e\u003ccode\u003e0617494\u003c/code\u003e\u003c/a\u003e Quick fix for non UTF-8 encodings with new parser (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22066\"\u003e#22066\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/b2f9b60eae5ac7cd9c6a60650b128815bb703daf\"\u003e\u003ccode\u003eb2f9b60\u003c/code\u003e\u003c/a\u003e Bump librt to 0.16.0 (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22067\"\u003e#22067\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/9d798dcb9589f9bd62e625a97d8db23ad9a678fa\"\u003e\u003ccode\u003e9d798dc\u003c/code\u003e\u003c/a\u003e Sync typeshed (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22054\"\u003e#22054\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/0861bb6450d6d3658e44dbca9cd2ba478faf3c1d\"\u003e\u003ccode\u003e0861bb6\u003c/code\u003e\u003c/a\u003e Reduce max protocol stack size to 20 (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22053\"\u003e#22053\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/python/mypy/compare/v2.3.1...v2.4.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `nodeenv` from 1.10.0 to 1.11.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/ekalinin/nodeenv/releases\"\u003enodeenv's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e1.11.0\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003ch3\u003eNew Features 🎉\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003efeat(certifi): optionally use certifi certificates by \u003ca href=\"https://github.com/ekalinin\"\u003e\u003ccode\u003e@​ekalinin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/394\"\u003eekalinin/nodeenv#394\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat(nodeenv): accept npm-style semver ranges in --node by \u003ca href=\"https://github.com/ekalinin\"\u003e\u003ccode\u003e@​ekalinin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/393\"\u003eekalinin/nodeenv#393\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat(nodeenv): add --prefer-system to use system node when available by \u003ca href=\"https://github.com/ekalinin\"\u003e\u003ccode\u003e@​ekalinin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/395\"\u003eekalinin/nodeenv#395\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat(nodeenv): add --isolate-npm to keep npm config inside the environment by \u003ca href=\"https://github.com/ekalinin\"\u003e\u003ccode\u003e@​ekalinin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/396\"\u003eekalinin/nodeenv#396\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat(nodeenv): install local packages from a requirements file by \u003ca href=\"https://github.com/ekalinin\"\u003e\u003ccode\u003e@​ekalinin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/407\"\u003eekalinin/nodeenv#407\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat(nodeenv): write the posix activate on Windows for git-bash by \u003ca href=\"https://github.com/ekalinin\"\u003e\u003ccode\u003e@​ekalinin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/409\"\u003eekalinin/nodeenv#409\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eFixed bugs 🐛\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003efix: repair Windows CI (ZipFile.extractall filter, test_smoke layout) by \u003ca href=\"https://github.com/ekalinin\"\u003e\u003ccode\u003e@​ekalinin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/392\"\u003eekalinin/nodeenv#392\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(nodeenv): replace leftover debug print with logger.debug by \u003ca href=\"https://github.com/ekalinin\"\u003e\u003ccode\u003e@​ekalinin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/391\"\u003eekalinin/nodeenv#391\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(nodeenv): stop -p from reinstalling node that is already there by \u003ca href=\"https://github.com/ekalinin\"\u003e\u003ccode\u003e@​ekalinin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/403\"\u003eekalinin/nodeenv#403\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(nodeenv): let -p target a virtualenv nodeenv isn't installed in by \u003ca href=\"https://github.com/ekalinin\"\u003e\u003ccode\u003e@​ekalinin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/402\"\u003eekalinin/nodeenv#402\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(nodeenv): report the url and proxy instead of a traceback by \u003ca href=\"https://github.com/ekalinin\"\u003e\u003ccode\u003e@​ekalinin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/410\"\u003eekalinin/nodeenv#410\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(nodeenv): keep the python virtualenv's scripts under -p on Windows by \u003ca href=\"https://github.com/ekalinin\"\u003e\u003ccode\u003e@​ekalinin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/411\"\u003eekalinin/nodeenv#411\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(nodeenv): report a missing node archive instead of a traceback by \u003ca href=\"https://github.com/ekalinin\"\u003e\u003ccode\u003e@​ekalinin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/412\"\u003eekalinin/nodeenv#412\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(nodeenv): detect musl regardless of the host triplet vendor by \u003ca href=\"https://github.com/ekalinin\"\u003e\u003ccode\u003e@​ekalinin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/413\"\u003eekalinin/nodeenv#413\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(nodeenv): read npm's parseable listing in freeze by \u003ca href=\"https://github.com/ekalinin\"\u003e\u003ccode\u003e@​ekalinin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/414\"\u003eekalinin/nodeenv#414\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix: allow zsh to source bin/activate by \u003ca href=\"https://github.com/r3wretrhy\"\u003e\u003ccode\u003e@​r3wretrhy\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/417\"\u003eekalinin/nodeenv#417\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(nodeenv): link nodejs.exe without mklink by \u003ca href=\"https://github.com/ekalinin\"\u003e\u003ccode\u003e@​ekalinin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/415\"\u003eekalinin/nodeenv#415\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eImprovements 🛠\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eFEAT: Check if activate is called as script. by \u003ca href=\"https://github.com/quazgar\"\u003e\u003ccode\u003e@​quazgar\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/384\"\u003eekalinin/nodeenv#384\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eaddress deprecation warning in tarfile.TarFile.extract all in Python … by \u003ca href=\"https://github.com/nernst\"\u003e\u003ccode\u003e@​nernst\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/380\"\u003eekalinin/nodeenv#380\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(ci): run the activation scripts in sh, dash, bash, zsh and fish by \u003ca href=\"https://github.com/ekalinin\"\u003e\u003ccode\u003e@​ekalinin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/397\"\u003eekalinin/nodeenv#397\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(ci): give the integration smoke tests a home and stop running them 20 times by \u003ca href=\"https://github.com/ekalinin\"\u003e\u003ccode\u003e@​ekalinin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/401\"\u003eekalinin/nodeenv#401\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat(nodeenv): clean \u0026quot;src\u0026quot; directory by default by \u003ca href=\"https://github.com/ekalinin\"\u003e\u003ccode\u003e@​ekalinin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/404\"\u003eekalinin/nodeenv#404\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eDocumentation 📄\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003edocs(readme): document file:// mirrors as a local download source by \u003ca href=\"https://github.com/ekalinin\"\u003e\u003ccode\u003e@​ekalinin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/405\"\u003eekalinin/nodeenv#405\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003edocs(changes): backfill the changelog from 1.3.2 to 1.10.0 by \u003ca href=\"https://github.com/ekalinin\"\u003e\u003ccode\u003e@​ekalinin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/408\"\u003eekalinin/nodeenv#408\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eOther Changes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003echore(release): bump nodeenv version to 1.11.0 by \u003ca href=\"https://github.com/ekalinin\"\u003e\u003ccode\u003e@​ekalinin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/418\"\u003eekalinin/nodeenv#418\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/quazgar\"\u003e\u003ccode\u003e@​quazgar\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/384\"\u003eekalinin/nodeenv#384\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/nernst\"\u003e\u003ccode\u003e@​nernst\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/380\"\u003eekalinin/nodeenv#380\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/r3wretrhy\"\u003e\u003ccode\u003e@​r3wretrhy\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/pull/417\"\u003eekalinin/nodeenv#417\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/ekalinin/nodeenv/compare/1.10.0...1.11.0\"\u003ehttps://github.com/ekalinin/nodeenv/compare/1.10.0...1.11.0\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/ekalinin/nodeenv/blob/master/CHANGES\"\u003enodeenv's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003eVersion 1.11.0\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eFixed zsh \u003ccode\u003esource bin/activate\u003c/code\u003e aborting on the direct-call guard \u003ccode\u003e[#398](https://github.com/ekalinin/nodeenv/issues/398) \u0026lt;https://github.com/ekalinin/nodeenv/issues/398\u0026gt;\u003c/code\u003e_\u003c/li\u003e\n\u003cli\u003eAdded check for how \u003ccode\u003eactivate\u003c/code\u003e is called\n\u003ccode\u003e[#384](https://github.com/ekalinin/nodeenv/issues/384) \u0026lt;https://github.com/ekalinin/nodeenv/pull/384\u0026gt;\u003c/code\u003e_\u003c/li\u003e\n\u003cli\u003eAddressed the \u003ccode\u003etarfile.extractall\u003c/code\u003e deprecation on Python \u0026gt;= 3.12 by\nsetting \u003ccode\u003efilter='data'\u003c/code\u003e, which also prevents writing files via \u0026quot;..\u0026quot; or\nabsolute paths \u003ccode\u003e[#380](https://github.com/ekalinin/nodeenv/issues/380) \u0026lt;https://github.com/ekalinin/nodeenv/pull/380\u0026gt;\u003c/code\u003e_\u003c/li\u003e\n\u003cli\u003eAdded support for Solaris/illumos\n\u003ccode\u003e[#360](https://github.com/ekalinin/nodeenv/issues/360) \u0026lt;https://github.com/ekalinin/nodeenv/issues/360\u0026gt;\u003c/code\u003e_\u003c/li\u003e\n\u003cli\u003eAdded \u003ccode\u003epredeactivate\u003c/code\u003e hooks for Windows\u003c/li\u003e\n\u003cli\u003eAdded error handling and tests for the node installation\n\u003ccode\u003e[#336](https://github.com/ekalinin/nodeenv/issues/336) \u0026lt;https://github.com/ekalinin/nodeenv/issues/336\u0026gt;\u003c/code\u003e_\u003c/li\u003e\n\u003cli\u003eRemoved the leftover debug \u003ccode\u003eprint\u003c/code\u003e that leaked a dict to stdout on every\nversion detection \u003ccode\u003e[#390](https://github.com/ekalinin/nodeenv/issues/390) \u0026lt;https://github.com/ekalinin/nodeenv/issues/390\u0026gt;\u003c/code\u003e_\u003c/li\u003e\n\u003cli\u003eAdded \u003ccode\u003e--with-certifi\u003c/code\u003e to download packages with the certifi certificate\nbundle \u003ccode\u003e[#388](https://github.com/ekalinin/nodeenv/issues/388) \u0026lt;https://github.com/ekalinin/nodeenv/pull/388\u0026gt;\u003c/code\u003e_\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e--node\u003c/code\u003e accepts npm-style semver ranges\n\u003ccode\u003e[#393](https://github.com/ekalinin/nodeenv/issues/393) \u0026lt;https://github.com/ekalinin/nodeenv/pull/393\u0026gt;\u003c/code\u003e_\u003c/li\u003e\n\u003cli\u003eAdded \u003ccode\u003e--prefer-system\u003c/code\u003e to use system-wide node.js when available and\ninstall one otherwise \u003ccode\u003e[#153](https://github.com/ekalinin/nodeenv/issues/153) \u0026lt;https://github.com/ekalinin/nodeenv/issues/153\u0026gt;\u003c/code\u003e_\u003c/li\u003e\n\u003cli\u003eAdded \u003ccode\u003e--isolate-npm\u003c/code\u003e to keep npm cache, userconfig and init-module inside\nthe environment \u003ccode\u003e[#154](https://github.com/ekalinin/nodeenv/issues/154) \u0026lt;https://github.com/ekalinin/nodeenv/issues/154\u0026gt;\u003c/code\u003e_\u003c/li\u003e\n\u003cli\u003eAdded tests that run the activation scripts in sh, dash, bash, zsh and fish.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-p\u003c/code\u003e no longer reinstalls node when the requested version is already in the\nvirtualenv \u003ccode\u003e[#159](https://github.com/ekalinin/nodeenv/issues/159) \u0026lt;https://github.com/ekalinin/nodeenv/issues/159\u0026gt;\u003c/code\u003e_\u003c/li\u003e\n\u003cli\u003eRepeated \u003ccode\u003e-p\u003c/code\u003e runs no longer duplicate the \u003ccode\u003epredeactivate\u003c/code\u003e hook\n\u003ccode\u003e[#159](https://github.com/ekalinin/nodeenv/issues/159) \u0026lt;https://github.com/ekalinin/nodeenv/issues/159\u0026gt;\u003c/code\u003e_\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-p\u003c/code\u003e accepts an optional virtualenv directory and prefers the activated\n\u003ccode\u003eVIRTUAL_ENV\u003c/code\u003e over the virtualenv nodeenv itself is installed in\n\u003ccode\u003e[#156](https://github.com/ekalinin/nodeenv/issues/156) \u0026lt;https://github.com/ekalinin/nodeenv/issues/156\u0026gt;\u003c/code\u003e_\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-r/--requirements\u003c/code\u003e may now be given more than once, and the new\n\u003ccode\u003e--local-requirements\u003c/code\u003e installs the packages of a file locally, into\n\u0026quot;node_modules\u0026quot; of the current directory, which is what \u003ccode\u003efreeze -l\u003c/code\u003e writes.\nUnder npm \u0026lt; 1.0.0, which has no \u003ccode\u003e-g\u003c/code\u003e, a local file is still installed the\nold way \u003ccode\u003e[#206](https://github.com/ekalinin/nodeenv/issues/206) \u0026lt;https://github.com/ekalinin/nodeenv/issues/206\u0026gt;\u003c/code\u003e_\u003c/li\u003e\n\u003cli\u003eThe \u0026quot;src\u0026quot; directory is now removed after installation by default, which\nhalves the size of an environment. Added \u003ccode\u003e--no-clean-src\u003c/code\u003e to keep it: with\n\u003ccode\u003e--source\u003c/code\u003e that is what lets a repeated \u003ccode\u003e--force\u003c/code\u003e build reuse the\ndownloaded source tree\n\u003ccode\u003e[#205](https://github.com/ekalinin/nodeenv/issues/205) \u0026lt;https://github.com/ekalinin/nodeenv/issues/205\u0026gt;\u003c/code\u003e_\u003c/li\u003e\n\u003cli\u003eDocumented that \u003ccode\u003e--mirror\u003c/code\u003e takes a \u003ccode\u003efile://\u003c/code\u003e URL, so a local directory can\nserve as the download source\n\u003ccode\u003e[#193](https://github.com/ekalinin/nodeenv/issues/193) \u0026lt;https://github.com/ekalinin/nodeenv/issues/193\u0026gt;\u003c/code\u003e_\u003c/li\u003e\n\u003cli\u003eThe posix \u003ccode\u003eactivate\u003c/code\u003e is now written on Windows too, into \u0026quot;Scripts\u0026quot;, so\ngit-bash and the other posix shells there can activate an environment\n\u003ccode\u003e[#226](https://github.com/ekalinin/nodeenv/issues/226) \u0026lt;https://github.com/ekalinin/nodeenv/issues/226\u0026gt;\u003c/code\u003e_\u003c/li\u003e\n\u003cli\u003eA download that reaches nothing at all, which a broken \u003ccode\u003ehttp_proxy\u003c/code\u003e or\n\u003ccode\u003ehttps_proxy\u003c/code\u003e usually causes, now reports the url and the proxy settings\ninstead of a traceback\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/ekalinin/nodeenv/commit/e7453580730938674da3e6928cc663cf9faf9e66\"\u003e\u003ccode\u003ee745358\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/ekalinin/nodeenv/issues/418\"\u003e#418\u003c/a\u003e from ekalinin/chore/release-1.11.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/ekalinin/nodeenv/commit/fd19956502f268aeb69757cbee17569ec7adf97a\"\u003e\u003ccode\u003efd19956\u003c/code\u003e\u003c/a\u003e...\n\n_Description has been truncated_\n\n\u003c!-- This is an auto-generated comment: release notes by coderabbit.ai --\u003e\n\n## Summary by CodeRabbit\n\n* **Chores**\n  * Updated development and project tooling versions.\n\n\u003c!-- end of auto-generated comment: release notes by coderabbit.ai --\u003e","html_url":"https://github.com/Sharqascc/graf/pull/125","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/Sharqascc%2Fgraf/issues/125","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/125/packages"}},{"old_version":"21.14.6","new_version":"21.14.7","update_type":"patch","path":null,"pr_created_at":"2026-10-16T02:59:01.000Z","version_change":"21.14.6 → 21.14.7","issue":{"uuid":"5877513074","node_id":"PR_kwDOLfl6cs8AAAABIwnTEw","number":340,"state":"closed","title":"build(deps): bump the python-wheel group across 1 directory with 7 updates","user":"dependabot[bot]","labels":["dependencies","python"],"assignees":[],"locked":false,"comments_count":2,"pull_request":true,"closed_at":"2026-10-16T03:46:08.000Z","author_association":null,"state_reason":null,"created_at":"2026-10-16T02:59:01.000Z","updated_at":"2026-10-16T03:46:18.000Z","time_to_close":2827,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"build(deps): bump","group_name":"python-wheel","update_count":7,"packages":[{"name":"scikit-build-core","old_version":"1.1.0","new_version":"1.1.1","repository_url":"https://github.com/scikit-build/scikit-build-core"},{"name":"filelock","old_version":"3.32.7","new_version":"4.1.1","repository_url":"https://github.com/tox-dev/py-filelock"},{"name":"platformdirs","old_version":"4.12.0","new_version":"4.13.0","repository_url":"https://github.com/tox-dev/platformdirs"},{"name":"mypy","old_version":"2.3.1","new_version":"2.4.0","repository_url":"https://github.com/python/mypy"},{"name":"delvewheel","old_version":"1.13.1","new_version":"1.13.2","repository_url":"https://github.com/adang1345/delvewheel"},{"name":"python-discovery","old_version":"1.6.1","new_version":"1.6.2","repository_url":"https://github.com/tox-dev/python-discovery"},{"name":"virtualenv","old_version":"21.14.6","new_version":"21.14.7","repository_url":"https://github.com/pypa/virtualenv"}],"path":null,"ecosystem":"pip"},"body":"[//]: # (dependabot-start)\n⚠️  **Dependabot is rebasing this PR** ⚠️ \n\nRebasing might not happen immediately, so don't worry if this takes some time.\n\nNote: if you make any changes to this PR yourself, they will take precedence over the rebase.\n\n---\n\n[//]: # (dependabot-end)\n\nBumps the python-wheel group with 7 updates in the /bindings/python directory:\n\n| Package | From | To |\n| --- | --- | --- |\n| [scikit-build-core](https://github.com/scikit-build/scikit-build-core) | `1.1.0` | `1.1.1` |\n| [filelock](https://github.com/tox-dev/py-filelock) | `3.32.7` | `4.1.1` |\n| [platformdirs](https://github.com/tox-dev/platformdirs) | `4.12.0` | `4.13.0` |\n| [mypy](https://github.com/python/mypy) | `2.3.1` | `2.4.0` |\n| [delvewheel](https://github.com/adang1345/delvewheel) | `1.13.1` | `1.13.2` |\n| [python-discovery](https://github.com/tox-dev/python-discovery) | `1.6.1` | `1.6.2` |\n| [virtualenv](https://github.com/pypa/virtualenv) | `21.14.6` | `21.14.7` |\n\n\nUpdates `scikit-build-core` from 1.1.0 to 1.1.1\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/scikit-build/scikit-build-core/releases\"\u003escikit-build-core's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003eVersion 1.1.1\u003c/h2\u003e\n\u003cp\u003eThis patch release improves performance and fixes two minor regressions from 1.1.0. Free-threaded builds work again on CMake versions between 3.30 and 4.1.2 (please update CMake to 4.1.2+, though). A checkout inside an ignored directory is again left out of the SDist. Wheel builds are also faster, especially on Windows, because package sources are no longer copied to a staging directory first.\u003c/p\u003e\n\u003cp\u003eFixes:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eOnly set \u003ccode\u003ePython_FIND_ABI\u003c/code\u003e for free-threaded builds on CMake 4.1.2+, since older versions fail to find \u003ccode\u003eDevelopment.Module\u003c/code\u003e when it is set (\u003ca href=\"https://redirect.github.com/scikit-build/scikit-build-core/issues/1597\"\u003e#1597\u003c/a\u003e) by \u003ca href=\"https://github.com/henryiii\"\u003e\u003ccode\u003e@​henryiii\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/scikit-build/scikit-build-core/issues/1598\"\u003e#1598\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eSDist: a repository boundary that the outer repository ignores is excluded with its full subtree (\u003ca href=\"https://redirect.github.com/scikit-build/scikit-build-core/issues/1593\"\u003e#1593\u003c/a\u003e) by \u003ca href=\"https://github.com/henryiii\"\u003e\u003ccode\u003e@​henryiii\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/scikit-build/scikit-build-core/issues/1594\"\u003e#1594\u003c/a\u003e. Also improves performance.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePerformance:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eWrite package sources directly to wheels without staging copies (\u003ca href=\"https://redirect.github.com/scikit-build/scikit-build-core/issues/1591\"\u003e#1591\u003c/a\u003e) by \u003ca href=\"https://github.com/sepcnt\"\u003e\u003ccode\u003e@​sepcnt\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/scikit-build/scikit-build-core/issues/1592\"\u003e#1592\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI and testing:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSuppress sphinx-llm unknown node warnings by \u003ca href=\"https://github.com/henryiii\"\u003e\u003ccode\u003e@​henryiii\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/scikit-build/scikit-build-core/issues/1595\"\u003e#1595\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUse CMake 4.2 on \u003ccode\u003ewindows-11-arm\u003c/code\u003e by \u003ca href=\"https://github.com/henryiii\"\u003e\u003ccode\u003e@​henryiii\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/scikit-build/scikit-build-core/issues/1590\"\u003e#1590\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/scikit-build/scikit-build-core/compare/v1.1.0...v1.1.1\"\u003ehttps://github.com/scikit-build/scikit-build-core/compare/v1.1.0...v1.1.1\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/scikit-build/scikit-build-core/commit/67040d09985ea5683038943676f31550b5f4faf5\"\u003e\u003ccode\u003e67040d0\u003c/code\u003e\u003c/a\u003e docs: changelog for 1.1.1 (\u003ca href=\"https://redirect.github.com/scikit-build/scikit-build-core/issues/1599\"\u003e#1599\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/scikit-build/scikit-build-core/commit/82de0b82faae0e9cc892b30e05e3e3046eb4b8db\"\u003e\u003ccode\u003e82de0b8\u003c/code\u003e\u003c/a\u003e fix: only set Python_FIND_ABI on CMake 4.1.2+ (\u003ca href=\"https://redirect.github.com/scikit-build/scikit-build-core/issues/1598\"\u003e#1598\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/scikit-build/scikit-build-core/commit/d5866917c0451579daa85be0925504095754a61c\"\u003e\u003ccode\u003ed586691\u003c/code\u003e\u003c/a\u003e fix(sdist): exclude subtree of an ignored repository boundary (\u003ca href=\"https://redirect.github.com/scikit-build/scikit-build-core/issues/1594\"\u003e#1594\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/scikit-build/scikit-build-core/commit/e750d347e460570f6d3e3edeb7b1911c7dfe4535\"\u003e\u003ccode\u003ee750d34\u003c/code\u003e\u003c/a\u003e perf: Write package sources directly to wheels without staging copies (\u003ca href=\"https://redirect.github.com/scikit-build/scikit-build-core/issues/1592\"\u003e#1592\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/scikit-build/scikit-build-core/commit/214286b131d4adc691c95a446f0c363594d3d68f\"\u003e\u003ccode\u003e214286b\u003c/code\u003e\u003c/a\u003e chore(deps): bump the github-actions group with 3 updates (\u003ca href=\"https://redirect.github.com/scikit-build/scikit-build-core/issues/1596\"\u003e#1596\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/scikit-build/scikit-build-core/commit/4b211804ac06f8c903494960dd86d4497ea0c035\"\u003e\u003ccode\u003e4b21180\u003c/code\u003e\u003c/a\u003e docs: suppress sphinx-llm unknown node warnings (\u003ca href=\"https://redirect.github.com/scikit-build/scikit-build-core/issues/1595\"\u003e#1595\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/scikit-build/scikit-build-core/commit/0f65cb1dc0796434e7ab379bf79a99a74c66966d\"\u003e\u003ccode\u003e0f65cb1\u003c/code\u003e\u003c/a\u003e ci: use CMake 4.2 on windows-11-arm (\u003ca href=\"https://redirect.github.com/scikit-build/scikit-build-core/issues/1590\"\u003e#1590\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/scikit-build/scikit-build-core/commit/b43c0e8a0f44d7d825a82193586fb1feea166ab7\"\u003e\u003ccode\u003eb43c0e8\u003c/code\u003e\u003c/a\u003e docs: changelog credit for \u003ca href=\"https://redirect.github.com/scikit-build/scikit-build-core/issues/1587\"\u003e#1587\u003c/a\u003e, regenerate for 1.1 (\u003ca href=\"https://redirect.github.com/scikit-build/scikit-build-core/issues/1589\"\u003e#1589\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/scikit-build/scikit-build-core/compare/v1.1.0...v1.1.1\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `filelock` from 3.32.7 to 4.1.1\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/py-filelock/releases\"\u003efilelock's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e4.1.1\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003efeat(python): default to Python 3.15 by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/816\"\u003etox-dev/filelock#816\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(rw): avoid macOS descriptor lookups by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/820\"\u003etox-dev/filelock#820\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(tests): bound concurrent lock progress by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/819\"\u003etox-dev/filelock#819\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003etest: make lock error checks deterministic by \u003ca href=\"https://github.com/adenzhou1350\"\u003e\u003ccode\u003e@​adenzhou1350\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/817\"\u003etox-dev/filelock#817\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(read-write): reject a hostile pid in _owner_is_gone by \u003ca href=\"https://github.com/dxbjavid\"\u003e\u003ccode\u003e@​dxbjavid\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/821\"\u003etox-dev/filelock#821\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/adenzhou1350\"\u003e\u003ccode\u003e@​adenzhou1350\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/817\"\u003etox-dev/filelock#817\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/tox-dev/filelock/compare/4.1.0...4.1.1\"\u003ehttps://github.com/tox-dev/filelock/compare/4.1.0...4.1.1\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e4.1.0\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eci: download coverage during tool setup by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/776\"\u003etox-dev/filelock#776\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(api): validate timeout and poll_interval bounds by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/781\"\u003etox-dev/filelock#781\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(read-write): accept inf and reject nan timeouts by \u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/779\"\u003etox-dev/filelock#779\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft-rw): ignore non-ASCII generation names by \u003ca href=\"https://github.com/dxbjavid\"\u003e\u003ccode\u003e@​dxbjavid\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/778\"\u003etox-dev/filelock#778\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): check start token in is_lock_held_by_us by \u003ca href=\"https://github.com/lprnmns\"\u003e\u003ccode\u003e@​lprnmns\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/774\"\u003etox-dev/filelock#774\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): clean up marker when rollback close fails by \u003ca href=\"https://github.com/harbinresearcher\"\u003e\u003ccode\u003e@​harbinresearcher\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/775\"\u003etox-dev/filelock#775\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(read-write): clamp waits to threading.TIMEOUT_MAX by \u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/780\"\u003etox-dev/filelock#780\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): treat truncated markers as malformed by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/782\"\u003etox-dev/filelock#782\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(acquire): keep every acquire wait within the timeout by \u003ca href=\"https://github.com/feiiiiii5\"\u003e\u003ccode\u003e@​feiiiiii5\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/777\"\u003etox-dev/filelock#777\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e📝 docs: fix hanging example and platform claims by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/783\"\u003etox-dev/filelock#783\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(unix): keep peer marker on ENOSYS fallback by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/785\"\u003etox-dev/filelock#785\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(async): clear the task hold after a canceled release by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/789\"\u003etox-dev/filelock#789\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e✨ feat(api): export lease types and has_fcntl by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/790\"\u003etox-dev/filelock#790\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(strict): age private records by the filesystem clock by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/792\"\u003etox-dev/filelock#792\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(async): surface executor shutdown as an error by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/793\"\u003etox-dev/filelock#793\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): expire leases on the contender's clock by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/796\"\u003etox-dev/filelock#796\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft-rw): stop an acquire that close() overtook by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/798\"\u003etox-dev/filelock#798\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(strict): record claims before linking them by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/787\"\u003etox-dev/filelock#787\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): restore a live marker a stale break moved aside by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/786\"\u003etox-dev/filelock#786\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(api): chain errors on 3.10 without exceptiongroup by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/788\"\u003etox-dev/filelock#788\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): release a dropped SoftFileLease by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/791\"\u003etox-dev/filelock#791\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(read-write): keep probe fds until the last connection closes by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/794\"\u003etox-dev/filelock#794\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e📦 build(sdist): ship docs and update SECURITY.md by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/812\"\u003etox-dev/filelock#812\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft-rw): survive a removed generation log by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/795\"\u003etox-dev/filelock#795\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): tell PID namespaces apart in the marker host by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/797\"\u003etox-dev/filelock#797\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(async): release from the finalizer and keep I/O off the loop by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/800\"\u003etox-dev/filelock#800\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(strict): name what blocks the lock path by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/804\"\u003etox-dev/filelock#804\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(read-write): reject WAL databases and link beside the db by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/805\"\u003etox-dev/filelock#805\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(read-write): track read depth per thread by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/806\"\u003etox-dev/filelock#806\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): honour mode and tighten marker grammar by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/807\"\u003etox-dev/filelock#807\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🧪 test: drop timing races from two runner-load flakes by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/809\"\u003etox-dev/filelock#809\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/filelock/blob/main/docs/changelog.rst\"\u003efilelock's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e###########\nChangelog\n###########\u003c/p\u003e\n\u003cp\u003e.. towncrier-draft-entries:: Unreleased\u003c/p\u003e\n\u003cp\u003e.. towncrier release notes start\u003c/p\u003e\n\u003chr /\u003e\n\u003cp\u003e4.2.0 (2026-10-14)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eimport filelock\u003c/code\u003e is about twice as fast: lock types other than :class:\u003ccode\u003e~filelock.FileLock\u003c/code\u003e load on first use. :pr:\u003ccode\u003e831\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eFix :class:\u003ccode\u003e~filelock.StrictSoftFileLock\u003c/code\u003e raising :class:\u003ccode\u003e~filelock.SoftFileLockProtocolError\u003c/code\u003e on Windows when a\ncontender read a claim whose owner was still finishing its unlink. :pr:\u003ccode\u003e829\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.1.2 (2026-10-14)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eFix read-lock acquisition on SQLite versions older than 3.33.0 by using \u003ccode\u003esqlite_master\u003c/code\u003e for the schema probe. :pr:\u003ccode\u003e770\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eRaise \u003ccode\u003eIsADirectoryError\u003c/code\u003e (or \u003ccode\u003ePermissionError\u003c/code\u003e on Windows) for a directory lock path regardless of its write\npermissions. :pr:\u003ccode\u003e822\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eFix a forked child hanging at exit on PyPy when the parent forked while an\n:class:\u003ccode\u003e~filelock.AsyncReadWriteLock\u003c/code\u003e worker thread was between two operations. :pr:\u003ccode\u003e828\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eHash all cache keys in the lock filename recipe so short path-like keys stay in the chosen directory. The example also\naccepts path-derived surrogate escapes and works before the cache directory exists. :pr:\u003ccode\u003e824\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.1.1 (2026-10-11)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eBound the shared-lock contention test by worker progress so slow CI machines can finish the workload. :pr:\u003ccode\u003e819\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eAvoid the macOS \u003ccode\u003e/dev/fd\u003c/code\u003e lookup implicated in a kernel panic by opening SQLite through a validated hard link.\nThe database directory must be writable and support hard links; alias creation failure raises \u003ccode\u003eOSError\u003c/code\u003e. :pr:\u003ccode\u003e820\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eIgnore non-ASCII PID or start-time fields and out-of-range PIDs in \u003ccode\u003eReadWriteLock\u003c/code\u003e hard-link directory names so forged\nowners cannot abort acquisition. :pr:\u003ccode\u003e821\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eUse Python 3.15 for development and automation. :pr:\u003ccode\u003e816\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.1.0 (2026-10-09)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eImport :data:\u003ccode\u003e~filelock.OwnerMode\u003c/code\u003e, :data:\u003ccode\u003e~filelock.CompromiseReason\u003c/code\u003e and :data:\u003ccode\u003e~filelock.has_fcntl\u003c/code\u003e from\n\u003ccode\u003efilelock\u003c/code\u003e. :pr:\u003ccode\u003e790\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:class:\u003ccode\u003e~filelock.AcquireReturnProxy\u003c/code\u003e is generic in the lock type, so \u003ccode\u003ewith lock.acquire() as held:\u003c/code\u003e types \u003ccode\u003eheld\u003c/code\u003e as\nthe lock's own class. :pr:\u003ccode\u003e803\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eA :class:\u003ccode\u003e~filelock.Timeout\u003c/code\u003e from a soft lock names a holder on another host or in another PID namespace, which no\ncontender ever reclaims. :pr:\u003ccode\u003e815\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:attr:\u003ccode\u003e~filelock.SoftFileLock.is_lock_held_by_us\u003c/code\u003e and :attr:\u003ccode\u003e~filelock.MarkerSoftFileLock.is_lock_held_by_us\u003c/code\u003e return\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/5830a7e2c39d387ae5320bb3be1fbb2aa7742d4a\"\u003e\u003ccode\u003e5830a7e\u003c/code\u003e\u003c/a\u003e Release 4.1.1\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/a5fb607a8655035bb6d5ae4326637e25cf1af849\"\u003e\u003ccode\u003ea5fb607\u003c/code\u003e\u003c/a\u003e fix(read-write): reject a hostile pid in _owner_is_gone (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/821\"\u003e#821\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/4c6f32f2797b2883bbcb0cca1ee81211d3e09c12\"\u003e\u003ccode\u003e4c6f32f\u003c/code\u003e\u003c/a\u003e test: make lock error checks deterministic (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/817\"\u003e#817\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/f11f52357425943a6dbffd36ea1112726255f970\"\u003e\u003ccode\u003ef11f523\u003c/code\u003e\u003c/a\u003e fix(tests): bound concurrent lock progress (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/819\"\u003e#819\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/5fd0c8f2e6a778da1933204e4a95bd84db9cdd43\"\u003e\u003ccode\u003e5fd0c8f\u003c/code\u003e\u003c/a\u003e fix(rw): avoid macOS descriptor lookups (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/820\"\u003e#820\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/0c3aaabc75ca927b2530b7264a04b965d64acf55\"\u003e\u003ccode\u003e0c3aaab\u003c/code\u003e\u003c/a\u003e feat(python): default to Python 3.15 (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/816\"\u003e#816\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/6c0ecc28f898f08cd0438cd489c3eaabad79a4b7\"\u003e\u003ccode\u003e6c0ecc2\u003c/code\u003e\u003c/a\u003e Release 4.1.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/df06bbd640765ad3f1ed4a096cbe29e64b5592bb\"\u003e\u003ccode\u003edf06bbd\u003c/code\u003e\u003c/a\u003e 🐛 fix: close regressions since 4.0.12 (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/815\"\u003e#815\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/071204515d211b560d203cb68105ec06789eab46\"\u003e\u003ccode\u003e0712045\u003c/code\u003e\u003c/a\u003e 🐛 fix(read-write): refuse a database moved mid-acquire (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/808\"\u003e#808\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/73fefc1e907457dd9bc9793eeba52f183d7f9c40\"\u003e\u003ccode\u003e73fefc1\u003c/code\u003e\u003c/a\u003e 📝 docs: point canonical and og:url at versioned pages (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/813\"\u003e#813\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/tox-dev/py-filelock/compare/3.32.7...4.1.1\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `platformdirs` from 4.12.0 to 4.13.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/platformdirs/releases\"\u003eplatformdirs's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e4.13.0\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003efix: recognize Homebrew Cellar framework prefixes by \u003ca href=\"https://github.com/sricharanreddycheruku\"\u003e\u003ccode\u003e@​sricharanreddycheruku\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/612\"\u003etox-dev/platformdirs#612\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat(python): require 3.11 and default to 3.15 by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/613\"\u003etox-dev/platformdirs#613\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/sricharanreddycheruku\"\u003e\u003ccode\u003e@​sricharanreddycheruku\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/612\"\u003etox-dev/platformdirs#612\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/tox-dev/platformdirs/compare/4.12.4...4.13.0\"\u003ehttps://github.com/tox-dev/platformdirs/compare/4.12.4...4.13.0\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e4.12.4\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eci: download coverage during tool setup by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/609\"\u003etox-dev/platformdirs#609\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(api): keep root's site dir readable in place_*_file by \u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/610\"\u003etox-dev/platformdirs#610\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix: fall back from unreachable runtime directory with ensure_exists by \u003ca href=\"https://github.com/harbinresearcher\"\u003e\u003ccode\u003e@​harbinresearcher\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/611\"\u003etox-dev/platformdirs#611\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/harbinresearcher\"\u003e\u003ccode\u003e@​harbinresearcher\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/611\"\u003etox-dev/platformdirs#611\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/tox-dev/platformdirs/compare/4.12.3...4.12.4\"\u003ehttps://github.com/tox-dev/platformdirs/compare/4.12.3...4.12.4\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e4.12.3\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003ePlace root config and data files in the first site directory by \u003ca href=\"https://github.com/PDGGK\"\u003e\u003ccode\u003e@​PDGGK\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/607\"\u003etox-dev/platformdirs#607\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/PDGGK\"\u003e\u003ccode\u003e@​PDGGK\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/607\"\u003etox-dev/platformdirs#607\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/tox-dev/platformdirs/compare/4.12.2...4.12.3\"\u003ehttps://github.com/tox-dev/platformdirs/compare/4.12.2...4.12.3\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e4.12.2\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e🐛 fix(api): build site paths from site lists by \u003ca href=\"https://github.com/9Kun\"\u003e\u003ccode\u003e@​9Kun\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/604\"\u003etox-dev/platformdirs#604\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e♻️ refactor(api): share use_site iteration by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/606\"\u003etox-dev/platformdirs#606\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/9Kun\"\u003e\u003ccode\u003e@​9Kun\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/604\"\u003etox-dev/platformdirs#604\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/tox-dev/platformdirs/compare/4.12.1...4.12.2\"\u003ehttps://github.com/tox-dev/platformdirs/compare/4.12.1...4.12.2\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e4.12.1\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/platformdirs/blob/main/docs/changelog.rst\"\u003eplatformdirs's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e###########\nChangelog\n###########\u003c/p\u003e\n\u003cp\u003e.. towncrier-draft-entries:: Unreleased\u003c/p\u003e\n\u003cp\u003e.. towncrier release notes start\u003c/p\u003e\n\u003chr /\u003e\n\u003cp\u003e4.13.3 (2026-10-16)\u003c/p\u003e\n\u003chr /\u003e\n\u003chr /\u003e\n\u003cp\u003e4.13.2 (2026-10-16)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eNormalize \u003ccode\u003euser_fonts_dir\u003c/code\u003e when \u003ccode\u003eXDG_DATA_HOME\u003c/code\u003e ends with a separator. :pr:\u003ccode\u003e619\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.13.1 (2026-10-15)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eFree the path buffer from \u003ccode\u003eSHGetKnownFolderPath\u003c/code\u003e when the known-folder lookup fails. :pr:\u003ccode\u003e618\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003ePreserve literal backslashes before ordinary characters in double-quoted \u003ccode\u003euser-dirs.dirs\u003c/code\u003e paths instead of removing\nthem.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.13.0 (2026-10-10)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eDetect Homebrew Python for the :class:\u003ccode\u003e~platformdirs.macos.MacOS\u003c/code\u003e site directories under :option:\u003ccode\u003epython:-S\u003c/code\u003e, which\nleaves :data:\u003ccode\u003esys.base_prefix\u003c/code\u003e on the \u003ccode\u003eCellar\u003c/code\u003e keg, and for the \u003ccode\u003epython-freethreading\u003c/code\u003e formula - by\n:user:\u003ccode\u003esricharanreddycheruku\u003c/code\u003e. :pr:\u003ccode\u003e612\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eUse Python 3.15 for development and automation. :pr:\u003ccode\u003e613\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.12.4 (2026-10-07)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eKeep site directories readable by other users when root calls\n:meth:\u003ccode\u003e~platformdirs.api.PlatformDirsABC.place_config_file\u003c/code\u003e or another \u003ccode\u003eplace_*_file\u003c/code\u003e method with\n:attr:\u003ccode\u003e~platformdirs.api.PlatformDirsABC.use_site_for_root\u003c/code\u003e - by :user:\u003ccode\u003edarrenhuai\u003c/code\u003e. :pr:\u003ccode\u003e610\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eMake :func:\u003ccode\u003e~platformdirs.user_runtime_dir\u003c/code\u003e warn and fall back from an unreachable \u003ccode\u003eXDG_RUNTIME_DIR\u003c/code\u003e under\n:attr:\u003ccode\u003e~platformdirs.api.PlatformDirsABC.ensure_exists\u003c/code\u003e instead of raising. :pr:\u003ccode\u003e611\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.12.3 (2026-10-03)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003ePlace files from \u003ccode\u003eplace_config_file\u003c/code\u003e and \u003ccode\u003eplace_data_file\u003c/code\u003e in the first site directory for root on Unix with\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/f05fb4ef31f38dfc316802c5301db972fd75468e\"\u003e\u003ccode\u003ef05fb4e\u003c/code\u003e\u003c/a\u003e Release 4.13.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/b3174fdd4e80c83d72cf723fd2a7bb6cb54cbd5f\"\u003e\u003ccode\u003eb3174fd\u003c/code\u003e\u003c/a\u003e feat(python): require 3.11 and default to 3.15 (\u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/issues/613\"\u003e#613\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/d7eb4fe34231df80a6b1c7abc362aa504feddbf1\"\u003e\u003ccode\u003ed7eb4fe\u003c/code\u003e\u003c/a\u003e fix: recognize Homebrew Cellar framework prefixes (\u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/issues/612\"\u003e#612\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/19338a4fdfc0cdd6b5342ec137efd9e5613d67d2\"\u003e\u003ccode\u003e19338a4\u003c/code\u003e\u003c/a\u003e Release 4.12.4\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/f2a4fa944f3637c8e7aa1fe8e95c9adfefe8ed2c\"\u003e\u003ccode\u003ef2a4fa9\u003c/code\u003e\u003c/a\u003e fix: fall back from unreachable runtime directory with ensure_exists (\u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/issues/611\"\u003e#611\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/16429e2135fa70b314ef69fa7da4d5e746eb75c9\"\u003e\u003ccode\u003e16429e2\u003c/code\u003e\u003c/a\u003e 🐛 fix(api): keep root's site dir readable in place_*_file (\u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/issues/610\"\u003e#610\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/b9735d3c9f4a0b5ca4dafc15b53541fe3973f453\"\u003e\u003ccode\u003eb9735d3\u003c/code\u003e\u003c/a\u003e ci: download coverage during tool setup (\u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/issues/609\"\u003e#609\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/344f2497bce1fba7838ef112f2bd91e9d5f23b58\"\u003e\u003ccode\u003e344f249\u003c/code\u003e\u003c/a\u003e [pre-commit.ci] pre-commit autoupdate (\u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/issues/608\"\u003e#608\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/960ff632eb575deb6f0d5bf49519d5a2ee2098b6\"\u003e\u003ccode\u003e960ff63\u003c/code\u003e\u003c/a\u003e Release 4.12.3\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/8047ad5bf0e5fd3db9c8ce9f250f73c3d961fe19\"\u003e\u003ccode\u003e8047ad5\u003c/code\u003e\u003c/a\u003e Place root config and data files in the first site directory (\u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/issues/607\"\u003e#607\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/tox-dev/platformdirs/compare/4.12.0...4.13.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `mypy` from 2.3.1 to 2.4.0\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/python/mypy/blob/master/CHANGELOG.md\"\u003emypy's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003eMypy Release Notes\u003c/h1\u003e\n\u003ch2\u003eNext Release\u003c/h2\u003e\n\u003ch2\u003eMypy 2.4\u003c/h2\u003e\n\u003cp\u003eWe've just uploaded mypy 2.4.0 to the Python Package Index (\u003ca href=\"https://pypi.org/project/mypy/\"\u003ePyPI\u003c/a\u003e).\nMypy is a static type checker for Python. This release includes new features, performance\nimprovements and bug fixes. You can install it as follows:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003epython3 -m pip install -U mypy\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eYou can read the full documentation for this release on \u003ca href=\"http://mypy.readthedocs.io\"\u003eRead the Docs\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003ePython 3.15 Support\u003c/h3\u003e\n\u003cp\u003eMypy 2.4 supports running on Python 3.15 and type checking most Python\n3.15 features. This includes the new builtin \u003ccode\u003esentinel\u003c/code\u003e type for\nsentinel values (PEP 661), which mypy now supports (see below for\ndetails). Lazy imports (PEP 810) and unpacking in comprehensions\n(PEP 798) are also supported. Closed TypedDicts (PEP 728) have been\nsupported since mypy 2.2, but the \u003ccode\u003eextra_items\u003c/code\u003e TypedDict argument,\nalso introduced in PEP 728, is still unsupported. Support for\n\u003ccode\u003eextra_items\u003c/code\u003e will be added in a future mypy release.\u003c/p\u003e\n\u003ch3\u003eNative Parser Enabled by Default\u003c/h3\u003e\n\u003cp\u003eMypy now uses the new native parser by default. It's based on the Ruff\nparser, and it's significantly faster than the legacy parser, which\nuses the stdlib \u003ccode\u003east\u003c/code\u003e module. The native parser also has other\nbenefits:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eYou can target newer Python versions and use recent Python syntax\neven when running mypy on an older Python version. For example, you\ncan use \u003ccode\u003e--python-version 3.15\u003c/code\u003e when running mypy on Python 3.14.\u003c/li\u003e\n\u003cli\u003eStub files can use syntax that is newer than the target Python\nversion. For example, stubs can use the PEP 695 generic class syntax\n(\u003ccode\u003eclass Box[T]: ...\u003c/code\u003e) when running on or targeting Python 3.10.\u003c/li\u003e\n\u003cli\u003eParallel type checking requires the native parser.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe legacy parser is still available through \u003ccode\u003e--no-native-parser\u003c/code\u003e, or\n\u003ccode\u003enative_parser = False\u003c/code\u003e in the config file (\u003ccode\u003enative_parser = false\u003c/code\u003e\nunder \u003ccode\u003e[tool.mypy]\u003c/code\u003e in pyproject.toml). We are planning to remove the\nlegacy parser in early 2027. If you run into a problem with the native\nparser, please report it on the\n\u003ca href=\"https://github.com/python/mypy/issues\"\u003eissue tracker\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eUnlike the legacy parser, the native parser doesn't support type\ncomments for variables defined by \u003ccode\u003efor\u003c/code\u003e and \u003ccode\u003ewith\u003c/code\u003e statements. These\ntype comments are silently ignored, and the types of the variables are\u003c/p\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/935ba8afba7ceacca0651579450c74339f343016\"\u003e\u003ccode\u003e935ba8a\u003c/code\u003e\u003c/a\u003e Bump version to 2.4.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/334a678967dc6bcda3d3f8cb82e253dd61fa2be9\"\u003e\u003ccode\u003e334a678\u003c/code\u003e\u003c/a\u003e Add link for PR 22066 in mypy 2.4 changelog (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22082\"\u003e#22082\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/fe69660bcdaa76cccb1aedbb4b9c1c7627215571\"\u003e\u003ccode\u003efe69660\u003c/code\u003e\u003c/a\u003e Finalize mypy 2.4 changelog (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22080\"\u003e#22080\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/541fd87ac53581fb3c511b277fd780ec4e869c95\"\u003e\u003ccode\u003e541fd87\u003c/code\u003e\u003c/a\u003e Various mypy 2.4 changelog updates (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22077\"\u003e#22077\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/b231182c0b2993918f74594236bda7d3ec6fcbe5\"\u003e\u003ccode\u003eb231182\u003c/code\u003e\u003c/a\u003e Update native parser docs (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22078\"\u003e#22078\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/04fe42ce217f120a4de2c1fd62b71ef77452d699\"\u003e\u003ccode\u003e04fe42c\u003c/code\u003e\u003c/a\u003e Initial Changelog for Mypy 2.4 (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22071\"\u003e#22071\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/06174941bca0e88567441ee3cb0ffaef0dd22e2c\"\u003e\u003ccode\u003e0617494\u003c/code\u003e\u003c/a\u003e Quick fix for non UTF-8 encodings with new parser (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22066\"\u003e#22066\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/b2f9b60eae5ac7cd9c6a60650b128815bb703daf\"\u003e\u003ccode\u003eb2f9b60\u003c/code\u003e\u003c/a\u003e Bump librt to 0.16.0 (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22067\"\u003e#22067\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/9d798dcb9589f9bd62e625a97d8db23ad9a678fa\"\u003e\u003ccode\u003e9d798dc\u003c/code\u003e\u003c/a\u003e Sync typeshed (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22054\"\u003e#22054\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/0861bb6450d6d3658e44dbca9cd2ba478faf3c1d\"\u003e\u003ccode\u003e0861bb6\u003c/code\u003e\u003c/a\u003e Reduce max protocol stack size to 20 (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22053\"\u003e#22053\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/python/mypy/compare/v2.3.1...v2.4.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `delvewheel` from 1.13.1 to 1.13.2\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/adang1345/delvewheel/blob/master/CHANGELOG.md\"\u003edelvewheel's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e1.13.2 \u003c!-- raw HTML omitted --\u003e\u003c!-- raw HTML omitted --\u003e(\u003cem\u003e9 October 2026\u003c/em\u003e)\u003c!-- raw HTML omitted --\u003e\u003c!-- raw HTML omitted --\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eWrite wheel metadata files in UTF-8 regardless of locale.\u003c/li\u003e\n\u003cli\u003eAdd Python 3.15 to trove classifiers.\u003c/li\u003e\n\u003cli\u003eUpdate GitHub Actions.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/adang1345/delvewheel/commits\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `python-discovery` from 1.6.1 to 1.6.2\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/python-discovery/releases\"\u003epython-discovery's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev1.6.2\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003efix: ignore broken sphinx-llm release by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/pull/134\"\u003etox-dev/python-discovery#134\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e👷 ci: pin ubuntu-26.04 and bump dependencies by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/pull/138\"\u003etox-dev/python-discovery#138\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eci: run old Python checks in parallel by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/pull/140\"\u003etox-dev/python-discovery#140\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat(python): default to 3.15 and match virtualenv by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/pull/142\"\u003etox-dev/python-discovery#142\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(cache): discard unusable interpreter cache entries by \u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/pull/141\"\u003etox-dev/python-discovery#141\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(query): validate PY_DISCOVERY_TIMEOUT by \u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/pull/143\"\u003etox-dev/python-discovery#143\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/pull/141\"\u003etox-dev/python-discovery#141\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/tox-dev/python-discovery/compare/1.6.1...1.6.2\"\u003ehttps://github.com/tox-dev/python-discovery/compare/1.6.1...1.6.2\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/python-discovery/blob/main/docs/changelog.rst\"\u003epython-discovery's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003eBug fixes - 1.6.2\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eDiscard malformed interpreter cache entries and query the interpreter again, including entries with missing,\nnon-string or unusable \u003ccode\u003esystem_executable\u003c/code\u003e paths - by :user:\u003ccode\u003edarrenhuai\u003c/code\u003e. (:issue:\u003ccode\u003e141\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eUse the default interpreter query timeout and warn for invalid \u003ccode\u003ePY_DISCOVERY_TIMEOUT\u003c/code\u003e values. Accept \u003ccode\u003einf\u003c/code\u003e\nor values above the subprocess wait limit to disable the timeout - by :user:\u003ccode\u003edarrenhuai\u003c/code\u003e. (:issue:\u003ccode\u003e143\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003ev1.6.1 (2026-09-18)\u003c/p\u003e\n\u003chr /\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/4fe2ade736e5191de42ca3d4a0b8bf672ffc5652\"\u003e\u003ccode\u003e4fe2ade\u003c/code\u003e\u003c/a\u003e release 1.6.2\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/60ddef109aafdd6d54aa25c8057a569c76e3dba2\"\u003e\u003ccode\u003e60ddef1\u003c/code\u003e\u003c/a\u003e fix(query): validate PY_DISCOVERY_TIMEOUT (\u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/issues/143\"\u003e#143\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/eb1eab726924245c533ad867d1b4bcc4c47b6d2a\"\u003e\u003ccode\u003eeb1eab7\u003c/code\u003e\u003c/a\u003e fix(cache): discard unusable interpreter cache entries (\u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/issues/141\"\u003e#141\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/db810b8206339892c0cd15f000b8e18860a8b913\"\u003e\u003ccode\u003edb810b8\u003c/code\u003e\u003c/a\u003e feat(python): default to 3.15 and match virtualenv (\u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/issues/142\"\u003e#142\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/614afa4adaa5fb36daf38919e3c407af71f3260b\"\u003e\u003ccode\u003e614afa4\u003c/code\u003e\u003c/a\u003e ci: run old Python checks in parallel (\u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/issues/140\"\u003e#140\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/9148aa454b276b5745d56bb2a42bdc8f26ee7f55\"\u003e\u003ccode\u003e9148aa4\u003c/code\u003e\u003c/a\u003e [pre-commit.ci] pre-commit autoupdate (\u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/issues/139\"\u003e#139\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/a69c0d9139ff0f1276d318d75d25d59cbc172bf4\"\u003e\u003ccode\u003ea69c0d9\u003c/code\u003e\u003c/a\u003e 👷 ci: pin ubuntu-26.04 and bump dependencies (\u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/issues/138\"\u003e#138\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/c8fcbf599ac401c8b1ad793187b28e45ccd1ffc8\"\u003e\u003ccode\u003ec8fcbf5\u003c/code\u003e\u003c/a\u003e build(deps): bump astral-sh/setup-uv from 10.1.0 to 10.2.0 in the github-acti...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/f0b3a2030c57a4f9217cd6ab09f837123ad0bc17\"\u003e\u003ccode\u003ef0b3a20\u003c/code\u003e\u003c/a\u003e [pre-commit.ci] pre-commit autoupdate (\u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/issues/136\"\u003e#136\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/b4eea32e584c0c1f08c9ad4b9f5850cb8c2275da\"\u003e\u003ccode\u003eb4eea32\u003c/code\u003e\u003c/a\u003e build(deps): bump astral-sh/setup-uv from 10.0.1 to 10.1.0 in the github-acti...\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/tox-dev/python-discovery/compare/1.6.1...1.6.2\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `virtualenv` from 21.14.6 to 21.14.7\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pypa/virtualenv/releases\"\u003evirtualenv's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e21.14.7\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eUpgrade embedded pip/setuptools/wheel and CI test tools by \u003ca href=\"https://github.com/github-actions\"\u003e\u003ccode\u003e@​github-actions\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3385\"\u003epypa/virtualenv#3385\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🧪 test(seed): verify periodic update scheduling by \u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3384\"\u003epypa/virtualenv#3384\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat(python): default to Python 3.15 by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3386\"\u003epypa/virtualenv#3386\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🔧 chore: enroll in Anthropic OSS Scanner by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3387\"\u003epypa/virtualenv#3387\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🧪 test(util): skip safe_delete permission tests as root by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3389\"\u003epypa/virtualenv#3389\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e📝 docs(security): add an email reporting contact by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3388\"\u003epypa/virtualenv#3388\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(activation): escape the bash prompt for both PS1 passes by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3390\"\u003epypa/virtualenv#3390\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🧪 test(activation): undo both bash prompt passes on bash \u0026lt; 4.4 by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3392\"\u003epypa/virtualenv#3392\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🔧 build(release): bump pydantic for 3.15 wheels by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3391\"\u003epypa/virtualenv#3391\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.14.6...21.14.7\"\u003ehttps://github.com/pypa/virtualenv/compare/21.14.6...21.14.7\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pypa/virtualenv/blob/main/docs/changelog.rst\"\u003evirtualenv's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003eBugfixes - 21.14.7\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eEscape the environment name in the bash activator for both of bash's \u003ccode\u003ePS1\u003c/code\u003e passes, so a name or \u003ccode\u003e--prompt\u003c/code\u003e value\nwith a backslash before \u003ccode\u003e$(...)\u003c/code\u003e or backticks no longer runs as a command each time bash draws the prompt - by\n:user:\u003ccode\u003egaborbernat\u003c/code\u003e. (:issue:\u003ccode\u003e3390\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003ev21.14.6 (2026-10-08)\u003c/p\u003e\n\u003chr /\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/a857a7823c73c35935d0318b4f36e5d582691e1c\"\u003e\u003ccode\u003ea857a78\u003c/code\u003e\u003c/a\u003e release 21.14.7\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/4004d884fa22a4fe30fd9f1d8336eec52a796730\"\u003e\u003ccode\u003e4004d88\u003c/code\u003e\u003c/a\u003e 🔧 build(release): bump pydantic for 3.15 wheels (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3391\"\u003e#3391\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/212f69fb905371aed4d67fcb2ac194492f417d5b\"\u003e\u003ccode\u003e212f69f\u003c/code\u003e\u003c/a\u003e 🧪 test(activation): undo both bash prompt passes on bash \u0026lt; 4.4 (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3392\"\u003e#3392\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/c3104e02474b652832a9bbaae79f6e1696296932\"\u003e\u003ccode\u003ec3104e0\u003c/code\u003e\u003c/a\u003e 🐛 fix(activation): escape the bash prompt for both PS1 passes (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3390\"\u003e#3390\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/f29efc45c063e08e02527d211c41b24a3eefe0d3\"\u003e\u003ccode\u003ef29efc4\u003c/code\u003e\u003c/a\u003e 📝 docs(security): add an email reporting contact (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3388\"\u003e#3388\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/c26cc297e2291f76a72a925fa83100f827c5c8eb\"\u003e\u003ccode\u003ec26cc29\u003c/code\u003e\u003c/a\u003e 🧪 test(util): skip safe_delete permission tests as root (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3389\"\u003e#3389\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/8b21c36b4c56bd3bea41171fa513289c503efd97\"\u003e\u003ccode\u003e8b21c36\u003c/code\u003e\u003c/a\u003e 🔧 chore: enroll in Anthropic OSS Scanner (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3387\"\u003e#3387\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/bf09c7eb62246c19c2cfd0a179c5edcc14801397\"\u003e\u003ccode\u003ebf09c7e\u003c/code\u003e\u003c/a\u003e feat(python): default to Python 3.15 (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3386\"\u003e#3386\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/3f077928210afa4ec2cca456f4c587460b40bfc5\"\u003e\u003ccode\u003e3f07792\u003c/code\u003e\u003c/a\u003e 🧪 test(seed): verify periodic update scheduling (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3384\"\u003e#3384\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/7614b02375239b36090a53ce0f52a7086fbb6766\"\u003e\u003ccode\u003e7614b02\u003c/code\u003e\u003c/a\u003e Upgrade embedded pip/setuptools/wheel and CI test tools (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3385\"\u003e#3385\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.14.6...21.14.7\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore \u003cdependency name\u003e major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself)\n- `@dependabot ignore \u003cdependency name\u003e minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself)\n- `@dependabot ignore \u003cdependency name\u003e` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself)\n- `@dependabot unignore \u003cdependency name\u003e` will remove all of the ignore conditions of the specified dependency\n- `@dependabot unignore \u003cdependency name\u003e \u003cignore condition\u003e` will remove the ignore condition of the specified dependency and ignore conditions\n\n\n\u003c/details\u003e","html_url":"https://github.com/0xf3cd/celestial-calendar/pull/340","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/0xf3cd%2Fcelestial-calendar/issues/340","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/340/packages"}},{"old_version":"21.11.1","new_version":"21.12.0","update_type":"minor","path":null,"pr_created_at":"2026-10-15T05:02:48.000Z","version_change":"21.11.1 → 21.12.0","issue":{"uuid":"5860418779","node_id":"PR_kwDOC9SUl88AAAABIi71KQ","number":182,"state":"open","title":"build(deps-dev): bump virtualenv from 21.11.1 to 21.12.0","user":"dependabot[bot]","labels":["dependencies","python"],"assignees":[],"locked":false,"comments_count":1,"pull_request":true,"closed_at":null,"author_association":null,"state_reason":null,"created_at":"2026-10-15T05:02:48.000Z","updated_at":"2026-10-15T05:03:17.000Z","time_to_close":null,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"build(deps-dev)","packages":[{"name":"virtualenv","old_version":"21.11.1","new_version":"21.12.0","repository_url":"https://github.com/pypa/virtualenv"}],"path":null,"ecosystem":"pip"},"body":"Bumps [virtualenv](https://github.com/pypa/virtualenv) from 21.11.1 to 21.12.0.\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pypa/virtualenv/releases\"\u003evirtualenv's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e21.12.0\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e✨ feat(create): point a .venv redirect per PEP 832 by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3204\"\u003epypa/virtualenv#3204\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.11.1...21.12.0\"\u003ehttps://github.com/pypa/virtualenv/compare/21.11.1...21.12.0\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pypa/virtualenv/blob/main/docs/changelog.rst\"\u003evirtualenv's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003eFeatures - 21.12.0\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eWrite the \u003ccode\u003ePEP 838 \u0026lt;https://peps.python.org/pep-0838/\u0026gt;\u003c/code\u003e_ \u003ccode\u003epython-version\u003c/code\u003e key into \u003ccode\u003epyvenv.cfg\u003c/code\u003e, holding the\ntarget interpreter's feature release. The new :doc:\u003ccode\u003ereference/files\u003c/code\u003e page covers it alongside every other file a\ncreated environment holds - by :user:\u003ccode\u003ekonstin\u003c/code\u003e. (:issue:\u003ccode\u003e3193\u003c/code\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ePoint a \u003ccode\u003e.venv\u003c/code\u003e redirect file in the parent folder at the created environment, per \u003ccode\u003ePEP 832 \u0026lt;https://peps.python.org/pep-0832/\u0026gt;\u003c/code\u003e_, so editors and type checkers can find it - by :user:\u003ccode\u003egaborbernat\u003c/code\u003e.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003evirtualenv leaves a \u003ccode\u003e.venv\u003c/code\u003e folder alone, and a redirect pointing at an environment it did not create.\u003c/li\u003e\n\u003cli\u003ePass \u003ccode\u003e--no-venv-redirect\u003c/code\u003e to opt out.\u003c/li\u003e\n\u003cli\u003eThe feature is provisional while PEP 832 is a draft: a minor or patch release may change it in backward incompatible\nways to follow the PEP. (:issue:\u003ccode\u003e3204\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003ev21.11.1 (2026-09-23)\u003c/p\u003e\n\u003chr /\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/f19165be525a9f4e7d4ccf374bfb47090ee4a397\"\u003e\u003ccode\u003ef19165b\u003c/code\u003e\u003c/a\u003e release 21.12.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/554bc8f65c3dc1eeca4aaa7150fa00f670818a30\"\u003e\u003ccode\u003e554bc8f\u003c/code\u003e\u003c/a\u003e ✨ feat(create): point a .venv redirect per PEP 832 (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3204\"\u003e#3204\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.11.1...21.12.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=virtualenv\u0026package-manager=pip\u0026previous-version=21.11.1\u0026new-version=21.12.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n\n\n\u003c/details\u003e","html_url":"https://github.com/Senzing/mapper-icij/pull/182","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/Senzing%2Fmapper-icij/issues/182","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/182/packages"}},{"old_version":"21.14.6","new_version":"21.14.7","update_type":"patch","path":null,"pr_created_at":"2026-10-15T04:41:42.000Z","version_change":"21.14.6 → 21.14.7","issue":{"uuid":"5860208807","node_id":"PR_kwDORgfIwM8AAAABIixIDw","number":224,"state":"open","title":"build(deps): bump the other group across 1 directory with 6 updates","user":"dependabot[bot]","labels":["dependencies","python"],"assignees":["aisecnomad"],"locked":false,"comments_count":1,"pull_request":true,"closed_at":null,"author_association":null,"state_reason":null,"created_at":"2026-10-15T04:41:42.000Z","updated_at":"2026-10-15T04:51:12.000Z","time_to_close":null,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"build(deps): bump","group_name":"other","update_count":6,"packages":[{"name":"hypothesis","old_version":"6.168.5","new_version":"6.169.0","repository_url":"https://github.com/HypothesisWorks/hypothesis"},{"name":"filelock","old_version":"4.0.12","new_version":"4.1.1","repository_url":"https://github.com/tox-dev/py-filelock"},{"name":"platformdirs","old_version":"4.12.4","new_version":"4.13.0","repository_url":"https://github.com/tox-dev/platformdirs"},{"name":"python-discovery","old_version":"1.6.1","new_version":"1.6.2","repository_url":"https://github.com/tox-dev/python-discovery"},{"name":"virtualenv","old_version":"21.14.6","new_version":"21.14.7","repository_url":"https://github.com/pypa/virtualenv"}],"path":null,"ecosystem":"pip"},"body":"Updates the requirements on [hypothesis](https://github.com/HypothesisWorks/hypothesis), [mkdocstrings](https://github.com/mkdocstrings/mkdocstrings), [filelock](https://github.com/tox-dev/py-filelock), [platformdirs](https://github.com/tox-dev/platformdirs), [python-discovery](https://github.com/tox-dev/python-discovery) and [virtualenv](https://github.com/pypa/virtualenv) to permit the latest version.\nUpdates `hypothesis` from 6.168.5 to 6.169.0\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/82fa40ada6bc83480a746890a40bb3d708ba8f03\"\u003e\u003ccode\u003e82fa40a\u003c/code\u003e\u003c/a\u003e Bump hypothesis version to 6.169.0 and update changelog\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/0116655b33188ec4f32c80e43b2da34afd3deceb\"\u003e\u003ccode\u003e0116655\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/HypothesisWorks/hypothesis/issues/4899\"\u003e#4899\u003c/a\u003e from Arjun-Aravind/fix/uv-download-metadata-url\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/4f7ef96b165569427553bbb9303abcdf15fad227\"\u003e\u003ccode\u003e4f7ef96\u003c/code\u003e\u003c/a\u003e claude: exclude rarely-hit realize branch from coverage\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/4d42db9a0a15a6dbf6820c09b2208cde56adea81\"\u003e\u003ccode\u003e4d42db9\u003c/code\u003e\u003c/a\u003e Update uv download-metadata URL\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/1484f6dd4c0a220f68e2698afed29e2a16a3f654\"\u003e\u003ccode\u003e1484f6d\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/HypothesisWorks/hypothesis/issues/4896\"\u003e#4896\u003c/a\u003e from Liam-DeVoe/drop-python-3.10\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/e3e5fea000e2ad0032332a51cc4f2b462eafb31f\"\u003e\u003ccode\u003ee3e5fea\u003c/code\u003e\u003c/a\u003e claude: address review comments\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/7c22da6b40925beedc9f38f88d00e36c8a4da7a2\"\u003e\u003ccode\u003e7c22da6\u003c/code\u003e\u003c/a\u003e claude: simplify add_note fallback\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/f6a8067cecc738cadb52f5d3f9e75cc93f8aff9f\"\u003e\u003ccode\u003ef6a8067\u003c/code\u003e\u003c/a\u003e claude: check ghostwriter golden outputs on 3.11 instead of 3.10\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/2416a79271cf101c0290a583392d2429765012a5\"\u003e\u003ccode\u003e2416a79\u003c/code\u003e\u003c/a\u003e Merge remote-tracking branch 'upstream/master' into plait/worktop-270d0237\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/b4c5a08fb84f76b2ef7da80730aef30c96ae45ee\"\u003e\u003ccode\u003eb4c5a08\u003c/code\u003e\u003c/a\u003e claude: drop support for Python 3.10\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/HypothesisWorks/hypothesis/compare/v6.168.5...v6.169.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `mkdocstrings` to 1.0.7\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/releases\"\u003emkdocstrings's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e1.0.7\u003c/h2\u003e\n\u003ch2\u003e\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/releases/tag/1.0.7\"\u003e1.0.7\u003c/a\u003e - 2026-10-10\u003c/h2\u003e\n\u003cp\u003e\u003c!-- raw HTML omitted --\u003e\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/compare/1.0.6...1.0.7\"\u003eCompare with 1.0.6\u003c/a\u003e\u003c!-- raw HTML omitted --\u003e\u003c/p\u003e\n\u003ch3\u003eBuild\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eDrop support for Python 3.10 (\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/commit/2c2cbb19d0fdab8554f93fe2fb1568ffba8c0f5d\"\u003e2c2cbb1\u003c/a\u003e by Timothée Mazzucotelli).\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eBug Fixes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eSupport pymdownx 12.2 (\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/commit/ff510f27eb514dd2e46fa213365475d6fa0c4c9e\"\u003eff510f2\u003c/a\u003e by Timothée Mazzucotelli). \u003ca href=\"https://redirect.github.com/mkdocstrings/mkdocstrings/issues/829\"\u003eIssue-829\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/blob/main/CHANGELOG.md\"\u003emkdocstrings's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/releases/tag/1.0.7\"\u003e1.0.7\u003c/a\u003e - 2026-10-10\u003c/h2\u003e\n\u003cp\u003e\u003c!-- raw HTML omitted --\u003e\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/compare/1.0.6...1.0.7\"\u003eCompare with 1.0.6\u003c/a\u003e\u003c!-- raw HTML omitted --\u003e\u003c/p\u003e\n\u003ch3\u003eBuild\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eDrop support for Python 3.10 (\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/commit/2c2cbb19d0fdab8554f93fe2fb1568ffba8c0f5d\"\u003e2c2cbb1\u003c/a\u003e by Timothée Mazzucotelli).\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eBug Fixes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eSupport pymdownx 12.2 (\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/commit/ff510f27eb514dd2e46fa213365475d6fa0c4c9e\"\u003eff510f2\u003c/a\u003e by Timothée Mazzucotelli). \u003ca href=\"https://redirect.github.com/mkdocstrings/mkdocstrings/issues/829\"\u003eIssue-829\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/releases/tag/1.0.6\"\u003e1.0.6\u003c/a\u003e - 2026-07-11\u003c/h2\u003e\n\u003cp\u003e\u003c!-- raw HTML omitted --\u003e\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/compare/1.0.5...1.0.6\"\u003eCompare with 1.0.5\u003c/a\u003e\u003c!-- raw HTML omitted --\u003e\u003c/p\u003e\n\u003ch3\u003eBug Fixes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eStop propagating Zensical's \u003ccode\u003ezrelpath\u003c/code\u003e treeprocessor and its \u003ccode\u003epreview\u003c/code\u003e extension (\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/commit/473279816aff4cc8ee3215fdf8b2d186517fc63d\"\u003e4732798\u003c/a\u003e by Timothée Mazzucotelli). \u003ca href=\"https://redirect.github.com/zensical/zensical/issues/818\"\u003eIssue-zensical-818\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/releases/tag/1.0.5\"\u003e1.0.5\u003c/a\u003e - 2026-07-10\u003c/h2\u003e\n\u003cp\u003e\u003c!-- raw HTML omitted --\u003e\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/compare/1.0.4...1.0.5\"\u003eCompare with 1.0.4\u003c/a\u003e\u003c!-- raw HTML omitted --\u003e\u003c/p\u003e\n\u003ch3\u003eBug Fixes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eParse inventory project and version (\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/commit/acc0da32d11428ea9c60f8e50f90df329f2e6460\"\u003eacc0da3\u003c/a\u003e by Timothée Mazzucotelli).\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/releases/tag/1.0.4\"\u003e1.0.4\u003c/a\u003e - 2026-04-15\u003c/h2\u003e\n\u003cp\u003e\u003c!-- raw HTML omitted --\u003e\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/compare/1.0.3...1.0.4\"\u003eCompare with 1.0.3\u003c/a\u003e\u003c!-- raw HTML omitted --\u003e\u003c/p\u003e\n\u003ch3\u003eBug Fixes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAdd timeout when downloading inventories (10 seconds) (\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/commit/3d1969a279ea396792c682810d029503e48d8fcd\"\u003e3d1969a\u003c/a\u003e by Simon Lloyd). \u003ca href=\"https://redirect.github.com/mkdocstrings/mkdocstrings/issues/819\"\u003eIssue-819\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/releases/tag/1.0.3\"\u003e1.0.3\u003c/a\u003e - 2026-02-07\u003c/h2\u003e\n\u003cp\u003e\u003c!-- raw HTML omitted --\u003e\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/compare/1.0.2...1.0.3\"\u003eCompare with 1.0.2\u003c/a\u003e\u003c!-- raw HTML omitted --\u003e\u003c/p\u003e\n\u003ch3\u003eBug Fixes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eForward extension instances directly passed from Zensical (\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/commit/65b27ec8d1d671eddf021e48b0114cc3f8aca14a\"\u003e65b27ec\u003c/a\u003e by Timothée Mazzucotelli).\u003c/li\u003e\n\u003cli\u003ePropagate Zensical's \u003ccode\u003ezrelpath\u003c/code\u003e processor (\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/commit/dbf263dfdd2fdd769d66fa62bdd388e05988bc78\"\u003edbf263d\u003c/a\u003e by Timothée Mazzucotelli).\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/releases/tag/1.0.2\"\u003e1.0.2\u003c/a\u003e - 2026-01-24\u003c/h2\u003e\n\u003cp\u003e\u003c!-- raw HTML omitted --\u003e\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/compare/1.0.1...1.0.2\"\u003eCompare with 1.0.1\u003c/a\u003e\u003c!-- raw HTML omitted --\u003e\u003c/p\u003e\n\u003ch3\u003eCode Refactoring\u003c/h3\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/commit/79eefbc4543915daafd936437e285907111aaf13\"\u003e\u003ccode\u003e79eefbc\u003c/code\u003e\u003c/a\u003e chore: Prepare release 1.0.7\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/commit/2c2cbb19d0fdab8554f93fe2fb1568ffba8c0f5d\"\u003e\u003ccode\u003e2c2cbb1\u003c/code\u003e\u003c/a\u003e build: Drop support for Python 3.10\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/commit/7275d141ec2d1e578ce982cc7963c0144d2fae80\"\u003e\u003ccode\u003e7275d14\u003c/code\u003e\u003c/a\u003e chore: Lint\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/commit/ff510f27eb514dd2e46fa213365475d6fa0c4c9e\"\u003e\u003ccode\u003eff510f2\u003c/code\u003e\u003c/a\u003e fix: Support pymdownx 12.2\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/commit/8b635eb92d09978231b89a4d24a1b73353489029\"\u003e\u003ccode\u003e8b635eb\u003c/code\u003e\u003c/a\u003e chore: Template upgrade\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/commit/e0cf0ed66ad0e134a00e49cdeb4576b161624011\"\u003e\u003ccode\u003ee0cf0ed\u003c/code\u003e\u003c/a\u003e chore: Template upgrade\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/commit/fa50fef2bf25b1aa7e11d99f8730daf64f32cdcf\"\u003e\u003ccode\u003efa50fef\u003c/code\u003e\u003c/a\u003e test: Fix tests for new Pygments version\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/commit/e37de4ea38ff4e4bb10f5d5b216edd23309ed5f8\"\u003e\u003ccode\u003ee37de4e\u003c/code\u003e\u003c/a\u003e chore: Template upgrade\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/commit/0cb9404c6d470fccbed1dffa72b8407789df974d\"\u003e\u003ccode\u003e0cb9404\u003c/code\u003e\u003c/a\u003e chore: Template upgrade\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/commit/b18d7d58eea7e67377a449d5fed0b2dcc1ed4954\"\u003e\u003ccode\u003eb18d7d5\u003c/code\u003e\u003c/a\u003e docs: Add note about Zensical and gen-files\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/mkdocstrings/mkdocstrings/compare/1.0.6...1.0.7\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `filelock` from 4.0.12 to 4.1.1\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/py-filelock/releases\"\u003efilelock's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e4.1.1\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003efeat(python): default to Python 3.15 by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/816\"\u003etox-dev/filelock#816\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(rw): avoid macOS descriptor lookups by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/820\"\u003etox-dev/filelock#820\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(tests): bound concurrent lock progress by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/819\"\u003etox-dev/filelock#819\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003etest: make lock error checks deterministic by \u003ca href=\"https://github.com/adenzhou1350\"\u003e\u003ccode\u003e@​adenzhou1350\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/817\"\u003etox-dev/filelock#817\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(read-write): reject a hostile pid in _owner_is_gone by \u003ca href=\"https://github.com/dxbjavid\"\u003e\u003ccode\u003e@​dxbjavid\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/821\"\u003etox-dev/filelock#821\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/adenzhou1350\"\u003e\u003ccode\u003e@​adenzhou1350\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/817\"\u003etox-dev/filelock#817\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/tox-dev/filelock/compare/4.1.0...4.1.1\"\u003ehttps://github.com/tox-dev/filelock/compare/4.1.0...4.1.1\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e4.1.0\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eci: download coverage during tool setup by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/776\"\u003etox-dev/filelock#776\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(api): validate timeout and poll_interval bounds by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/781\"\u003etox-dev/filelock#781\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(read-write): accept inf and reject nan timeouts by \u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/779\"\u003etox-dev/filelock#779\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft-rw): ignore non-ASCII generation names by \u003ca href=\"https://github.com/dxbjavid\"\u003e\u003ccode\u003e@​dxbjavid\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/778\"\u003etox-dev/filelock#778\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): check start token in is_lock_held_by_us by \u003ca href=\"https://github.com/lprnmns\"\u003e\u003ccode\u003e@​lprnmns\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/774\"\u003etox-dev/filelock#774\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): clean up marker when rollback close fails by \u003ca href=\"https://github.com/harbinresearcher\"\u003e\u003ccode\u003e@​harbinresearcher\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/775\"\u003etox-dev/filelock#775\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(read-write): clamp waits to threading.TIMEOUT_MAX by \u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/780\"\u003etox-dev/filelock#780\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): treat truncated markers as malformed by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/782\"\u003etox-dev/filelock#782\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(acquire): keep every acquire wait within the timeout by \u003ca href=\"https://github.com/feiiiiii5\"\u003e\u003ccode\u003e@​feiiiiii5\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/777\"\u003etox-dev/filelock#777\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e📝 docs: fix hanging example and platform claims by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/783\"\u003etox-dev/filelock#783\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(unix): keep peer marker on ENOSYS fallback by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/785\"\u003etox-dev/filelock#785\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(async): clear the task hold after a canceled release by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/789\"\u003etox-dev/filelock#789\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e✨ feat(api): export lease types and has_fcntl by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/790\"\u003etox-dev/filelock#790\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(strict): age private records by the filesystem clock by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/792\"\u003etox-dev/filelock#792\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(async): surface executor shutdown as an error by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/793\"\u003etox-dev/filelock#793\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): expire leases on the contender's clock by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/796\"\u003etox-dev/filelock#796\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft-rw): stop an acquire that close() overtook by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/798\"\u003etox-dev/filelock#798\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(strict): record claims before linking them by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/787\"\u003etox-dev/filelock#787\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): restore a live marker a stale break moved aside by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/786\"\u003etox-dev/filelock#786\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(api): chain errors on 3.10 without exceptiongroup by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/788\"\u003etox-dev/filelock#788\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): release a dropped SoftFileLease by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/791\"\u003etox-dev/filelock#791\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(read-write): keep probe fds until the last connection closes by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/794\"\u003etox-dev/filelock#794\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e📦 build(sdist): ship docs and update SECURITY.md by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/812\"\u003etox-dev/filelock#812\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft-rw): survive a removed generation log by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/795\"\u003etox-dev/filelock#795\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): tell PID namespaces apart in the marker host by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/797\"\u003etox-dev/filelock#797\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(async): release from the finalizer and keep I/O off the loop by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/800\"\u003etox-dev/filelock#800\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(strict): name what blocks the lock path by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/804\"\u003etox-dev/filelock#804\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(read-write): reject WAL databases and link beside the db by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/805\"\u003etox-dev/filelock#805\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(read-write): track read depth per thread by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/806\"\u003etox-dev/filelock#806\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): honour mode and tighten marker grammar by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/807\"\u003etox-dev/filelock#807\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🧪 test: drop timing races from two runner-load flakes by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/809\"\u003etox-dev/filelock#809\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/filelock/blob/main/docs/changelog.rst\"\u003efilelock's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e###########\nChangelog\n###########\u003c/p\u003e\n\u003cp\u003e.. towncrier-draft-entries:: Unreleased\u003c/p\u003e\n\u003cp\u003e.. towncrier release notes start\u003c/p\u003e\n\u003chr /\u003e\n\u003cp\u003e4.2.0 (2026-10-14)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eimport filelock\u003c/code\u003e is about twice as fast: lock types other than :class:\u003ccode\u003e~filelock.FileLock\u003c/code\u003e load on first use. :pr:\u003ccode\u003e831\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eFix :class:\u003ccode\u003e~filelock.StrictSoftFileLock\u003c/code\u003e raising :class:\u003ccode\u003e~filelock.SoftFileLockProtocolError\u003c/code\u003e on Windows when a\ncontender read a claim whose owner was still finishing its unlink. :pr:\u003ccode\u003e829\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.1.2 (2026-10-14)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eFix read-lock acquisition on SQLite versions older than 3.33.0 by using \u003ccode\u003esqlite_master\u003c/code\u003e for the schema probe. :pr:\u003ccode\u003e770\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eRaise \u003ccode\u003eIsADirectoryError\u003c/code\u003e (or \u003ccode\u003ePermissionError\u003c/code\u003e on Windows) for a directory lock path regardless of its write\npermissions. :pr:\u003ccode\u003e822\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eFix a forked child hanging at exit on PyPy when the parent forked while an\n:class:\u003ccode\u003e~filelock.AsyncReadWriteLock\u003c/code\u003e worker thread was between two operations. :pr:\u003ccode\u003e828\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eHash all cache keys in the lock filename recipe so short path-like keys stay in the chosen directory. The example also\naccepts path-derived surrogate escapes and works before the cache directory exists. :pr:\u003ccode\u003e824\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.1.1 (2026-10-11)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eBound the shared-lock contention test by worker progress so slow CI machines can finish the workload. :pr:\u003ccode\u003e819\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eAvoid the macOS \u003ccode\u003e/dev/fd\u003c/code\u003e lookup implicated in a kernel panic by opening SQLite through a validated hard link.\nThe database directory must be writable and support hard links; alias creation failure raises \u003ccode\u003eOSError\u003c/code\u003e. :pr:\u003ccode\u003e820\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eIgnore non-ASCII PID or start-time fields and out-of-range PIDs in \u003ccode\u003eReadWriteLock\u003c/code\u003e hard-link directory names so forged\nowners cannot abort acquisition. :pr:\u003ccode\u003e821\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eUse Python 3.15 for development and automation. :pr:\u003ccode\u003e816\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.1.0 (2026-10-09)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eImport :data:\u003ccode\u003e~filelock.OwnerMode\u003c/code\u003e, :data:\u003ccode\u003e~filelock.CompromiseReason\u003c/code\u003e and :data:\u003ccode\u003e~filelock.has_fcntl\u003c/code\u003e from\n\u003ccode\u003efilelock\u003c/code\u003e. :pr:\u003ccode\u003e790\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:class:\u003ccode\u003e~filelock.AcquireReturnProxy\u003c/code\u003e is generic in the lock type, so \u003ccode\u003ewith lock.acquire() as held:\u003c/code\u003e types \u003ccode\u003eheld\u003c/code\u003e as\nthe lock's own class. :pr:\u003ccode\u003e803\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eA :class:\u003ccode\u003e~filelock.Timeout\u003c/code\u003e from a soft lock names a holder on another host or in another PID namespace, which no\ncontender ever reclaims. :pr:\u003ccode\u003e815\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:attr:\u003ccode\u003e~filelock.SoftFileLock.is_lock_held_by_us\u003c/code\u003e and :attr:\u003ccode\u003e~filelock.MarkerSoftFileLock.is_lock_held_by_us\u003c/code\u003e return\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/5830a7e2c39d387ae5320bb3be1fbb2aa7742d4a\"\u003e\u003ccode\u003e5830a7e\u003c/code\u003e\u003c/a\u003e Release 4.1.1\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/a5fb607a8655035bb6d5ae4326637e25cf1af849\"\u003e\u003ccode\u003ea5fb607\u003c/code\u003e\u003c/a\u003e fix(read-write): reject a hostile pid in _owner_is_gone (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/821\"\u003e#821\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/4c6f32f2797b2883bbcb0cca1ee81211d3e09c12\"\u003e\u003ccode\u003e4c6f32f\u003c/code\u003e\u003c/a\u003e test: make lock error checks deterministic (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/817\"\u003e#817\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/f11f52357425943a6dbffd36ea1112726255f970\"\u003e\u003ccode\u003ef11f523\u003c/code\u003e\u003c/a\u003e fix(tests): bound concurrent lock progress (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/819\"\u003e#819\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/5fd0c8f2e6a778da1933204e4a95bd84db9cdd43\"\u003e\u003ccode\u003e5fd0c8f\u003c/code\u003e\u003c/a\u003e fix(rw): avoid macOS descriptor lookups (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/820\"\u003e#820\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/0c3aaabc75ca927b2530b7264a04b965d64acf55\"\u003e\u003ccode\u003e0c3aaab\u003c/code\u003e\u003c/a\u003e feat(python): default to Python 3.15 (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/816\"\u003e#816\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/6c0ecc28f898f08cd0438cd489c3eaabad79a4b7\"\u003e\u003ccode\u003e6c0ecc2\u003c/code\u003e\u003c/a\u003e Release 4.1.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/df06bbd640765ad3f1ed4a096cbe29e64b5592bb\"\u003e\u003ccode\u003edf06bbd\u003c/code\u003e\u003c/a\u003e 🐛 fix: close regressions since 4.0.12 (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/815\"\u003e#815\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/071204515d211b560d203cb68105ec06789eab46\"\u003e\u003ccode\u003e0712045\u003c/code\u003e\u003c/a\u003e 🐛 fix(read-write): refuse a database moved mid-acquire (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/808\"\u003e#808\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/73fefc1e907457dd9bc9793eeba52f183d7f9c40\"\u003e\u003ccode\u003e73fefc1\u003c/code\u003e\u003c/a\u003e 📝 docs: point canonical and og:url at versioned pages (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/813\"\u003e#813\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/tox-dev/py-filelock/compare/4.0.12...4.1.1\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `platformdirs` from 4.12.4 to 4.13.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/platformdirs/releases\"\u003eplatformdirs's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e4.13.0\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003efix: recognize Homebrew Cellar framework prefixes by \u003ca href=\"https://github.com/sricharanreddycheruku\"\u003e\u003ccode\u003e@​sricharanreddycheruku\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/612\"\u003etox-dev/platformdirs#612\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat(python): require 3.11 and default to 3.15 by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/613\"\u003etox-dev/platformdirs#613\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/sricharanreddycheruku\"\u003e\u003ccode\u003e@​sricharanreddycheruku\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/612\"\u003etox-dev/platformdirs#612\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/tox-dev/platformdirs/compare/4.12.4...4.13.0\"\u003ehttps://github.com/tox-dev/platformdirs/compare/4.12.4...4.13.0\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/platformdirs/blob/main/docs/changelog.rst\"\u003eplatformdirs's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e###########\nChangelog\n###########\u003c/p\u003e\n\u003cp\u003e.. towncrier-draft-entries:: Unreleased\u003c/p\u003e\n\u003cp\u003e.. towncrier release notes start\u003c/p\u003e\n\u003chr /\u003e\n\u003cp\u003e4.13.0 (2026-10-10)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eDetect Homebrew Python for the :class:\u003ccode\u003e~platformdirs.macos.MacOS\u003c/code\u003e site directories under :option:\u003ccode\u003epython:-S\u003c/code\u003e, which\nleaves :data:\u003ccode\u003esys.base_prefix\u003c/code\u003e on the \u003ccode\u003eCellar\u003c/code\u003e keg, and for the \u003ccode\u003epython-freethreading\u003c/code\u003e formula - by\n:user:\u003ccode\u003esricharanreddycheruku\u003c/code\u003e. :pr:\u003ccode\u003e612\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eUse Python 3.15 for development and automation. :pr:\u003ccode\u003e613\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.12.4 (2026-10-07)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eKeep site directories readable by other users when root calls\n:meth:\u003ccode\u003e~platformdirs.api.PlatformDirsABC.place_config_file\u003c/code\u003e or another \u003ccode\u003eplace_*_file\u003c/code\u003e method with\n:attr:\u003ccode\u003e~platformdirs.api.PlatformDirsABC.use_site_for_root\u003c/code\u003e - by :user:\u003ccode\u003edarrenhuai\u003c/code\u003e. :pr:\u003ccode\u003e610\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eMake :func:\u003ccode\u003e~platformdirs.user_runtime_dir\u003c/code\u003e warn and fall back from an unreachable \u003ccode\u003eXDG_RUNTIME_DIR\u003c/code\u003e under\n:attr:\u003ccode\u003e~platformdirs.api.PlatformDirsABC.ensure_exists\u003c/code\u003e instead of raising. :pr:\u003ccode\u003e611\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.12.3 (2026-10-03)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003ePlace files from \u003ccode\u003eplace_config_file\u003c/code\u003e and \u003ccode\u003eplace_data_file\u003c/code\u003e in the first site directory for root on Unix with\n\u003ccode\u003euse_site_for_root=True\u003c/code\u003e and \u003ccode\u003emultipath=True\u003c/code\u003e, where \u003ccode\u003efind_config_file\u003c/code\u003e and \u003ccode\u003efind_data_file\u003c/code\u003e look for them.\n:pr:\u003ccode\u003e607\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.12.2 (2026-09-29)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eKeep \u003ccode\u003eos.pathsep\u003c/code\u003e in \u003ccode\u003esite_applications_path\u003c/code\u003e under \u003ccode\u003emultipath=True\u003c/code\u003e on platforms with one applications\ndirectory. :pr:\u003ccode\u003e604\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.12.1 (2026-09-28)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eAvoid \u003ccode\u003ePytestAssertRewriteWarning\u003c/code\u003e when importing \u003ccode\u003eplatformdirs\u003c/code\u003e before invoking pytest. :pr:\u003ccode\u003e601\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.12.0 (2026-09-26)\u003c/p\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/f05fb4ef31f38dfc316802c5301db972fd75468e\"\u003e\u003ccode\u003ef05fb4e\u003c/code\u003e\u003c/a\u003e Release 4.13.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/b3174fdd4e80c83d72cf723fd2a7bb6cb54cbd5f\"\u003e\u003ccode\u003eb3174fd\u003c/code\u003e\u003c/a\u003e feat(python): require 3.11 and default to 3.15 (\u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/issues/613\"\u003e#613\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/d7eb4fe34231df80a6b1c7abc362aa504feddbf1\"\u003e\u003ccode\u003ed7eb4fe\u003c/code\u003e\u003c/a\u003e fix: recognize Homebrew Cellar framework prefixes (\u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/issues/612\"\u003e#612\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/tox-dev/platformdirs/compare/4.12.4...4.13.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `python-discovery` from 1.6.1 to 1.6.2\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/python-discovery/releases\"\u003epython-discovery's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev1.6.2\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003efix: ignore broken sphinx-llm release by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/pull/134\"\u003etox-dev/python-discovery#134\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e👷 ci: pin ubuntu-26.04 and bump dependencies by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/pull/138\"\u003etox-dev/python-discovery#138\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eci: run old Python checks in parallel by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/pull/140\"\u003etox-dev/python-discovery#140\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat(python): default to 3.15 and match virtualenv by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/pull/142\"\u003etox-dev/python-discovery#142\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(cache): discard unusable interpreter cache entries by \u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/pull/141\"\u003etox-dev/python-discovery#141\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(query): validate PY_DISCOVERY_TIMEOUT by \u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/pull/143\"\u003etox-dev/python-discovery#143\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/pull/141\"\u003etox-dev/python-discovery#141\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/tox-dev/python-discovery/compare/1.6.1...1.6.2\"\u003ehttps://github.com/tox-dev/python-discovery/compare/1.6.1...1.6.2\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/python-discovery/blob/main/docs/changelog.rst\"\u003epython-discovery's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003eBug fixes - 1.6.2\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eDiscard malformed interpreter cache entries and query the interpreter again, including entries with missing,\nnon-string or unusable \u003ccode\u003esystem_executable\u003c/code\u003e paths - by :user:\u003ccode\u003edarrenhuai\u003c/code\u003e. (:issue:\u003ccode\u003e141\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eUse the default interpreter query timeout and warn for invalid \u003ccode\u003ePY_DISCOVERY_TIMEOUT\u003c/code\u003e values. Accept \u003ccode\u003einf\u003c/code\u003e\nor values above the subprocess wait limit to disable the timeout - by :user:\u003ccode\u003edarrenhuai\u003c/code\u003e. (:issue:\u003ccode\u003e143\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003ev1.6.1 (2026-09-18)\u003c/p\u003e\n\u003chr /\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/4fe2ade736e5191de42ca3d4a0b8bf672ffc5652\"\u003e\u003ccode\u003e4fe2ade\u003c/code\u003e\u003c/a\u003e release 1.6.2\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/60ddef109aafdd6d54aa25c8057a569c76e3dba2\"\u003e\u003ccode\u003e60ddef1\u003c/code\u003e\u003c/a\u003e fix(query): validate PY_DISCOVERY_TIMEOUT (\u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/issues/143\"\u003e#143\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/eb1eab726924245c533ad867d1b4bcc4c47b6d2a\"\u003e\u003ccode\u003eeb1eab7\u003c/code\u003e\u003c/a\u003e fix(cache): discard unusable interpreter cache entries (\u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/issues/141\"\u003e#141\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/db810b8206339892c0cd15f000b8e18860a8b913\"\u003e\u003ccode\u003edb810b8\u003c/code\u003e\u003c/a\u003e feat(python): default to 3.15 and match virtualenv (\u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/issues/142\"\u003e#142\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/614afa4adaa5fb36daf38919e3c407af71f3260b\"\u003e\u003ccode\u003e614afa4\u003c/code\u003e\u003c/a\u003e ci: run old Python checks in parallel (\u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/issues/140\"\u003e#140\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/9148aa454b276b5745d56bb2a42bdc8f26ee7f55\"\u003e\u003ccode\u003e9148aa4\u003c/code\u003e\u003c/a\u003e [pre-commit.ci] pre-commit autoupdate (\u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/issues/139\"\u003e#139\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/a69c0d9139ff0f1276d318d75d25d59cbc172bf4\"\u003e\u003ccode\u003ea69c0d9\u003c/code\u003e\u003c/a\u003e 👷 ci: pin ubuntu-26.04 and bump dependencies (\u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/issues/138\"\u003e#138\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/c8fcbf599ac401c8b1ad793187b28e45ccd1ffc8\"\u003e\u003ccode\u003ec8fcbf5\u003c/code\u003e\u003c/a\u003e build(deps): bump astral-sh/setup-uv from 10.1.0 to 10.2.0 in the github-acti...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/f0b3a2030c57a4f9217cd6ab09f837123ad0bc17\"\u003e\u003ccode\u003ef0b3a20\u003c/code\u003e\u003c/a\u003e [pre-commit.ci] pre-commit autoupdate (\u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/issues/136\"\u003e#136\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/b4eea32e584c0c1f08c9ad4b9f5850cb8c2275da\"\u003e\u003ccode\u003eb4eea32\u003c/code\u003e\u003c/a\u003e build(deps): bump astral-sh/setup-uv from 10.0.1 to 10.1.0 in the github-acti...\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/tox-dev/python-discovery/compare/1.6.1...1.6.2\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `virtualenv` from 21.14.6 to 21.14.7\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pypa/virtualenv/releases\"\u003evirtualenv's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e21.14.7\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eUpgrade embedded pip/setuptools/wheel and CI test tools by \u003ca href=\"https://github.com/github-actions\"\u003e\u003ccode\u003e@​github-actions\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3385\"\u003epypa/virtualenv#3385\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🧪 test(seed): verify periodic update scheduling by \u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3384\"\u003epypa/virtualenv#3384\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat(python): default to Python 3.15 by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3386\"\u003epypa/virtualenv#3386\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🔧 chore: enroll in Anthropic OSS Scanner by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3387\"\u003epypa/virtualenv#3387\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🧪 test(util): skip safe_delete permission tests as root by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3389\"\u003epypa/virtualenv#3389\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e📝 docs(security): add an email reporting contact by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3388\"\u003epypa/virtualenv#3388\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(activation): escape the bash prompt for both PS1 passes by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3390\"\u003epypa/virtualenv#3390\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🧪 test(activation): undo both bash prompt passes on bash \u0026lt; 4.4 by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3392\"\u003epypa/virtualenv#3392\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🔧 build(release): bump pydantic for 3.15 wheels by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3391\"\u003epypa/virtualenv#3391\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.14.6...21.14.7\"\u003ehttps://github.com/pypa/virtualenv/compare/21.14.6...21.14.7\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pypa/virtualenv/blob/main/docs/changelog.rst\"\u003evirtualenv's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003eBugfixes - 21.14.7\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eEscape the environment name in the bash activator for both of bash's \u003ccode\u003ePS1\u003c/code\u003e passes, so a name or \u003ccode\u003e--prompt\u003c/code\u003e value\nwith a backslash before \u003ccode\u003e$(...)\u003c/code\u003e or backticks no longer runs as a command each time bash draws the prompt - by\n:user:\u003ccode\u003egaborbernat\u003c/code\u003e. (:issue:\u003ccode\u003e3390\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003ev21.14.6 (2026-10-08)\u003c/p\u003e\n\u003chr /\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/a857a7823c73c35935d0318b4f36e5d582691e1c\"\u003e\u003ccode\u003ea857a78\u003c/code\u003e\u003c/a\u003e release 21.14.7\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/4004d884fa22a4fe30fd9f1d8336eec52a796730\"\u003e\u003ccode\u003e4004d88\u003c/code\u003e\u003c/a\u003e 🔧 build(release): bump pydantic for 3.15 wheels (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3391\"\u003e#3391\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/212f69fb905371aed4d67fcb2ac194492f417d5b\"\u003e\u003ccode\u003e212f69f\u003c/code\u003e\u003c/a\u003e 🧪 test(activation): undo both bash prompt passes on bash \u0026lt; 4.4 (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3392\"\u003e#3392\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/c3104e02474b652832a9bbaae79f6e1696296932\"\u003e\u003ccode\u003ec3104e0\u003c/code\u003e\u003c/a\u003e 🐛 fix(activation): escape the bash prompt for both PS1 passes (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3390\"\u003e#3390\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/f29efc45c063e08e02527d211c41b24a3eefe0d3\"\u003e\u003ccode\u003ef29efc4\u003c/code\u003e\u003c/a\u003e 📝 docs(security): add an email reporting contact (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3388\"\u003e#3388\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/c26cc297e2291f76a72a925fa83100f827c5c8eb\"\u003e\u003ccode\u003ec26cc29\u003c/code\u003e\u003c/a\u003e 🧪 test(util): skip safe_delete permission tests as root (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3389\"\u003e#3389\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/8b21c36b4c56bd3bea41171fa513289c503efd97\"\u003e\u003ccode\u003e8b21c36\u003c/code\u003e\u003c/a\u003e 🔧 chore: enroll in Anthropic OSS Scanner (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3387\"\u003e#3387\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/bf09c7eb62246c19c2cfd0a179c5edcc14801397\"\u003e\u003ccode\u003ebf09c7e\u003c/code\u003e\u003c/a\u003e feat(python): default to Python 3.15 (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3386\"\u003e#3386\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/3f077928210afa4ec2cca456f4c587460b40bfc5\"\u003e\u003ccode\u003e3f07792\u003c/code\u003e\u003c/a\u003e 🧪 test(seed): verify periodic update scheduling (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3384\"\u003e#3384\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/7614b02375239b36090a53ce0f52a7086fbb6766\"\u003e\u003ccode\u003e7614b02\u003c/code\u003e\u003c/a\u003e Upgrade embedded pip/setuptools/wheel and CI test tools (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3385\"\u003e#3385\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.14.6...21.14.7\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore \u003cdependency name\u003e major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself)\n- `@dependabot ignore \u003cdependency name\u003e minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself)\n- `@dependabot ignore \u003cdependency name\u003e` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself)\n- `@dependabot unignore \u003cdependency name\u003e` will remove all of the ignore conditions of the specified dependency\n- `@dependabot unignore \u003cdependency name\u003e \u003cignore condition\u003e` will remove the ignore condition of the specified dependency and ignore conditions\n\n\n\u003c/details\u003e","html_url":"https://github.com/aisecnomad/Nexus-ShadowScan/pull/224","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/aisecnomad%2FNexus-ShadowScan/issues/224","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/224/packages"}},{"old_version":"21.11.0","new_version":"21.11.1","update_type":"patch","path":null,"pr_created_at":"2026-10-14T22:53:11.000Z","version_change":"21.11.0 → 21.11.1","issue":{"uuid":"5856996230","node_id":"PR_kwDOMJDtY88AAAABIgP8WQ","number":462,"state":"closed","title":"Bump virtualenv from 21.11.0 to 21.11.1","user":"dependabot[bot]","labels":["python","dependencies"],"assignees":[],"locked":false,"comments_count":2,"pull_request":true,"closed_at":"2026-10-14T22:56:52.000Z","author_association":null,"state_reason":null,"created_at":"2026-10-14T22:53:11.000Z","updated_at":"2026-10-14T22:56:53.000Z","time_to_close":221,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"Bump","packages":[{"name":"virtualenv","old_version":"21.11.0","new_version":"21.11.1","repository_url":"https://github.com/pypa/virtualenv"}],"path":null,"ecosystem":"pip"},"body":"Bumps [virtualenv](https://github.com/pypa/virtualenv) from 21.11.0 to 21.11.1.\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pypa/virtualenv/releases\"\u003evirtualenv's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e21.11.1\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e📝 docs(security): close threat items resolved by 21.11.0 by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3313\"\u003epypa/virtualenv#3313\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(build): ship test inputs in the sdist and check it by \u003ca href=\"https://github.com/Gonghan-Princess\"\u003e\u003ccode\u003e@​Gonghan-Princess\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3315\"\u003epypa/virtualenv#3315\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/Gonghan-Princess\"\u003e\u003ccode\u003e@​Gonghan-Princess\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3315\"\u003epypa/virtualenv#3315\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.11.0...21.11.1\"\u003ehttps://github.com/pypa/virtualenv/compare/21.11.0...21.11.1\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pypa/virtualenv/blob/main/docs/changelog.rst\"\u003evirtualenv's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003eBugfixes - 21.11.1\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eInclude the pre-commit configuration and the zipapp lock file in the source distribution, so downstream packagers can\nrun the test suite from it. (:issue:\u003ccode\u003e3314\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003ev21.11.0 (2026-09-23)\u003c/p\u003e\n\u003chr /\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/4c13875f0967e872f5e0708bdccfcd45aa175f0a\"\u003e\u003ccode\u003e4c13875\u003c/code\u003e\u003c/a\u003e release 21.11.1\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/ae073fbb0927f16a13e3fbf2561cd31439b2f3fa\"\u003e\u003ccode\u003eae073fb\u003c/code\u003e\u003c/a\u003e 🐛 fix(build): ship test inputs in the sdist and check it (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3315\"\u003e#3315\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/fc912de38475681b5ddd1e3ab3d04224f5e18f69\"\u003e\u003ccode\u003efc912de\u003c/code\u003e\u003c/a\u003e 📝 docs(security): close threat items resolved by 21.11.0 (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3313\"\u003e#3313\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.11.0...21.11.1\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n","html_url":"https://github.com/senzing-garage/sz-python-tools/pull/462","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/senzing-garage%2Fsz-python-tools/issues/462","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/462/packages"}},{"old_version":"21.5.1","new_version":"21.7.13","update_type":"minor","path":null,"pr_created_at":"2026-10-14T22:21:25.000Z","version_change":"21.5.1 → 21.7.13","issue":{"uuid":"5856656423","node_id":"PR_kwDORWOh8s8AAAABIf-mIA","number":39,"state":"closed","title":"chore(deps): Bump the uv group across 1 directory with 9 updates","user":"dependabot[bot]","labels":["dependencies","python:uv"],"assignees":[],"locked":false,"comments_count":2,"pull_request":true,"closed_at":"2026-10-16T23:13:32.000Z","author_association":null,"state_reason":null,"created_at":"2026-10-14T22:21:25.000Z","updated_at":"2026-10-16T23:13:34.000Z","time_to_close":175927,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"chore(deps): Bump","group_name":"uv","update_count":9,"packages":[{"name":"aiohttp","old_version":"3.14.1","new_version":"3.14.3","repository_url":"https://github.com/aio-libs/aiohttp"},{"name":"anyio","old_version":"4.12.1","new_version":"4.14.2","repository_url":"https://github.com/agronholm/anyio"},{"name":"cryptography","old_version":"48.0.1","new_version":"50.0.0","repository_url":"https://github.com/pyca/cryptography"},{"name":"multidict","old_version":"6.7.1","new_version":"6.9.1","repository_url":"https://github.com/aio-libs/multidict"},{"name":"pyasn1","old_version":"0.6.3","new_version":"0.6.4","repository_url":"https://github.com/pyasn1/pyasn1"},{"name":"pygments","old_version":"2.19.2","new_version":"2.20.0","repository_url":"https://github.com/pygments/pygments"},{"name":"pyjwt","old_version":"2.13.0","new_version":"2.15.0","repository_url":"https://github.com/jpadilla/pyjwt"},{"name":"urllib3","old_version":"2.7.0","new_version":"2.8.0","repository_url":"https://github.com/urllib3/urllib3"},{"name":"virtualenv","old_version":"21.5.1","new_version":"21.7.13","repository_url":"https://github.com/pypa/virtualenv"}],"path":null,"ecosystem":"pip"},"body":"Bumps the uv group with 9 updates in the / directory:\n\n| Package | From | To |\n| --- | --- | --- |\n| [aiohttp](https://github.com/aio-libs/aiohttp) | `3.14.1` | `3.14.3` |\n| [anyio](https://github.com/agronholm/anyio) | `4.12.1` | `4.14.2` |\n| [cryptography](https://github.com/pyca/cryptography) | `48.0.1` | `50.0.0` |\n| [multidict](https://github.com/aio-libs/multidict) | `6.7.1` | `6.9.1` |\n| [pyasn1](https://github.com/pyasn1/pyasn1) | `0.6.3` | `0.6.4` |\n| [pygments](https://github.com/pygments/pygments) | `2.19.2` | `2.20.0` |\n| [pyjwt](https://github.com/jpadilla/pyjwt) | `2.13.0` | `2.15.0` |\n| [urllib3](https://github.com/urllib3/urllib3) | `2.7.0` | `2.8.0` |\n| [virtualenv](https://github.com/pypa/virtualenv) | `21.5.1` | `21.7.13` |\n\n\nUpdates `aiohttp` from 3.14.1 to 3.14.3\nUpdates `anyio` from 4.12.1 to 4.14.2\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/agronholm/anyio/releases\"\u003eanyio's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e4.14.2\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eChanged \u003ccode\u003eByteReceiveStream.receive()\u003c/code\u003e implementations to raise a \u003ccode\u003eValueError\u003c/code\u003e when \u003ccode\u003emax_bytes\u003c/code\u003e is not a positive integer (\u003ca href=\"https://redirect.github.com/agronholm/anyio/pull/1191\"\u003e#1191\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFixed \u003ccode\u003eCapacityLimiter.total_tokens\u003c/code\u003e rejecting \u003ccode\u003efloat(\u0026quot;inf\u0026quot;)\u003c/code\u003e when the limiter was instantiated outside of an event loop. The adapter setter checked for infinity by identity (\u003ccode\u003evalue is math.inf\u003c/code\u003e), so only the exact \u003ccode\u003emath.inf\u003c/code\u003e singleton was accepted, while every backend setter (using \u003ccode\u003emath.isinf()\u003c/code\u003e) accepts any positive infinity (\u003ca href=\"https://redirect.github.com/agronholm/anyio/pull/1189\"\u003e#1189\u003c/a\u003e; PR by \u003ca href=\"https://github.com/greymoth-jp\"\u003e\u003ccode\u003e@​greymoth-jp\u003c/code\u003e\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003eFixed \u003ccode\u003eto_process.run_sync()\u003c/code\u003e deadlocking when the worker function writes enough data to \u003ccode\u003esys.stderr\u003c/code\u003e to fill the (undrained) pipe buffer. The worker process now redirects \u003ccode\u003esys.stderr\u003c/code\u003e to \u003ccode\u003eos.devnull\u003c/code\u003e as well, matching the documented behavior\u003c/li\u003e\n\u003cli\u003eFixed \u003ccode\u003eTLSStream.wrap()\u003c/code\u003e matching an internationalized (unicode) host name against the peer certificate using IDNA 2003 (via the standard library) instead of IDNA 2008, which could cause the host name to be matched against the wrong certificate (\u003ca href=\"https://redirect.github.com/agronholm/anyio/pull/1208\"\u003e#1208\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFixed \u003ccode\u003eanyio.open_process()\u003c/code\u003e (and \u003ccode\u003erun_process()\u003c/code\u003e) ignoring the \u003ccode\u003eextra_groups\u003c/code\u003e argument, as it mistakenly passed the value of the \u003ccode\u003egroup\u003c/code\u003e argument instead (\u003ca href=\"https://redirect.github.com/agronholm/anyio/pull/1209\"\u003e#1209\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFixed \u003ccode\u003eCapacityLimiter.acquire_nowait()\u003c/code\u003e and \u003ccode\u003eCapacityLimiter.acquire_nowait_on_behalf_of()\u003c/code\u003e raising \u003ccode\u003etrio.WouldBlock\u003c/code\u003e instead of \u003ccode\u003eanyio.WouldBlock\u003c/code\u003e on the \u003ccode\u003etrio\u003c/code\u003e backend when there are no tokens available (\u003ca href=\"https://redirect.github.com/agronholm/anyio/pull/1218\"\u003e#1218\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFixed \u003ccode\u003eCapacityLimiter\u003c/code\u003e on the asyncio backend over-granting tokens (\u003ccode\u003eborrowed_tokens\u003c/code\u003e exceeding \u003ccode\u003etotal_tokens\u003c/code\u003e and \u003ccode\u003eavailable_tokens\u003c/code\u003e going negative) when a non-blocking acquire was made in the window between a token being released and the notified waiter resuming. The freed token is now reserved for the woken waiter right away, so the non-blocking acquire correctly raises \u003ccode\u003eWouldBlock\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/agronholm/anyio/issues/1170\"\u003e#1170\u003c/a\u003e; PR by \u003ca href=\"https://github.com/gaoflow\"\u003e\u003ccode\u003e@​gaoflow\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFixed unnecessary CPU spin when delivering cancellation from \u003ccode\u003eCancelScope\u003c/code\u003e on asyncio under certain conditions, including improper cancel scope nesting (\u003ca href=\"https://redirect.github.com/agronholm/anyio/issues/1111\"\u003e#1111\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e4.14.1\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eFixed teardown of higher-scoped async fixtures failing on asyncio with \u003ccode\u003eRuntimeError: Attempted to exit cancel scope in a different task than it was entered in\u003c/code\u003e when an async test raise an outcome exception (e.g., \u003ccode\u003epytest.skip()\u003c/code\u003e, \u003ccode\u003epytest.xfail()\u003c/code\u003e, or \u003ccode\u003epytest.fail()\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/agronholm/anyio/issues/1179\"\u003e#1179\u003c/a\u003e; PR by \u003ca href=\"https://github.com/EmmanuelNiyonshuti\"\u003e\u003ccode\u003e@​EmmanuelNiyonshuti\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFixed \u003ccode\u003eCapacityLimiter.total_tokens\u003c/code\u003e rejecting a value of \u003ccode\u003e0\u003c/code\u003e when the limiter was instantiated outside of an event loop, contradicting the documented behavior of allowing 0 total tokens (\u003ca href=\"https://redirect.github.com/agronholm/anyio/pull/1183\"\u003e#1183\u003c/a\u003e; PR by \u003ca href=\"https://github.com/nyxst4ck\"\u003e\u003ccode\u003e@​nyxst4ck\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e4.14.0\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eAdded support for Python 3.15\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAdded an asynchronous implementation of the \u003ccode\u003eitertools\u003c/code\u003e module (\u003ca href=\"https://redirect.github.com/agronholm/anyio/issues/998\"\u003e#998\u003c/a\u003e; PR by \u003ca href=\"https://github.com/11kkw\"\u003e\u003ccode\u003e@​11kkw\u003c/code\u003e\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAdded the \u003ccode\u003elocal_port\u003c/code\u003e parameter to \u003ccode\u003econnect_tcp()\u003c/code\u003e to allow binding to a specific local port before connecting (\u003ca href=\"https://redirect.github.com/agronholm/anyio/issues/1067\"\u003e#1067\u003c/a\u003e; PR by \u003ca href=\"https://github.com/nullwiz\"\u003e\u003ccode\u003e@​nullwiz\u003c/code\u003e\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAdded support for custom capacity limiters in async path and file I/O functions and classes\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAdded the \u003ccode\u003ecreate_task()\u003c/code\u003e task group method for easier asyncio migration (returns a \u003ccode\u003eTaskHandle\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/agronholm/anyio/pull/1098\"\u003e#1098\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eChanged \u003ccode\u003eTaskGroup.start_soon()\u003c/code\u003e to return a \u003ccode\u003eTaskHandle\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAdded an option for \u003ccode\u003eTaskGroup.start()\u003c/code\u003e to return a \u003ccode\u003eTaskHandle\u003c/code\u003e (which then contains the start value in the \u003ccode\u003estart_value\u003c/code\u003e property)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAdded the \u003ccode\u003ecancel()\u003c/code\u003e convenience method to \u003ccode\u003eTaskGroup\u003c/code\u003e as a shortcut for cancelling the task group's cancel scope\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eImproved the error message when a known backend is not installed to suggest the install command (\u003ca href=\"https://redirect.github.com/agronholm/anyio/pull/1115\"\u003e#1115\u003c/a\u003e; PR by \u003ca href=\"https://github.com/EmmanuelNiyonshuti\"\u003e\u003ccode\u003e@​EmmanuelNiyonshuti\u003c/code\u003e\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eImproved \u003ccode\u003eanyio.Path\u003c/code\u003e to preserve subclass types by returning \u003ccode\u003eSelf\u003c/code\u003e in methods that return path objects (\u003ca href=\"https://redirect.github.com/agronholm/anyio/issues/1130\"\u003e#1130\u003c/a\u003e; PR by \u003ca href=\"https://github.com/EmmanuelNiyonshuti\"\u003e\u003ccode\u003e@​EmmanuelNiyonshuti\u003c/code\u003e\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eChanged the parameter type annotation in \u003ccode\u003eanyio.Path.write_bytes()\u003c/code\u003e to accept any \u003ccode\u003eReadableBuffer\u003c/code\u003e, thus allowing it to accept \u003ccode\u003ebytearray\u003c/code\u003e and \u003ccode\u003ememoryview\u003c/code\u003e to match \u003ccode\u003epathlib.Path.write_bytes()\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/agronholm/anyio/issues/1135\"\u003e#1135\u003c/a\u003e; PR by \u003ca href=\"https://github.com/SAY-5\"\u003e\u003ccode\u003e@​SAY-5\u003c/code\u003e\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eChanged several type annotations to only accept callables returning coroutine-like objects instead of arbitrary awaitables:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eTaskGroup.start_soon()\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eTaskGroup.start()\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eanyio.from_thread.run()\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThis reverts an earlier change from v3.7.0 which was made in error. (\u003ca href=\"https://redirect.github.com/agronholm/anyio/pull/1153\"\u003e#1153\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eChanged \u003ccode\u003eanyio.run\u003c/code\u003e to support callables returning arbitrary awaitables at runtime on all backends. Previously, this only worked on asyncio (\u003ca href=\"https://redirect.github.com/agronholm/anyio/pull/1171\"\u003e#1171\u003c/a\u003e; PR by \u003ca href=\"https://github.com/gschaffner\"\u003e\u003ccode\u003e@​gschaffner\u003c/code\u003e\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eChanged several classes (and their subclasses) to have \u003ccode\u003e__slots__\u003c/code\u003e (with \u003ccode\u003e__weakref__\u003c/code\u003e):\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eanyio.CancelScope\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/agronholm/anyio/commit/c384f99687c64c59ed8a11c3a0f11a2d57daff71\"\u003e\u003ccode\u003ec384f99\u003c/code\u003e\u003c/a\u003e Bumped up the version\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/agronholm/anyio/commit/dbba29d1ade7936f18fb71ba24aa92978673482a\"\u003e\u003ccode\u003edbba29d\u003c/code\u003e\u003c/a\u003e Fixed 100% CPU spin on cancel scope misuse (\u003ca href=\"https://redirect.github.com/agronholm/anyio/issues/1217\"\u003e#1217\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/agronholm/anyio/commit/6bbc6c33caabc13af5bc4256f745027cf8d5d7b8\"\u003e\u003ccode\u003e6bbc6c3\u003c/code\u003e\u003c/a\u003e Fix CapacityLimiter over-granting tokens on asyncio (\u003ca href=\"https://redirect.github.com/agronholm/anyio/issues/1172\"\u003e#1172\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/agronholm/anyio/commit/6f82b2537cbbe98f3df3f295499056ab7de0b15b\"\u003e\u003ccode\u003e6f82b25\u003c/code\u003e\u003c/a\u003e Refactored TestTLSStream.test_receive_invalid_max_bytes() to be less flaky\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/agronholm/anyio/commit/be24b0414f67f604bcbdd5ea3bcc56ab920d872e\"\u003e\u003ccode\u003ebe24b04\u003c/code\u003e\u003c/a\u003e Relaxed timeouts to fix test flakiness\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/agronholm/anyio/commit/81135065749b4f60c06619b9caaf0a11871c1ddf\"\u003e\u003ccode\u003e8113506\u003c/code\u003e\u003c/a\u003e Fix test flakiness caused by slow callback duration logging\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/agronholm/anyio/commit/1e988b617b69588e33fecb75e36a9837245f562f\"\u003e\u003ccode\u003e1e988b6\u003c/code\u003e\u003c/a\u003e Fixed CapacityLimiter raising trio.WouldBlock instead of anyio.WouldBlock (\u003ca href=\"https://redirect.github.com/agronholm/anyio/issues/1\"\u003e#1\u003c/a\u003e...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/agronholm/anyio/commit/44713f345cd29dd4e7d76553c134543a1296cc62\"\u003e\u003ccode\u003e44713f3\u003c/code\u003e\u003c/a\u003e Pin setup-uv to a commit sha across downstream jobs (\u003ca href=\"https://redirect.github.com/agronholm/anyio/issues/1213\"\u003e#1213\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/agronholm/anyio/commit/f1b7301c8264b0d2e8d24a5788fd29e93dea4040\"\u003e\u003ccode\u003ef1b7301\u003c/code\u003e\u003c/a\u003e Fixed stderr writes in a worker subprocess causing a deadlock (\u003ca href=\"https://redirect.github.com/agronholm/anyio/issues/1207\"\u003e#1207\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/agronholm/anyio/commit/212be93c2cf2c841e753e95e5e2c543ee7feca90\"\u003e\u003ccode\u003e212be93\u003c/code\u003e\u003c/a\u003e Fix flaky test_tcp_listener_same_port using a hardcoded port (\u003ca href=\"https://redirect.github.com/agronholm/anyio/issues/1206\"\u003e#1206\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/agronholm/anyio/compare/4.12.1...4.14.2\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `cryptography` from 48.0.1 to 50.0.0\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst\"\u003ecryptography's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e50.0.0 - 2026-07-31\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e\n* **SECURITY ISSUE**:\n  :func:`~cryptography.hazmat.primitives.serialization.pkcs7.pkcs7_decrypt_der`\n  and its PEM and S/MIME variants no longer expose distinguishable errors or\n  timing when unwrapping a ``RecipientInfo``'s ``encryptedKey``, which could\n  act as a Bleichenbacher oracle for callers that decrypt untrusted messages.\n  A random key is now substituted on failure, as described in :rfc:`3218`.\n  Credit to **@X1AOxiang** for reporting the issue. **CVE-2026-69247**\n* Deprecated Diffie-Hellman key exchange over finite fields (FFDH).\n  Everything FFDH is deprecated, including the types in\n  ``cryptography.hazmat.primitives.asymmetric.dh`` and loading FFDH keys or\n  parameters with the key loading APIs. Users should migrate to a more\n  modern key exchange algorithm.\n* Added ``xof()`` class methods to\n  :class:`~cryptography.hazmat.primitives.hashes.SHAKE128` and\n  :class:`~cryptography.hazmat.primitives.hashes.SHAKE256` for constructing\n  algorithm instances configured for use with\n  :class:`~cryptography.hazmat.primitives.hashes.XOFHash`.\n* The :mod:`X.509 verification \u0026lt;cryptography.x509.verification\u0026gt;` APIs are now\n  considered stable and are subject to our API stability policy.\n* Added the :doc:`/cobblestone` recipe, an implementation of the\n  Cobblestone-128 and Cobblestone-256 instantiations of the `C2SP\n  chunked-encryption specification\n  \u0026lt;https://c2sp.org/chunked-encryption\u0026gt;`_ for streaming authenticated\n  encryption of large messages.\n* Parsing a Signed Certificate Timestamp list now rejects encodings that\n  carry trailing bytes after the list or after an individual SCT, instead of\n  silently ignoring them.\n* Added support for using :class:`~cryptography.x509.Name` as a field type in\n  the :doc:`/hazmat/asn1/index` module.\n* Loading a public key or an EC private key now rejects DER where the\n  ``subjectPublicKey`` (or EC ``publicKey``) ``BIT STRING`` declares a non-zero\n  number of unused bits, instead of silently ignoring it.\n* Parsing a CRL entry's ``InvalidityDate`` extension now rejects a\n  ``GeneralizedTime`` that carries fractional seconds or another non-DER form,\n  matching the strict encoding already required for every other X.509 time\n  field.\n* :func:`~cryptography.x509.ocsp.load_der_ocsp_request` and\n  :func:`~cryptography.x509.ocsp.load_der_ocsp_response` now reject a request\n  or response whose ``version`` field is not ``v1``, the only version defined\n  by RFC 6960, matching the version validation already performed when loading\n  certificates, CSRs and CRLs.\n* :class:`~cryptography.hazmat.primitives.hashes.XOFHash` is now supported\n  when building against AWS-LC.\n* HMAC (and therefore PBKDF2-HMAC) with SHA-3 hashes is now supported when\n  building against AWS-LC.\n* Diffie-Hellman (:doc:`/hazmat/primitives/asymmetric/dh`) is now supported\n  when building against AWS-LC.\n\u0026lt;/tr\u0026gt;\u0026lt;/table\u0026gt; \n\u003c/code\u003e\u003c/pre\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pyca/cryptography/commit/dcb7050b807b00392fa9fe2eac7cb362fcf355cc\"\u003e\u003ccode\u003edcb7050\u003c/code\u003e\u003c/a\u003e Prepare for 50.0.0 release (\u003ca href=\"https://redirect.github.com/pyca/cryptography/issues/15372\"\u003e#15372\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pyca/cryptography/commit/53fccd93413a8d7f07d6d8999681f27b75cffa3f\"\u003e\u003ccode\u003e53fccd9\u003c/code\u003e\u003c/a\u003e Don't leak how PKCS#7 encryptedKey decryption failed (\u003ca href=\"https://redirect.github.com/pyca/cryptography/issues/15369\"\u003e#15369\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pyca/cryptography/commit/d472f978470fbefa521b86d98b2ecccbbb4d1dd8\"\u003e\u003ccode\u003ed472f97\u003c/code\u003e\u003c/a\u003e Add \u003ccode\u003efrom __future__ import annotations\u003c/code\u003e to all src/ Python files (\u003ca href=\"https://redirect.github.com/pyca/cryptography/issues/15371\"\u003e#15371\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pyca/cryptography/commit/908773d53829fb1466c6db364b31321c3cd8eb9a\"\u003e\u003ccode\u003e908773d\u003c/code\u003e\u003c/a\u003e Bump downstream dependencies in CI (\u003ca href=\"https://redirect.github.com/pyca/cryptography/issues/15368\"\u003e#15368\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pyca/cryptography/commit/2cc07cc948948211899bcb0cddd1fddf86e95812\"\u003e\u003ccode\u003e2cc07cc\u003c/code\u003e\u003c/a\u003e Bump BoringSSL, OpenSSL, AWS-LC in CI (\u003ca href=\"https://redirect.github.com/pyca/cryptography/issues/15367\"\u003e#15367\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pyca/cryptography/commit/c94ede9f040fa44942f7139772603419000acf66\"\u003e\u003ccode\u003ec94ede9\u003c/code\u003e\u003c/a\u003e chore(deps): bump ruff from 0.16.0 to 0.16.1 (\u003ca href=\"https://redirect.github.com/pyca/cryptography/issues/15366\"\u003e#15366\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pyca/cryptography/commit/67a8308dc9ea4cce6056e0f1438f903c208c3f35\"\u003e\u003ccode\u003e67a8308\u003c/code\u003e\u003c/a\u003e chore(deps): bump virtualenv from 21.7.0 to 21.7.1 (\u003ca href=\"https://redirect.github.com/pyca/cryptography/issues/15365\"\u003e#15365\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pyca/cryptography/commit/95018ffcdbbc510fd92fc872e3a3e80aa6e58596\"\u003e\u003ccode\u003e95018ff\u003c/code\u003e\u003c/a\u003e Release the GIL in one-shot AEAD encrypt/decrypt (\u003ca href=\"https://redirect.github.com/pyca/cryptography/issues/15361\"\u003e#15361\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pyca/cryptography/commit/6954733eaf55a0074abf88f06f7242dfca3a5d02\"\u003e\u003ccode\u003e6954733\u003c/code\u003e\u003c/a\u003e Release the GIL during DH and DSA parameter generation (\u003ca href=\"https://redirect.github.com/pyca/cryptography/issues/15364\"\u003e#15364\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pyca/cryptography/commit/6893b94c33e948f6240082461424cfb5da2dacc6\"\u003e\u003ccode\u003e6893b94\u003c/code\u003e\u003c/a\u003e Import _serialization instead of serialization in x509/extensions (\u003ca href=\"https://redirect.github.com/pyca/cryptography/issues/15363\"\u003e#15363\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/pyca/cryptography/compare/48.0.1...50.0.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `multidict` from 6.7.1 to 6.9.1\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/aio-libs/multidict/releases\"\u003emultidict's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e6.9.1\u003c/h2\u003e\n\u003ch2\u003eBug fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eFixed the C extension reading freed memory on free-threaded builds when a\nlist handed to :py:meth:\u003ccode\u003e~multidict.MultiDict.update\u003c/code\u003e,\n:py:meth:\u003ccode\u003e~multidict.MultiDict.extend\u003c/code\u003e, :py:meth:\u003ccode\u003e~multidict.MultiDict.merge\u003c/code\u003e\nor the :py:class:\u003ccode\u003e~multidict.MultiDict\u003c/code\u003e and :py:class:\u003ccode\u003e~multidict.CIMultiDict\u003c/code\u003e\nconstructors, a \u003ccode\u003e[key, value]\u003c/code\u003e item inside any iterable handed to them, or a\nlist tested with \u003ccode\u003ein\u003c/code\u003e against :py:meth:\u003ccode\u003e~multidict.MultiDict.items\u003c/code\u003e, is\nchanged by another thread; a call that catches the list shrinking under it\nnow raises :py:exc:\u003ccode\u003eRuntimeError\u003c/code\u003e -- by :user:\u003ccode\u003erodrigobnogueira\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eRelated issues and pull requests on GitHub:\u003c/em\u003e\n\u003ca href=\"https://redirect.github.com/aio-libs/multidict/issues/1437\"\u003e#1437\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFixed a data race on the free-threaded build where a retired hash table's\nreader count used relaxed atomics, letting a lock-free \u003ccode\u003eget()\u003c/code\u003e/\u003ccode\u003egetone()\u003c/code\u003e/\n\u003ccode\u003e__getitem__()\u003c/code\u003e read race a concurrent free of that table. The reader-exit\ndecrement and the drain's free check now use release/acquire ordering\ninstead -- by :user:\u003ccode\u003easvetlov\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eRelated issues and pull requests on GitHub:\u003c/em\u003e\n\u003ca href=\"https://redirect.github.com/aio-libs/multidict/issues/1481\"\u003e#1481\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFixed a free-threaded build bug where two threads calling \u003ccode\u003eupdate()\u003c/code\u003e,\n\u003ccode\u003emerge()\u003c/code\u003e, or \u003ccode\u003e__setitem__()\u003c/code\u003e on the same key at the same time could lose\nthe key entirely instead of just racing on which value wins. A decref of the\nreplaced value could transiently suspend the writer's critical section,\nletting a second writer for the same key observe the first writer's\nin-progress entry as absent and, once both settled, mistake it for a stale\nduplicate and delete it. Every such decref is now deferred until the writer\nhas released its critical section, so the window can no longer open.\n\u003ccode\u003esetdefault()\u003c/code\u003e had an unrelated instance of the same blind spot (it could\ninsert a duplicate rather than recognizing an in-flight key), fixed alongside\nit -- by :user:\u003ccode\u003easvetlov\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eRelated issues and pull requests on GitHub:\u003c/em\u003e\n\u003ca href=\"https://redirect.github.com/aio-libs/multidict/issues/1483\"\u003e#1483\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFixed a free-threaded build bug where \u003ccode\u003egetall()\u003c/code\u003e and the \u003ccode\u003eitems()\u003c/code\u003e/\n\u003ccode\u003ekeys()\u003c/code\u003e/\u003ccode\u003evalues()\u003c/code\u003e equality path could raise \u003ccode\u003eKeyError\u003c/code\u003e or report a\npresent, never-deleted key as missing. A concurrent \u003ccode\u003eupdate()\u003c/code\u003e/\u003ccode\u003eextend()\u003c/code\u003e/\n\u003ccode\u003e__setitem__()\u003c/code\u003e call can have its critical section transiently suspended\n(a decref triggering a blocking allocator call) while an entry is marked as\npart of its own bookkeeping; a reader landing in that window used to treat\nthe mark as \u0026quot;not found\u0026quot; instead of \u0026quot;still there, in flight\u0026quot; -- by\n:user:\u003ccode\u003easvetlov\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eRelated issues and pull requests on GitHub:\u003c/em\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/aio-libs/multidict/blob/master/CHANGES.rst\"\u003emultidict's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e6.9.1\u003c/h1\u003e\n\u003cp\u003e\u003cem\u003e(2026-09-21)\u003c/em\u003e\u003c/p\u003e\n\u003ch2\u003eBug fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eFixed the C extension reading freed memory on free-threaded builds when a\nlist handed to :py:meth:\u003ccode\u003e~multidict.MultiDict.update\u003c/code\u003e,\n:py:meth:\u003ccode\u003e~multidict.MultiDict.extend\u003c/code\u003e, :py:meth:\u003ccode\u003e~multidict.MultiDict.merge\u003c/code\u003e\nor the :py:class:\u003ccode\u003e~multidict.MultiDict\u003c/code\u003e and :py:class:\u003ccode\u003e~multidict.CIMultiDict\u003c/code\u003e\nconstructors, a \u003ccode\u003e[key, value]\u003c/code\u003e item inside any iterable handed to them, or a\nlist tested with \u003ccode\u003ein\u003c/code\u003e against :py:meth:\u003ccode\u003e~multidict.MultiDict.items\u003c/code\u003e, is\nchanged by another thread; a call that catches the list shrinking under it\nnow raises :py:exc:\u003ccode\u003eRuntimeError\u003c/code\u003e -- by :user:\u003ccode\u003erodrigobnogueira\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eRelated issues and pull requests on GitHub:\u003c/em\u003e\n:issue:\u003ccode\u003e1437\u003c/code\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFixed a data race on the free-threaded build where a retired hash table's\nreader count used relaxed atomics, letting a lock-free \u003ccode\u003eget()\u003c/code\u003e/\u003ccode\u003egetone()\u003c/code\u003e/\n\u003ccode\u003e__getitem__()\u003c/code\u003e read race a concurrent free of that table. The reader-exit\ndecrement and the drain's free check now use release/acquire ordering\ninstead -- by :user:\u003ccode\u003easvetlov\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eRelated issues and pull requests on GitHub:\u003c/em\u003e\n:issue:\u003ccode\u003e1481\u003c/code\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFixed a free-threaded build bug where two threads calling \u003ccode\u003eupdate()\u003c/code\u003e,\n\u003ccode\u003emerge()\u003c/code\u003e, or \u003ccode\u003e__setitem__()\u003c/code\u003e on the same key at the same time could lose\nthe key entirely instead of just racing on which value wins. A decref of the\nreplaced value could transiently suspend the writer's critical section,\nletting a second writer for the same key observe the first writer's\nin-progress entry as absent and, once both settled, mistake it for a stale\nduplicate and delete it. Every such decref is now deferred until the writer\nhas released its critical section, so the window can no longer open.\n\u003ccode\u003esetdefault()\u003c/code\u003e had an unrelated instance of the same blind spot (it could\ninsert a duplicate rather than recognizing an in-flight key), fixed alongside\nit -- by :user:\u003ccode\u003easvetlov\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eRelated issues and pull requests on GitHub:\u003c/em\u003e\n:issue:\u003ccode\u003e1483\u003c/code\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFixed a free-threaded build bug where \u003ccode\u003egetall()\u003c/code\u003e and the \u003ccode\u003eitems()\u003c/code\u003e/\n\u003ccode\u003ekeys()\u003c/code\u003e/\u003ccode\u003evalues()\u003c/code\u003e equality path could raise \u003ccode\u003eKeyError\u003c/code\u003e or report a\npresent, never-deleted key as missing. A concurrent \u003ccode\u003eupdate()\u003c/code\u003e/\u003ccode\u003eextend()\u003c/code\u003e/\n\u003ccode\u003e__setitem__()\u003c/code\u003e call can have its critical section transiently suspended\n(a decref triggering a blocking allocator call) while an entry is marked as\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/aio-libs/multidict/commit/0a1770c7e69845c8ef2000b3707cd7f1917a6944\"\u003e\u003ccode\u003e0a1770c\u003c/code\u003e\u003c/a\u003e Release 6.9.1 (\u003ca href=\"https://redirect.github.com/aio-libs/multidict/issues/1504\"\u003e#1504\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/aio-libs/multidict/commit/d220522b54b1989c90a96aa50c42bb0264d46210\"\u003e\u003ccode\u003ed220522\u003c/code\u003e\u003c/a\u003e Upload release assets one at a time to avoid the secondary rate limit (\u003ca href=\"https://redirect.github.com/aio-libs/multidict/issues/1503\"\u003e#1503\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/aio-libs/multidict/commit/30cd596f945ed7b69f5502c693339224043eb9e9\"\u003e\u003ccode\u003e30cd596\u003c/code\u003e\u003c/a\u003e Stop a GIL-releasing \u003cstrong\u003edel\u003c/strong\u003e from segfaulting the standard C extension build ...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/aio-libs/multidict/commit/d1c331ab2617299a1385fff29ef4da64e50bd071\"\u003e\u003ccode\u003ed1c331a\u003c/code\u003e\u003c/a\u003e Recheck the reader gate after taking the retired list (\u003ca href=\"https://redirect.github.com/aio-libs/multidict/issues/1502\"\u003e#1502\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/aio-libs/multidict/commit/b37f07c1a16122f95208936f2e58f55ea99cdbaf\"\u003e\u003ccode\u003eb37f07c\u003c/code\u003e\u003c/a\u003e Allocate deferred decrefs in fixed-size blocks (\u003ca href=\"https://redirect.github.com/aio-libs/multidict/issues/1501\"\u003e#1501\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/aio-libs/multidict/commit/563f667307c376744ca345802ca835f8b84ba947\"\u003e\u003ccode\u003e563f667\u003c/code\u003e\u003c/a\u003e Run CodSpeed benchmarks on Python 3.14 and loop the smallest ones (\u003ca href=\"https://redirect.github.com/aio-libs/multidict/issues/1498\"\u003e#1498\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/aio-libs/multidict/commit/157c87c6cecbeac0011b085e8f6c2496754c17e6\"\u003e\u003ccode\u003e157c87c\u003c/code\u003e\u003c/a\u003e Cancel superseded CI runs on pull requests (\u003ca href=\"https://redirect.github.com/aio-libs/multidict/issues/1500\"\u003e#1500\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/aio-libs/multidict/commit/d43adfe27f759a2810a900db73fc85ab3660e75b\"\u003e\u003ccode\u003ed43adfe\u003c/code\u003e\u003c/a\u003e Drop -I from the ASan test command so PYTHONMALLOC takes effect (\u003ca href=\"https://redirect.github.com/aio-libs/multidict/issues/1499\"\u003e#1499\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/aio-libs/multidict/commit/2a68472db036f199ecb1c1a0c66872eeb03a3135\"\u003e\u003ccode\u003e2a68472\u003c/code\u003e\u003c/a\u003e Stop items() iteration from reading a freed entry in CIMultiDict (\u003ca href=\"https://redirect.github.com/aio-libs/multidict/issues/1496\"\u003e#1496\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/aio-libs/multidict/commit/cd528d6d82dc1465042459b3cc143dc58c5ce6ab\"\u003e\u003ccode\u003ecd528d6\u003c/code\u003e\u003c/a\u003e Rename GHSA-54p9-h82j-f925 changelog fragment to the merged commit (\u003ca href=\"https://redirect.github.com/aio-libs/multidict/issues/1495\"\u003e#1495\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/aio-libs/multidict/compare/v6.7.1...v6.9.1\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `pyasn1` from 0.6.3 to 0.6.4\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pyasn1/pyasn1/releases\"\u003epyasn1's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003eRelease 0.6.4\u003c/h2\u003e\n\u003cp\u003eThis is a security release.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eCVE-2026-59885 (GHSA-8ppf-4f7h-5ppj): Fixed quadratic time complexity in the OBJECT IDENTIFIER and RELATIVE-OID decoders. A small crafted substrate encoding many arcs could consume excessive CPU.\u003c/li\u003e\n\u003cli\u003eCVE-2026-59884 (GHSA-m4p7-r5rc-7g4j): Limited BER long-form tag IDs to 20 octets (140 bits). Unbounded tag IDs allowed a crafted substrate to consume excessive CPU and memory.\u003c/li\u003e\n\u003cli\u003eCVE-2026-59886 (GHSA-hm4w-wwcw-mr6r): Fixed excessive memory and CPU consumption in \u003ccode\u003eReal.__float__()\u003c/code\u003e for values with large base-10 exponents.\u003c/li\u003e\n\u003cli\u003ePinned PyPI publish GitHub Action to an immutable commit.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eAll changes are noted in the \u003ca href=\"https://github.com/pyasn1/pyasn1/blob/main/CHANGES.rst\"\u003eCHANGELOG\u003c/a\u003e.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pyasn1/pyasn1/blob/main/CHANGES.rst\"\u003epyasn1's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003eRevision 0.6.4, released 08-07-2026\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eCVE-2026-59885 (GHSA-8ppf-4f7h-5ppj): Fixed quadratic time\ncomplexity in the OBJECT IDENTIFIER and RELATIVE-OID decoders.\nA small crafted substrate encoding many arcs could consume\nexcessive CPU. Arcs are now accumulated in linear time; decoded\nvalues are unchanged (thanks for reporting, tynus2)\u003c/li\u003e\n\u003cli\u003eCVE-2026-59884 (GHSA-m4p7-r5rc-7g4j): Limited BER long-form tag\nIDs to 20 octets (140 bits), matching the OID arc limit introduced\nin 0.6.2. Unbounded tag IDs allowed a crafted substrate to consume\nexcessive CPU and memory; longer tag IDs are now rejected with\nPyAsn1Error. Also fixed Tag and TagSet repr() failing on huge tag\n(thanks for reporting, mikeappsec)\nIDs due to the integer-to-string conversion limit (Python 3.11+)\u003c/li\u003e\n\u003cli\u003eCVE-2026-59886 (GHSA-hm4w-wwcw-mr6r): Fixed excessive memory and\nCPU consumption in Real.\u003cstrong\u003efloat\u003c/strong\u003e() for values with large base-10\nexponents. Conversion no longer materializes huge intermediate\nintegers; values too large to represent as a Python float raise\nOverflowError promptly, and prettyPrint() renders them as\n'\u003c!-- raw HTML omitted --\u003e' as before. Also fixed base-10 mantissa normalization\nto use exact integer arithmetic; mantissas larger than 2**53\ncould previously lose precision through float division\n(thanks for reporting, gvozdila)\u003c/li\u003e\n\u003cli\u003ePinned PyPI publish GitHub Action to an immutable commit\n[pr \u003ca href=\"https://redirect.github.com/pyasn1/pyasn1/issues/113\"\u003e#113\u003c/a\u003e](\u003ca href=\"https://redirect.github.com/pyasn1/pyasn1/pull/113\"\u003epyasn1/pyasn1#113\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pyasn1/pyasn1/commit/72e4803405816c371ed3b2cb4be181c47f038406\"\u003e\u003ccode\u003e72e4803\u003c/code\u003e\u003c/a\u003e Prepare release 0.6.4\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pyasn1/pyasn1/commit/0c19eeb853731db1c717ff125ea001a1e558332d\"\u003e\u003ccode\u003e0c19eeb\u003c/code\u003e\u003c/a\u003e Pin PyPI publish action to immutable commit (\u003ca href=\"https://redirect.github.com/pyasn1/pyasn1/issues/113\"\u003e#113\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pyasn1/pyasn1/commit/45bdb19eb7df4b3780fe9c912c63e99bffc39dd9\"\u003e\u003ccode\u003e45bdb19\u003c/code\u003e\u003c/a\u003e Merge commit from fork\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pyasn1/pyasn1/commit/628e36ecbb5277a3f01572ce418ef54271b165a5\"\u003e\u003ccode\u003e628e36e\u003c/code\u003e\u003c/a\u003e Merge commit from fork\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pyasn1/pyasn1/commit/e60c691cb91addb8fcefa2f537e85ede6fb1e886\"\u003e\u003ccode\u003ee60c691\u003c/code\u003e\u003c/a\u003e Merge commit from fork\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/pyasn1/pyasn1/compare/v0.6.3...v0.6.4\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `pygments` from 2.19.2 to 2.20.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pygments/pygments/releases\"\u003epygments's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e2.20.0\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eNew lexers:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eRell (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2914\"\u003e#2914\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdated lexers:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003earchetype: Fix catastrophic backtracking in GUID and ID patterns (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3064\"\u003e#3064\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eASN.1: Recognize minus sign and fix range operator (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3014\"\u003e#3014\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3060\"\u003e#3060\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eC++: Add C++26 keywords (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2955\"\u003e#2955\u003c/a\u003e), add integer literal suffixes (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2966\"\u003e#2966\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eComponentPascal: Fix \u003ccode\u003eanalyse_text\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3028\"\u003e#3028\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3032\"\u003e#3032\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eCoq renamed to Rocq (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2883\"\u003e#2883\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2908\"\u003e#2908\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eCython: Various improvements (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2932\"\u003e#2932\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2933\"\u003e#2933\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eDebian control: Improve architecture parsing (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3052\"\u003e#3052\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eDevicetree: Add support for overlay/fragments (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3021\"\u003e#3021\u003c/a\u003e), add bytestring support (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3022\"\u003e#3022\u003c/a\u003e), fix catastrophic backtracking (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3057\"\u003e#3057\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFennel: Various improvements (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2911\"\u003e#2911\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eHaskell: Handle escape sequences in character literals (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3069\"\u003e#3069\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/pygments/pygments/issues/1795\"\u003e#1795\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eJava: Add module keywords (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2955\"\u003e#2955\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eLean4: Add operators \u003ccode\u003e]'\u003c/code\u003e, \u003ccode\u003e]?\u003c/code\u003e, \u003ccode\u003e]!\u003c/code\u003e  (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2946\"\u003e#2946\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eLESS: Support single-line comments (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3005\"\u003e#3005\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eLilyPond: Update to 2.25.29 (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2974\"\u003e#2974\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eLLVM: Support C-style comments (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3023\"\u003e#3023\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2978\"\u003e#2978\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eLua(u): Fix catastrophic backtracking (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3047\"\u003e#3047\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eMacaulay2: Update to 1.25.05 (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2893\"\u003e#2893\u003c/a\u003e), 1.25.11 (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2988\"\u003e#2988\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eMathematica: Various improvements (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2957\"\u003e#2957\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003emeson: Add additional operators (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2919\"\u003e#2919\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eMySQL: Update keywords (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2970\"\u003e#2970\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eorg-Mode: Support both schedule and deadline (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2899\"\u003e#2899\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ePHP: Add \u003ccode\u003e__PROPERTY__\u003c/code\u003e magic constant (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2924\"\u003e#2924\u003c/a\u003e), add reserved keywords (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3002\"\u003e#3002\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ePostgreSQL: Add more keywords (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2985\"\u003e#2985\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eprotobuf: Fix namespace tokenization (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2929\"\u003e#2929\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ePython: Add \u003ccode\u003et\u003c/code\u003e-string support (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2973\"\u003e#2973\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3009\"\u003e#3009\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3010\"\u003e#3010\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eTablegen: Fix infinite loop (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2972\"\u003e#2972\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2940\"\u003e#2940\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eTera Term macro: Add commands introduced in v5.3 through v5.6 (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2951\"\u003e#2951\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eTOML: Support TOML 1.1.0 (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3026\"\u003e#3026\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3027\"\u003e#3027\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eTurtle: Allow empty comment lines (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2980\"\u003e#2980\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eXML: Added \u003ccode\u003e.xbrl\u003c/code\u003e as file ending (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2890\"\u003e#2890\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2891\"\u003e#2891\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDrop Python 3.8, and add Python 3.14 as a supported version (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2987\"\u003e#2987\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3012\"\u003e#3012\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eVarious improvements to \u003ccode\u003eautopygmentize\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2894\"\u003e#2894\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate \u003ccode\u003eonedark\u003c/code\u003e style to support more token types (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2977\"\u003e#2977\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate \u003ccode\u003ertt\u003c/code\u003e style to support more token types (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2895\"\u003e#2895\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eCache entry points to improve performance (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2979\"\u003e#2979\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFix \u003ccode\u003exterm-256\u003c/code\u003e color table (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3043\"\u003e#3043\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFix \u003ccode\u003ekwargs\u003c/code\u003e dictionary getting mutated on each call (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3044\"\u003e#3044\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pygments/pygments/blob/master/CHANGES\"\u003epygments's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003eVersion 2.20.0\u003c/h2\u003e\n\u003cp\u003e(released March 29th, 2026)\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eNew lexers:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eRell (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2914\"\u003e#2914\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdated lexers:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003earchetype: Fix catastrophic backtracking in GUID and ID patterns (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3064\"\u003e#3064\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eASN.1: Recognize minus sign and fix range operator (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3014\"\u003e#3014\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3060\"\u003e#3060\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eC++: Add C++26 keywords (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2955\"\u003e#2955\u003c/a\u003e), add integer literal suffixes (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2966\"\u003e#2966\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eComponentPascal: Fix \u003ccode\u003eanalyse_text\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3028\"\u003e#3028\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3032\"\u003e#3032\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eCoq renamed to Rocq (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2883\"\u003e#2883\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2908\"\u003e#2908\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eCython: Various improvements (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2932\"\u003e#2932\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2933\"\u003e#2933\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eDebian control: Improve architecture parsing (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3052\"\u003e#3052\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eDevicetree: Add support for overlay/fragments (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3021\"\u003e#3021\u003c/a\u003e), add bytestring support (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3022\"\u003e#3022\u003c/a\u003e), fix catastrophic backtracking (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3057\"\u003e#3057\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFennel: Various improvements (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2911\"\u003e#2911\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eHaskell: Handle escape sequences in character literals (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3069\"\u003e#3069\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/pygments/pygments/issues/1795\"\u003e#1795\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eJava: Add module keywords (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2955\"\u003e#2955\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eLean4: Add operators \u003ccode\u003e]'\u003c/code\u003e, \u003ccode\u003e]?\u003c/code\u003e, \u003ccode\u003e]!\u003c/code\u003e  (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2946\"\u003e#2946\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eLESS: Support single-line comments (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3005\"\u003e#3005\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eLilyPond: Update to 2.25.29 (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2974\"\u003e#2974\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eLLVM: Support C-style comments (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3023\"\u003e#3023\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2978\"\u003e#2978\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eLua(u): Fix catastrophic backtracking (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3047\"\u003e#3047\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eMacaulay2: Update to 1.25.05 (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2893\"\u003e#2893\u003c/a\u003e), 1.25.11 (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2988\"\u003e#2988\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eMathematica: Various improvements (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2957\"\u003e#2957\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003emeson: Add additional operators (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2919\"\u003e#2919\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eMySQL: Update keywords (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2970\"\u003e#2970\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eorg-Mode: Support both schedule and deadline (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2899\"\u003e#2899\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ePHP: Add \u003ccode\u003e__PROPERTY__\u003c/code\u003e magic constant (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2924\"\u003e#2924\u003c/a\u003e), add reserved keywords (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3002\"\u003e#3002\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ePostgreSQL: Add more keywords (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2985\"\u003e#2985\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eprotobuf: Fix namespace tokenization (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2929\"\u003e#2929\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ePython: Add \u003ccode\u003et\u003c/code\u003e-string support (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2973\"\u003e#2973\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3009\"\u003e#3009\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3010\"\u003e#3010\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eTablegen: Fix infinite loop (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2972\"\u003e#2972\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2940\"\u003e#2940\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eTera Term macro: Add commands introduced in v5.3 through v5.6 (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2951\"\u003e#2951\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eTOML: Support TOML 1.1.0 (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3026\"\u003e#3026\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3027\"\u003e#3027\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eTurtle: Allow empty comment lines (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2980\"\u003e#2980\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eXML: Added \u003ccode\u003e.xbrl\u003c/code\u003e as file ending (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2890\"\u003e#2890\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2891\"\u003e#2891\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDrop Python 3.8, and add Python 3.14 as a supported version (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2987\"\u003e#2987\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3012\"\u003e#3012\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eVarious improvements to \u003ccode\u003eautopygmentize\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2894\"\u003e#2894\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate \u003ccode\u003eonedark\u003c/code\u003e style to support more token types (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2977\"\u003e#2977\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate \u003ccode\u003ertt\u003c/code\u003e style to support more token types (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2895\"\u003e#2895\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eCache entry points to improve performance (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/2979\"\u003e#2979\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFix \u003ccode\u003exterm-256\u003c/code\u003e color table (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3043\"\u003e#3043\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFix \u003ccode\u003ekwargs\u003c/code\u003e dictionary getting mutated on each call (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3044\"\u003e#3044\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pygments/pygments/commit/708197d82827ba2d5ca78bcbb653c7102ce86dcd\"\u003e\u003ccode\u003e708197d\u003c/code\u003e\u003c/a\u003e Fix underline length.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pygments/pygments/commit/1d4538ae8621d766ecc91ff59caf76ab75983abc\"\u003e\u003ccode\u003e1d4538a\u003c/code\u003e\u003c/a\u003e Prepare 2.20 release.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pygments/pygments/commit/2ceaee4e634eebae2d10a47fd05406871f6bac8f\"\u003e\u003ccode\u003e2ceaee4\u003c/code\u003e\u003c/a\u003e Update CHANGES.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pygments/pygments/commit/e3a3c54b58c7f80bc4db887e471d4f91c77844ed\"\u003e\u003ccode\u003ee3a3c54\u003c/code\u003e\u003c/a\u003e Fix Haskell lexer: handle escape sequences in character literals (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3069\"\u003e#3069\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pygments/pygments/commit/d7c3453e342dac319f58e4091f4ef183cc49d802\"\u003e\u003ccode\u003ed7c3453\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3071\"\u003e#3071\u003c/a\u003e from pygments/harden-html-formatter\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pygments/pygments/commit/0f97e7c37d44abfa4ddfddf44a3290fdad586034\"\u003e\u003ccode\u003e0f97e7c\u003c/code\u003e\u003c/a\u003e Harden the HTML formatter against CSS.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pygments/pygments/commit/9f981b2ba42b88ca5bdcebf12cd01efd7cd80aec\"\u003e\u003ccode\u003e9f981b2\u003c/code\u003e\u003c/a\u003e Update CHANGES.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pygments/pygments/commit/1d889151024e9a53f3702a60558b29b070306e9e\"\u003e\u003ccode\u003e1d88915\u003c/code\u003e\u003c/a\u003e Update CHANGES.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pygments/pygments/commit/c3d93adb9827fc054c3c12b47bde31c781a36a93\"\u003e\u003ccode\u003ec3d93ad\u003c/code\u003e\u003c/a\u003e Fix ASN.1 lexer: recognize minus sign and fix range operator (\u003ca href=\"https://redirect.github.com/pygments/pygments/issues/3060\"\u003e#3060\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pygments/pygments/commit/4f06bcf8a5ba3f2b5bda24a26ccf041a1a65d91e\"\u003e\u003ccode\u003e4f06bcf\u003c/code\u003e\u003c/a\u003e fix bad behaving backtracking regex in CommonLispLexer\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/pygments/pygments/compare/2.19.2...2.20.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `pyjwt` from 2.13.0 to 2.15.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/jpadilla/pyjwt/releases\"\u003epyjwt's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e2.15.0\u003c/h2\u003e\n\u003cp\u003eSee the \u003ca href=\"https://github.com/jpadilla/pyjwt/blob/2.15.0/CHANGELOG.rst\"\u003e2.15.0 changelog\u003c/a\u003e for complete release details.\u003c/p\u003e\n\u003ch2\u003e2.14.0\u003c/h2\u003e\n\u003cp\u003eSee the \u003ca href=\"https://github.com/jpadilla/pyjwt/blob/2.14.0/CHANGELOG.rst\"\u003e2.14.0 changelog\u003c/a\u003e for the complete release details and related security advisories.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/jpadilla/pyjwt/blob/master/CHANGELOG.rst\"\u003epyjwt's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e\u003ccode\u003ev2.15.0 \u0026lt;https://github.com/jpadilla/pyjwt/compare/2.14.0...2.15.0\u0026gt;\u003c/code\u003e__\u003c/h2\u003e\n\u003cp\u003eSecurity\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e\n- Wrap recursion errors from deeply nested JWT payloads in ``DecodeError``\n  instead of exposing a raw ``RecursionError``.\n\u003cp\u003eAdded\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e\n- Support Python 3.15 by @kytta in `[#1202](https://github.com/jpadilla/pyjwt/issues/1202) \u0026amp;lt;https://github.com/jpadilla/pyjwt/pull/1202\u0026amp;gt;`__\n\nChanged\n\u003c/code\u003e\u003c/pre\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eJWKSetCache\u003c/code\u003e now stores the parsed \u003ccode\u003ePyJWKSet\u003c/code\u003e rather than the raw JWKS\npayload, so a cache hit no longer re-parses every key. \u003ccode\u003eJWKSetCache.put()\u003c/code\u003e\naccepts either form and raises \u003ccode\u003ePyJWKSetError\u003c/code\u003e for anything else. As a\nresult, \u003ccode\u003ePyJWKClient.get_jwk_set()\u003c/code\u003e returns the same \u003ccode\u003ePyJWKSet\u003c/code\u003e instance\nfor as long as it stays cached, rather than a freshly built one per call in\n\u003ccode\u003e[#1208](https://github.com/jpadilla/pyjwt/issues/1208) \u0026amp;lt;https://github.com/jpadilla/pyjwt/pull/1208\u0026amp;gt;\u003c/code\u003e__\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ePyJWKClient.fetch_data()\u003c/code\u003e now raises\n\u003ccode\u003ePyJWKClientError(\u0026amp;quot;The JWKS endpoint did not return a JSON object\u0026amp;quot;)\u003c/code\u003e when\nthe endpoint response is not a JSON object, instead of returning it for\n\u003ccode\u003eget_jwk_set()\u003c/code\u003e to reject. Callers reaching the JWKS through\n\u003ccode\u003eget_jwk_set()\u003c/code\u003e see the same error as before in\n\u003ccode\u003e[#1208](https://github.com/jpadilla/pyjwt/issues/1208) \u0026amp;lt;https://github.com/jpadilla/pyjwt/pull/1208\u0026amp;gt;\u003c/code\u003e__\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eFixed\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e\n- Return cached ``PyJWKSet`` values from ``PyJWKClient.get_jwk_set()`` instead\n  of raising ``PyJWKClientError(\u0026amp;quot;The JWKS endpoint did not return a JSON\n  object\u0026amp;quot;)``. ``JWKSetCache.put()`` documents ``PyJWKSet`` as the cached value,\n  so callers pre-populating the cache to avoid a network round-trip could not\n  read it back in `[#914](https://github.com/jpadilla/pyjwt/issues/914) \u0026amp;lt;https://github.com/jpadilla/pyjwt/issues/914\u0026amp;gt;`__ and\n  `[#1208](https://github.com/jpadilla/pyjwt/issues/1208) \u0026amp;lt;https://github.com/jpadilla/pyjwt/pull/1208\u0026amp;gt;`__\n- ``PyJWKClient.get_jwk_set()`` now caches the key set it returns, so a\n  ``fetch_data()`` override that filters or transforms the JWKS is no longer\n  undone by the next cache hit in\n  `[#1208](https://github.com/jpadilla/pyjwt/issues/1208) \u0026amp;lt;https://github.com/jpadilla/pyjwt/pull/1208\u0026amp;gt;`__\n- Raise the documented ``PyJWTError`` subclass instead of leaking a\n  ``TypeError`` when the ``exp``, ``nbf``, or ``iat`` claim decodes to a\n  non-numeric, non-string value such as a list, dict, or ``null``.\n- Reject OKP JWK private keys when their public ``x`` component does not\n  match the private ``d`` component.\n- Treat malformed JWK Set members as unusable keys rather than letting\n  ``AttributeError`` or ``TypeError`` escape ``PyJWKSet``. A member that is not\n\u0026amp;lt;/tr\u0026amp;gt;\u0026amp;lt;/table\u0026amp;gt; \n\u0026lt;/code\u0026gt;\u0026lt;/pre\u0026gt;\n\u0026lt;/blockquote\u0026gt;\n\u0026lt;p\u0026gt;... (truncated)\u0026lt;/p\u0026gt;\n\u0026lt;/details\u0026gt;\n\u0026lt;details\u0026gt;\n\u0026lt;summary\u0026gt;Commits\u0026lt;/summary\u0026gt;\n\n\u0026lt;ul\u0026gt;\n\u0026lt;li\u0026gt;\u0026lt;a href=\u0026quot;https://github.com/jpadilla/pyjwt/commit/1d41a6478e1562e68ff667fcd703356acf085f68\u0026quot;\u0026gt;\u0026lt;code\u0026gt;1d41a64\u0026lt;/code\u0026gt;\u0026lt;/a\u0026gt; chore: prepare 2.15.0 release\u0026lt;/li\u0026gt;\n\u0026lt;li\u0026gt;\u0026lt;a href=\u0026quot;https://github.com/jpadilla/pyjwt/commit/9bc06658f875b9b40091539140bbbdc4639161c3\u0026quot;\u0026gt;\u0026lt;code\u0026gt;9bc0665\u0026lt;/code\u0026gt;\u0026lt;/a\u0026gt; fix: make recursive payload tests deterministic\u0026lt;/li\u0026gt;\n\u0026lt;li\u0026gt;\u0026lt;a href=\u0026quot;https://github.com/jpadilla/pyjwt/commit/5fde08a6cf906aa7698de2d6391d88b73006b17b\u0026quot;\u0026gt;\u0026lt;code\u0026gt;5fde08a\u0026lt;/code\u0026gt;\u0026lt;/a\u0026gt; fix: normalize recursive JWT payload errors\u0026lt;/li\u0026gt;\n\u0026lt;li\u0026gt;\u0026lt;a href=\u0026quot;https://github.com/jpadilla/pyjwt/commit/171062d2d734315272a901100aa4b109f2fc3c19\u0026quot;\u0026gt;\u0026lt;code\u0026gt;171062d\u0026lt;/code\u0026gt;\u0026lt;/a\u0026gt; utils: mention bytes in force_bytes type error (\u0026lt;a href=\u0026quot;https://redirect.github.com/jpadilla/pyjwt/issues/1173\u0026quot;\u0026gt;#1173\u0026lt;/a\u0026gt;)\u0026lt;/li\u0026gt;\n\u0026lt;li\u0026gt;\u0026lt;a href=\u0026quot;https://github.com/jpadilla/pyjwt/commit/c9d4d5375bf464ef363506fed9eb6e7f33217ab6\u0026quot;\u0026gt;\u0026lt;code\u0026gt;c9d4d53\u0026lt;/code\u0026gt;\u0026lt;/a\u0026gt; docs/conf: drop duplicate 'and' from read() docstring (\u0026lt;a href=\u0026quot;https://redirect.github.com/jpadilla/pyjwt/issues/1174\u0026quot;\u0026gt;#1174\u0026lt;/a\u0026gt;)\u0026lt;/li\u0026gt;\n\u0026lt;li\u0026gt;\u0026lt;a href=\u0026quot;https://github.com/jpadilla/pyjwt/commit/2763752196113e1473b0ed7905aa6034aedfbe53\u0026quot;\u0026gt;\u0026lt;code\u0026gt;2763752\u0026lt;/code\u0026gt;\u0026lt;/a\u0026gt; Add support for Python 3.15 (\u0026lt;a href=\u0026quot;https://redirect.github.com/jpadilla/pyjwt/issues/1202\u0026quot;\u0026gt;#1202\u0026lt;/a\u0026gt;)\u0026lt;/li\u0026gt;\n\u0026lt;li\u0026gt;\u0026lt;a href=\u0026quot;https://github.com/jpadilla/pyjwt/commit/4adcd02722f5011c60079d3978dfc167b9a8eaa5\u0026quot;\u0026gt;\u0026lt;code\u0026gt;4adcd02\u0026lt;/code\u0026gt;\u0026lt;/a\u0026gt; Catch http.client.HTTPException in PyJWKClient.fetch_data (\u0026lt;a href=\u0026quot;https://redirect.github.com/jpadilla/pyjwt/issues/1201\u0026quot;\u0026gt;#1201\u0026lt;/a\u0026gt;)\u0026lt;/li\u0026gt;\n\u0026lt;li\u0026gt;\u0026lt;a href=\u0026quot;https://github.com/jpadilla/pyjwt/commit/9e501d993b4d3e7dba14bdb1722b1d993ac75097\u0026quot;\u0026gt;\u0026lt;code\u0026gt;9e501d9\u0026lt;/code\u0026gt;\u0026lt;/a\u0026gt; fix: correct docstring typo in _validate_jti (\u0026lt;a href=\u0026quot;https://redirect.github.com/jpadilla/pyjwt/issues/1179\u0026quot;\u0026gt;#1179\u0026lt;/a\u0026gt;)\u0026lt;/li\u0026gt;\n\u0026lt;li\u0026gt;\u0026lt;a href=\u0026quot;https://github.com/jpadilla/pyjwt/commit/4047c44d51950ffda15f40054508d3f17c43b1e2\u0026quot;\u0026gt;\u0026lt;code\u0026gt;4047c44\u0026lt;/code\u0026gt;\u0026lt;/a\u0026gt; docs: clarify JWK certificate member handling (\u0026lt;a href=\u0026quot;https://redirect.github.com/jpadilla/pyjwt/issues/1212\u0026quot;\u0026gt;#1212\u0026lt;/a\u0026gt;)\u0026lt;/li\u0026gt;\n\u0026lt;li\u0026gt;\u0026lt;a href=\u0026quot;https://github.com/jpadilla/pyjwt/commit/f4e2b59f543cc82d46d9d69922bba59e804216b9\u0026quot;\u0026gt;\u0026lt;code\u0026gt;f4e2b59\u0026lt;/code\u0026gt;\u0026lt;/a\u0026gt; [pre-commit.ci] pre-commit autoupdate (\u0026lt;a href=\u0026quot;https://redirect.github.com/jpadilla/pyjwt/issues/1210\u0026quot;\u0026gt;#1210\u0026lt;/a\u0026gt;)\u0026lt;/li\u0026gt;\n\u0026lt;li\u0026gt;Additional commits viewable in \u0026lt;a href=\u0026quot;https://github.com/jpadilla/pyjwt/compare/2.13.0...2.15.0\u0026quot;\u0026gt;compare view\u0026lt;/a\u0026gt;\u0026lt;/li\u0026gt;\n\u0026lt;/ul\u0026gt;\n\u0026lt;/details\u0026gt;\n\n\u0026lt;br /\u0026gt;\u003c/code\u003e\u003c/pre\u003e\n\nUpdates `urllib3` from 2.7.0 to 2.8.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/urllib3/urllib3/releases\"\u003eurllib3's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e2.8.0\u003c/h2\u003e\n\u003ch2\u003e🚀 urllib3 is fundraising for HTTP/2 support\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://sethmlarson.dev/urllib3-is-fundraising-for-http2-support\"\u003eurllib3 is raising ~$40,000 USD\u003c/a\u003e to release HTTP/2 support and ensure long-term sustainable maintenance of the project. If your company or organization uses Python and would benefit from HTTP/2 support in Requests, pip, cloud SDKs, and thousands of other projects \u003ca href=\"https://opencollective.com/urllib3\"\u003eplease consider contributing financially\u003c/a\u003e to ensure HTTP/2 support is developed sustainably and maintained for the long-haul.\u003c/p\u003e\n\u003cp\u003eThank you for your support.\u003c/p\u003e\n\u003ch2\u003eSecurity\u003c/h2\u003e\n\u003cp\u003eFixed the following security issues:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eThe TLS configuration for HTTPS proxies could be ignored or overridden. (High severity, GHSA-8988-9cw3-xx77)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eHTTPResponse.stream()\u003c/code\u003e and \u003ccode\u003eread_chunked()\u003c/code\u003e could buffer a chunk-size line of unbounded length in memory. (High severity, GHSA-vxq7-64xx-v4gw)\u003c/li\u003e\n\u003cli\u003eChunked Deflate streaming could enter an infinite loop. (Medium severity, GHSA-gh4c-6fx4-qh6g)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cblockquote\u003e\n\u003cp\u003e[!IMPORTANT]\nurllib3 2.8.0 fixes HTTPS proxy TLS configuration being ignored or overridden by destination settings. Configurations relying on that behavior may require changes.\u003c/p\u003e\n\u003cp\u003eConfigure proxy CA certificates and client certificates in \u003ccode\u003eproxy_ssl_context\u003c/code\u003e, and proxy identity checks with \u003ccode\u003eproxy_assert_hostname\u003c/code\u003e or \u003ccode\u003eproxy_assert_fingerprint\u003c/code\u003e. Destination client certificates and identity overrides no longer apply to HTTPS forwarding proxy connections.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e[!NOTE]\nCVE IDs had not yet been assigned to these advisories at the time of release due to a backlog at GitHub's CNA.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2\u003eDeprecations \u0026amp; Removals\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eDeprecated using an empty collection as the \u003ccode\u003eRetry\u003c/code\u003e option \u003ccode\u003eallowed_methods\u003c/code\u003e to retry any verb. (\u003ca href=\"https://redirect.github.com/urllib3/urllib3/issues/5044\"\u003e#5044\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eFeatures\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eAdded \u003ccode\u003eUrl.auth_decoded\u003c/code\u003e and \u003ccode\u003eUrl.auth_decoded_joined\u003c/code\u003e convenience properties to the result of \u003ccode\u003eparse_url()\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/urllib3/urllib3/issues/4945\"\u003e#4945\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdded \u003ccode\u003ebasic_auth_encoding\u003c/code\u003e and \u003ccode\u003eproxy_basic_auth_encoding\u003c/code\u003e parameters to \u003ccode\u003eurllib3.util.make_headers()\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/urllib3/urllib3/issues/5092\"\u003e#5092\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eBugfixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eFixed response header handling to replace obsolete folded header lines (\u003ccode\u003eobs-fold\u003c/code\u003e) with spaces in accordance with RFC 9112, preventing raw CRLF sequences from appearing in header values such as \u003ccode\u003eSet-Cookie\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/urllib3/urllib3/issues/1362\"\u003e#1362\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFixed usage of \u003ccode\u003eproxy_ssl_context\u003c/code\u003e with \u003ccode\u003eProxyManager\u003c/code\u003e when \u003ccode\u003euse_forwarding_for_https=True\u003c/code\u003e. Passing \u003ccode\u003essl_context\u003c/code\u003e instead of \u003ccode\u003eproxy_ssl_context\u003c/code\u003e for HTTPS proxies in this configuration now emits a \u003ccode\u003eFutureWarning\u003c/code\u003e and will raise an error in v3.0. (\u003ca href=\"https://redirect.github.com/urllib3/urllib3/issues/2577\"\u003e#2577\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eChanged behavior of the default \u003ccode\u003eConnectionPool.pool\u003c/code\u003e initialization. \u003ccode\u003eLifoQueue\u003c/code\u003e is now resolved from the \u003ccode\u003equeue\u003c/code\u003e module after the \u003ccode\u003eConnectionPool\u003c/code\u003e is instantiated instead of using the default cached \u003ccode\u003eQueueCls\u003c/code\u003e class property. This is done because sometimes the \u003ccode\u003equeue.LifoQueue\u003c/code\u003e is monkey-patched late in the program, such as by gevent. (\u003ca href=\"https://redirect.github.com/urllib3/urllib3/issues/3289\"\u003e#3289\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRaised \u003ccode\u003eUnrewindableBodyError\u003c/code\u003e instead of \u003ccode\u003eValueError\u003c/code\u003e when retrying a request whose body had \u003ccode\u003etell()\u003c/code\u003e but not \u003ccode\u003eseek()\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/urllib3/urllib3/issues/3779\"\u003e#3779\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDecoded percent-encoded SOCKS proxy credentials before authenticating with the proxy server. (\u003ca href=\"https://redirect.github.com/urllib3/urllib3/issues/3785\"\u003e#3785\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFixed \u003ccode\u003eHTTPResponse.drain_conn()\u003c/code\u003e to discard unread response data in 64 KiB chunks (same as the default \u003ccode\u003eamt\u003c/code\u003e when doing \u003ccode\u003eHTTPResponse.stream(...)\u003c/code\u003e). (\u003ca href=\"https://redirect.github.com/urllib3/urllib3/issues/5019\"\u003e#5019\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFixed \u003ccode\u003eis_ipaddress()\u003c/code\u003e to detect non-standard IPv4 forms accepted by \u003ccode\u003esocket.connect\u003c/code\u003e, such as hex (\u003ccode\u003e0x7f000001\u003c/code\u003e), octal (\u003ccode\u003e0177.0.0.1\u003c/code\u003e), and decimal integers (\u003ccode\u003e2130706433\u003c/code\u003e), ensuring SSL certificate verification uses the correct mode for these addresses. (\u003ca href=\"https://redirect.github.com/urllib3/urllib3/issues/5029\"\u003e#5029\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFixed \u003ccode\u003eHTTPConnectionPool.urlopen\u003c/code\u003e raising a misleading \u003ccode\u003eFullPoolError\u003c/code\u003e instead of \u003ccode\u003eValueError\u003c/code\u003e when called with an invalid \u003ccode\u003etimeout\u003c/code\u003e argument on a pool created with \u003ccode\u003eblock=True\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/urllib3/urllib3/issues/5059\"\u003e#5059\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFixed port-zero handling to preserve explicit \u003ccode\u003e:0\u003c/code\u003e values instead of substituting the default ports 80 or 443 in URL parsing, pool selection, proxy configuration, \u003ccode\u003econnection_from_url()\u003c/code\u003e, and HTTP/2 request authority. (\u003ca href=\"https://redirect.github.com/urllib3/urllib3/issues/5071\"\u003e#5071\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/urllib3/urllib3/issues/5101\"\u003e#5101\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFixed a bug where \u003ccode\u003ePoolManager\u003c/code\u003e passed the \u003ccode\u003eassert_hostname\u003c/code\u003e and \u003ccode\u003eassert_fingerprint\u003c/code\u003e parameters to HTTP connection pools. (\u003ca href=\"https://redirect.github.com/urllib3/urllib3/issues/5077\"\u003e#5077\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFixed \u003ccode\u003eHTTPConnectionPool.urlopen()\u003c/code\u003e and HTTP proxy forwarding to strip URL fragments from absolute request targets before sending requests. (\u003ca href=\"https://redirect.github.com/urllib3/urllib3/issues/5079\"\u003e#5079\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAdded safeguards to the proxy tunneling code to prevent potential security issues when handling invalid characters in the proxy host and HTTP headers. This change affects users of Python 3.10, Python 3.11, and Python 3.12 when the standard library does not contain the fix; those on newer Python versions should upgrade to 3.13.14+ or 3.14.5+ to get the same security fixes. (\u003ca href=\"https://redirect.github.com/urllib3/urllib3/issues/5091\"\u003e#5091\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFixed \u003ccode\u003eHTTPSConnection.connect()\u003c/code\u003e overriding \u003ccode\u003eProxyConfig.ssl_context\u003c/code\u003e's certificate policy and proxy identity checks with the target connection's TLS settings when forwarding through an HTTPS proxy.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eHTTPSConnection\u003c/code\u003e no longer applies target SNI, assertions, or client credentials to forwarding proxy handshakes and continues to use its \u003ccode\u003essl_context\u003c/code\u003e as a fallback when an HTTPS proxy forwards an HTTP target. (\u003ca href=\"https://redirect.github.com/urllib3/urllib3/issues/5093\"\u003e#5093\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFixed URL parsing to more strictly enforce RFC 3986 host syntax, rejecting invalid host input such as raw spaces and control characters, malformed percent-encodings, and percent-encoded control characters in HTTP(S) hosts and IPv6 zone identifiers, including proxy CONNECT tunnel targets. Host normalization now also follows RFC 3986 normalization rules for percent-encoded octets by decoding percent-encoded unreserved characters and uppercasing the hexadecimal digits of retained percent-encoded octets. (\u003ca href=\"https://redirect.github.com/urllib3/urllib3/issues/5095\"\u003e#5095\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/urllib3/urllib3/blob/main/CHANGES.rst\"\u003eurllib3's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e2.8.0 (2026-09-15)\u003c/h1\u003e\n\u003ch2\u003eSecurity\u003c/h2\u003e\n\u003cp\u003eFixed the following security issues:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eThe TLS configuration for HTTPS proxies could be ignored or overridden.\n(High severity, \u003ccode\u003eGHSA-8988-9cw3-xx77 \u0026lt;https://github.com/urllib3/urllib3/security/advisories/GHSA-8988-9cw3-xx77\u0026gt;\u003c/code\u003e__)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eHTTPResponse.stream()\u003c/code\u003e and \u003ccode\u003eread_chunked()\u003c/code\u003e could buffer a chunk-size\nline of unbounded length in memory. (High severity,\n\u003ccode\u003eGHSA-vxq7-64xx-v4gw \u0026lt;https://github.com/urllib3/urllib3/security/advisories/GHSA-vxq7-64xx-v4gw\u0026gt;\u003c/code\u003e__)\u003c/li\u003e\n\u003cli\u003eChunked Deflate streaming could enter an infinite loop. (Medium severity,\n\u003ccode\u003eGHSA-gh4c-6fx4-qh6g \u0026lt;https://github.com/urllib3/urllib3/security/advisories/GHSA-gh4c-6fx4-qh6g\u0026gt;\u003c/code\u003e__)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e.. caution::\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eurllib3 2.8.0 fixes HTTPS proxy TLS configuration being ignored or\noverridden by destination settings. Configurations relying on that\nbehavior may require changes.\n\u003cp\u003eConfigure proxy CA certificates and client certificates in\n\u003ccode\u003eproxy_ssl_context\u003c/code\u003e, and proxy identity checks with\n\u003ccode\u003eproxy_assert_hostname\u003c/code\u003e or \u003ccode\u003eproxy_assert_fingerprint\u003c/code\u003e.\nDestination client certificates and identity overrides no longer\napply to HTTPS forwarding proxy connections.\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\n\u003ch2\u003eDeprecations \u0026amp; Removals\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eDeprecated using an empty collection as the \u003ccode\u003eRetry\u003c/code\u003e option\n\u003ccode\u003eallowed_methods\u003c/code\u003e to retry any verb.\n(\u003ccode\u003e[#5044](https://github.com/urllib3/urllib3/issues/5044) \u0026lt;https://github.com/urllib3/urllib3/issues/5044\u0026gt;\u003c/code\u003e__)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eFeatures\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eAdded \u003ccode\u003eUrl.auth_decoded\u003c/code\u003e and \u003ccode\u003eUrl.auth_decoded_joined\u003c/code\u003e convenience\nproperties to the result of \u003ccode\u003eparse_url()\u003c/code\u003e.\n(\u003ccode\u003e[#4945](https://github.com/urllib3/urllib3/issues/4945) \u0026lt;https://github.com/urllib3/urllib3/issues/4945\u0026gt;\u003c/code\u003e__)\u003c/li\u003e\n\u003cli\u003eAdded \u003ccode\u003ebasic_auth_encoding\u003c/code\u003e and \u003ccode\u003eproxy_basic_auth_encoding\u003c/code\u003e parameters to\n\u003ccode\u003eurllib3.util.make_headers()\u003c/code\u003e.\n(\u003ccode\u003e[#5092](https://github.com/urllib3/urllib3/issues/5092) \u0026lt;https://github.com/urllib3/urllib3/issues/5092\u0026gt;\u003c/code\u003e__)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eBugfixes\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/urllib3/urllib3/commit/b1d30ab61fe0db8f11092805e8c5ac43e091064a\"\u003e\u003ccode\u003eb1d30ab\u003c/code\u003e\u003c/a\u003e Release 2.8.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/urllib3/urllib3/commit/9016d7e8afc68185496ef07f3c3a4a743d04922e\"\u003e\u003ccode\u003e9016d7e\u003c/code\u003e\u003c/a\u003e Skip \u003ccode\u003etest_read_chunked_with_trailing_data_does_not_hang\u003c/code\u003e for brotlicffi (\u003ca href=\"https://redirect.github.com/urllib3/urllib3/issues/5258\"\u003e#5258\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/urllib3/urllib3/commit/9101f581a8b3659af23b6ff335ae77200ca33533\"\u003e\u003ccode\u003e9101f58\u003c/code\u003e\u003c/a\u003e Fix \u003ccode\u003enox -s docs\u003c/code\u003e warning (\u003ca href=\"https://redirect.github.com/urllib3/urllib3/issues/5256\"\u003e#5256\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/urllib3/urllib3/commit/cd770b059b543be29298ea5c52afb0b1b090f5ed\"\u003e\u003ccode\u003ecd770b0\u003c/code\u003e\u003c/a\u003e Merge commit from fork\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/urllib3/urllib3/commit/ea2ad7b21a80da3632f80016526a18864586077f\"\u003e\u003ccode\u003eea2ad7b\u003c/code\u003e\u003c/a\u003e Merge commit from fork\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/urllib3/urllib3/commit/0716e31534345dc1599ea95d903c79f276239bd8\"\u003e\u003ccode\u003e0716e31\u003c/code\u003e\u003c/a\u003e Fix loading unencrypted client keys with a password in pyOpenSSL (\u003ca href=\"https://redirect.github.com/urllib3/urllib3/issues/5255\"\u003e#5255\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/urllib3/urllib3/commit/43c68c8b43a9dcb44ed2cf4ec91384ca0d46b37d\"\u003e\u003ccode\u003e43c68c8\u003c/code\u003e\u003c/a\u003e Test pickling of \u003ccode\u003eInvalidChunkLength\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/urllib3/urllib3/issues/5247\"\u003e#5247\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/urllib3/urllib3/commit/308b279b3fb28e7bee952e152ec5baeb5bfd0817\"\u003e\u003ccode\u003e308b279\u003c/code\u003e\u003c/a\u003e Share security policy between GitHub and Read the Docs (\u003ca href=\"https://redirect.github.com/urllib3/urllib3/issues/5253\"\u003e#5253\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/urllib3/urllib3/commit/53fa0731b27d4b71ab0755ea5b896422d005d706\"\u003e\u003ccode\u003e53fa073\u003c/code\u003e\u003c/a\u003e Add policy on duplicate pull requests (\u003ca href=\"https://redirect.github.com/urllib3/urllib3/issues/5252\"\u003e#5252\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/urllib3/urllib3/commit/5f2a6a843d0100d1351c3f94d58581ca98d17267\"\u003e\u003ccode\u003e5f2a6a8\u003c/code\u003e\u003c/a\u003e Assert on the ALPN extension in test_tunnel_sets_http_11_alpn (\u003ca href=\"https://redirect.github.com/urllib3/urllib3/issues/5232\"\u003e#5232\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/urllib3/urllib3/compare/2.7.0...2.8.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `virtualenv` from 21.5.1 to 21.7.13\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pypa/virtualenv/releases\"\u003evirtualenv's releases\u003c/a\u003e....\n\n_Description has been truncated_","html_url":"https://github.com/cameronsjo/image-gen/pull/39","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/cameronsjo%2Fimage-gen/issues/39","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/39/packages"}},{"old_version":"21.14.3","new_version":"21.14.6","update_type":"patch","path":null,"pr_created_at":"2026-10-14T18:59:03.000Z","version_change":"21.14.3 → 21.14.6","issue":{"uuid":"5853811782","node_id":"PR_kwDORgfIwM8AAAABIdr8lQ","number":223,"state":"closed","title":"build(deps): bump the other group across 1 directory with 10 updates","user":"dependabot[bot]","labels":["dependencies","python"],"assignees":["aisecnomad"],"locked":false,"comments_count":1,"pull_request":true,"closed_at":"2026-10-15T04:41:13.000Z","author_association":null,"state_reason":null,"created_at":"2026-10-14T18:59:03.000Z","updated_at":"2026-10-15T04:41:15.000Z","time_to_close":34930,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"build(deps): bump","group_name":"other","update_count":10,"packages":[{"name":"hypothesis","old_version":"6.168.3","new_version":"6.169.0","repository_url":"https://github.com/HypothesisWorks/hypothesis"},{"name":"ast-serialize","old_version":"0.11.2","new_version":"0.12.1","repository_url":"https://github.com/mypyc/ast_serialize"},{"name":"filelock","old_version":"4.0.9","new_version":"4.1.1","repository_url":"https://github.com/tox-dev/py-filelock"},{"name":"iniconfig","old_version":"2.3.0","new_version":"2.3.1","repository_url":"https://github.com/pytest-dev/iniconfig"},{"name":"platformdirs","old_version":"4.12.2","new_version":"4.13.0","repository_url":"https://github.com/tox-dev/platformdirs"},{"name":"python-discovery","old_version":"1.6.1","new_version":"1.6.2","repository_url":"https://github.com/tox-dev/python-discovery"},{"name":"rpds-py","old_version":"2026.6.3","new_version":"2026.9.1","repository_url":"https://github.com/crate-py/rpds"},{"name":"tomli","old_version":"2.4.1","new_version":"2.5.0","repository_url":"https://github.com/hukkin/tomli"},{"name":"types-requests","old_version":"2.33.0.20260906","new_version":"2.33.0.20261006","repository_url":"https://github.com/python/typeshed"},{"name":"virtualenv","old_version":"21.14.3","new_version":"21.14.6","repository_url":"https://github.com/pypa/virtualenv"}],"path":null,"ecosystem":"pip"},"body":"Bumps the other group with 10 updates in the / directory:\n\n| Package | From | To |\n| --- | --- | --- |\n| [hypothesis](https://github.com/HypothesisWorks/hypothesis) | `6.168.3` | `6.169.0` |\n| [ast-serialize](https://github.com/mypyc/ast_serialize) | `0.11.2` | `0.12.1` |\n| [filelock](https://github.com/tox-dev/py-filelock) | `4.0.9` | `4.1.1` |\n| [iniconfig](https://github.com/pytest-dev/iniconfig) | `2.3.0` | `2.3.1` |\n| [platformdirs](https://github.com/tox-dev/platformdirs) | `4.12.2` | `4.13.0` |\n| [python-discovery](https://github.com/tox-dev/python-discovery) | `1.6.1` | `1.6.2` |\n| [rpds-py](https://github.com/crate-py/rpds) | `2026.6.3` | `2026.9.1` |\n| [tomli](https://github.com/hukkin/tomli) | `2.4.1` | `2.5.0` |\n| [types-requests](https://github.com/python/typeshed) | `2.33.0.20260906` | `2.33.0.20261006` |\n| [virtualenv](https://github.com/pypa/virtualenv) | `21.14.3` | `21.14.6` |\n\n\nUpdates `hypothesis` from 6.168.3 to 6.169.0\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/82fa40ada6bc83480a746890a40bb3d708ba8f03\"\u003e\u003ccode\u003e82fa40a\u003c/code\u003e\u003c/a\u003e Bump hypothesis version to 6.169.0 and update changelog\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/0116655b33188ec4f32c80e43b2da34afd3deceb\"\u003e\u003ccode\u003e0116655\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/HypothesisWorks/hypothesis/issues/4899\"\u003e#4899\u003c/a\u003e from Arjun-Aravind/fix/uv-download-metadata-url\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/4f7ef96b165569427553bbb9303abcdf15fad227\"\u003e\u003ccode\u003e4f7ef96\u003c/code\u003e\u003c/a\u003e claude: exclude rarely-hit realize branch from coverage\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/4d42db9a0a15a6dbf6820c09b2208cde56adea81\"\u003e\u003ccode\u003e4d42db9\u003c/code\u003e\u003c/a\u003e Update uv download-metadata URL\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/1484f6dd4c0a220f68e2698afed29e2a16a3f654\"\u003e\u003ccode\u003e1484f6d\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/HypothesisWorks/hypothesis/issues/4896\"\u003e#4896\u003c/a\u003e from Liam-DeVoe/drop-python-3.10\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/ca2a4c6e3c6b979d9fbb5ef9db614885a736d2aa\"\u003e\u003ccode\u003eca2a4c6\u003c/code\u003e\u003c/a\u003e Bump hypothesis version to 6.168.5 and update changelog\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/c1c9957de83aad3facea6610b0bccecf141632f6\"\u003e\u003ccode\u003ec1c9957\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/HypothesisWorks/hypothesis/issues/4894\"\u003e#4894\u003c/a\u003e from MarcoGorelli/django-from-field-return-type\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/e3e5fea000e2ad0032332a51cc4f2b462eafb31f\"\u003e\u003ccode\u003ee3e5fea\u003c/code\u003e\u003c/a\u003e claude: address review comments\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/7c22da6b40925beedc9f38f88d00e36c8a4da7a2\"\u003e\u003ccode\u003e7c22da6\u003c/code\u003e\u003c/a\u003e claude: simplify add_note fallback\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis/commit/f6a8067cecc738cadb52f5d3f9e75cc93f8aff9f\"\u003e\u003ccode\u003ef6a8067\u003c/code\u003e\u003c/a\u003e claude: check ghostwriter golden outputs on 3.11 instead of 3.10\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/HypothesisWorks/hypothesis/compare/v6.168.3...v6.169.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `ast-serialize` from 0.11.2 to 0.12.1\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mypyc/ast_serialize/commit/8d0a5c6d1c87e29aa37c7292149086b514ccac93\"\u003e\u003ccode\u003e8d0a5c6\u003c/code\u003e\u003c/a\u003e Bump version to 0.12.1\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mypyc/ast_serialize/commit/a7f11b17731c0c3b9afc683e977e3faf90ba6c19\"\u003e\u003ccode\u003ea7f11b1\u003c/code\u003e\u003c/a\u003e Fix parsing plain None type in a string (\u003ca href=\"https://redirect.github.com/mypyc/ast_serialize/issues/96\"\u003e#96\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mypyc/ast_serialize/commit/bcf707f0d2c59a8033d2d8734849b2233f36f70d\"\u003e\u003ccode\u003ebcf707f\u003c/code\u003e\u003c/a\u003e Bump version to 0.12.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mypyc/ast_serialize/commit/89b6e832250fbc4d80739b318237f9571d6c32cc\"\u003e\u003ccode\u003e89b6e83\u003c/code\u003e\u003c/a\u003e Allow colon in error codes (\u003ca href=\"https://redirect.github.com/mypyc/ast_serialize/issues/94\"\u003e#94\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/mypyc/ast_serialize/compare/v0.11.2...v0.12.1\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `filelock` from 4.0.9 to 4.1.1\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/py-filelock/releases\"\u003efilelock's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e4.1.1\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003efeat(python): default to Python 3.15 by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/816\"\u003etox-dev/filelock#816\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(rw): avoid macOS descriptor lookups by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/820\"\u003etox-dev/filelock#820\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(tests): bound concurrent lock progress by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/819\"\u003etox-dev/filelock#819\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003etest: make lock error checks deterministic by \u003ca href=\"https://github.com/adenzhou1350\"\u003e\u003ccode\u003e@​adenzhou1350\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/817\"\u003etox-dev/filelock#817\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(read-write): reject a hostile pid in _owner_is_gone by \u003ca href=\"https://github.com/dxbjavid\"\u003e\u003ccode\u003e@​dxbjavid\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/821\"\u003etox-dev/filelock#821\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/adenzhou1350\"\u003e\u003ccode\u003e@​adenzhou1350\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/817\"\u003etox-dev/filelock#817\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/tox-dev/filelock/compare/4.1.0...4.1.1\"\u003ehttps://github.com/tox-dev/filelock/compare/4.1.0...4.1.1\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e4.1.0\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eci: download coverage during tool setup by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/776\"\u003etox-dev/filelock#776\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(api): validate timeout and poll_interval bounds by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/781\"\u003etox-dev/filelock#781\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(read-write): accept inf and reject nan timeouts by \u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/779\"\u003etox-dev/filelock#779\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft-rw): ignore non-ASCII generation names by \u003ca href=\"https://github.com/dxbjavid\"\u003e\u003ccode\u003e@​dxbjavid\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/778\"\u003etox-dev/filelock#778\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): check start token in is_lock_held_by_us by \u003ca href=\"https://github.com/lprnmns\"\u003e\u003ccode\u003e@​lprnmns\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/774\"\u003etox-dev/filelock#774\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): clean up marker when rollback close fails by \u003ca href=\"https://github.com/harbinresearcher\"\u003e\u003ccode\u003e@​harbinresearcher\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/775\"\u003etox-dev/filelock#775\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(read-write): clamp waits to threading.TIMEOUT_MAX by \u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/780\"\u003etox-dev/filelock#780\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): treat truncated markers as malformed by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/782\"\u003etox-dev/filelock#782\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(acquire): keep every acquire wait within the timeout by \u003ca href=\"https://github.com/feiiiiii5\"\u003e\u003ccode\u003e@​feiiiiii5\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/777\"\u003etox-dev/filelock#777\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e📝 docs: fix hanging example and platform claims by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/783\"\u003etox-dev/filelock#783\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(unix): keep peer marker on ENOSYS fallback by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/785\"\u003etox-dev/filelock#785\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(async): clear the task hold after a canceled release by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/789\"\u003etox-dev/filelock#789\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e✨ feat(api): export lease types and has_fcntl by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/790\"\u003etox-dev/filelock#790\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(strict): age private records by the filesystem clock by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/792\"\u003etox-dev/filelock#792\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(async): surface executor shutdown as an error by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/793\"\u003etox-dev/filelock#793\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): expire leases on the contender's clock by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/796\"\u003etox-dev/filelock#796\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft-rw): stop an acquire that close() overtook by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/798\"\u003etox-dev/filelock#798\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(strict): record claims before linking them by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/787\"\u003etox-dev/filelock#787\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): restore a live marker a stale break moved aside by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/786\"\u003etox-dev/filelock#786\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(api): chain errors on 3.10 without exceptiongroup by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/788\"\u003etox-dev/filelock#788\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): release a dropped SoftFileLease by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/791\"\u003etox-dev/filelock#791\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(read-write): keep probe fds until the last connection closes by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/794\"\u003etox-dev/filelock#794\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e📦 build(sdist): ship docs and update SECURITY.md by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/812\"\u003etox-dev/filelock#812\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft-rw): survive a removed generation log by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/795\"\u003etox-dev/filelock#795\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): tell PID namespaces apart in the marker host by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/797\"\u003etox-dev/filelock#797\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(async): release from the finalizer and keep I/O off the loop by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/800\"\u003etox-dev/filelock#800\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(strict): name what blocks the lock path by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/804\"\u003etox-dev/filelock#804\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(read-write): reject WAL databases and link beside the db by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/805\"\u003etox-dev/filelock#805\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(read-write): track read depth per thread by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/806\"\u003etox-dev/filelock#806\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): honour mode and tighten marker grammar by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/807\"\u003etox-dev/filelock#807\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🧪 test: drop timing races from two runner-load flakes by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/809\"\u003etox-dev/filelock#809\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/filelock/blob/main/docs/changelog.rst\"\u003efilelock's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e###########\nChangelog\n###########\u003c/p\u003e\n\u003cp\u003e.. towncrier-draft-entries:: Unreleased\u003c/p\u003e\n\u003cp\u003e.. towncrier release notes start\u003c/p\u003e\n\u003chr /\u003e\n\u003cp\u003e4.1.2 (2026-10-14)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eFix read-lock acquisition on SQLite versions older than 3.33.0 by using \u003ccode\u003esqlite_master\u003c/code\u003e for the schema probe. :pr:\u003ccode\u003e770\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eRaise \u003ccode\u003eIsADirectoryError\u003c/code\u003e (or \u003ccode\u003ePermissionError\u003c/code\u003e on Windows) for a directory lock path regardless of its write\npermissions. :pr:\u003ccode\u003e822\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eFix a forked child hanging at exit on PyPy when the parent forked while an\n:class:\u003ccode\u003e~filelock.AsyncReadWriteLock\u003c/code\u003e worker thread was between two operations. :pr:\u003ccode\u003e828\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eHash all cache keys in the lock filename recipe so short path-like keys stay in the chosen directory. The example also\naccepts path-derived surrogate escapes and works before the cache directory exists. :pr:\u003ccode\u003e824\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.1.1 (2026-10-11)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eBound the shared-lock contention test by worker progress so slow CI machines can finish the workload. :pr:\u003ccode\u003e819\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eAvoid the macOS \u003ccode\u003e/dev/fd\u003c/code\u003e lookup implicated in a kernel panic by opening SQLite through a validated hard link.\nThe database directory must be writable and support hard links; alias creation failure raises \u003ccode\u003eOSError\u003c/code\u003e. :pr:\u003ccode\u003e820\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eIgnore non-ASCII PID or start-time fields and out-of-range PIDs in \u003ccode\u003eReadWriteLock\u003c/code\u003e hard-link directory names so forged\nowners cannot abort acquisition. :pr:\u003ccode\u003e821\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eUse Python 3.15 for development and automation. :pr:\u003ccode\u003e816\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.1.0 (2026-10-09)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eImport :data:\u003ccode\u003e~filelock.OwnerMode\u003c/code\u003e, :data:\u003ccode\u003e~filelock.CompromiseReason\u003c/code\u003e and :data:\u003ccode\u003e~filelock.has_fcntl\u003c/code\u003e from\n\u003ccode\u003efilelock\u003c/code\u003e. :pr:\u003ccode\u003e790\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:class:\u003ccode\u003e~filelock.AcquireReturnProxy\u003c/code\u003e is generic in the lock type, so \u003ccode\u003ewith lock.acquire() as held:\u003c/code\u003e types \u003ccode\u003eheld\u003c/code\u003e as\nthe lock's own class. :pr:\u003ccode\u003e803\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eA :class:\u003ccode\u003e~filelock.Timeout\u003c/code\u003e from a soft lock names a holder on another host or in another PID namespace, which no\ncontender ever reclaims. :pr:\u003ccode\u003e815\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:attr:\u003ccode\u003e~filelock.SoftFileLock.is_lock_held_by_us\u003c/code\u003e and :attr:\u003ccode\u003e~filelock.MarkerSoftFileLock.is_lock_held_by_us\u003c/code\u003e return\n\u003ccode\u003eFalse\u003c/code\u003e for a marker an earlier process with the same PID left behind. :pr:\u003ccode\u003e774\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:class:\u003ccode\u003e~filelock.SoftFileLock\u003c/code\u003e removes its marker when writing it fails and closing the descriptor fails too, so the\nlock path no longer stays blocked. :pr:\u003ccode\u003e775\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:meth:\u003ccode\u003e~filelock.BaseFileLock.acquire\u003c/code\u003e and :meth:\u003ccode\u003e~filelock.BaseAsyncFileLock.acquire\u003c/code\u003e no longer wait past \u003ccode\u003etimeout\u003c/code\u003e\nwhen \u003ccode\u003epoll_interval\u003c/code\u003e is longer than the time left. :pr:\u003ccode\u003e777\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:class:\u003ccode\u003e~filelock.SoftReadWriteLock\u003c/code\u003e ignores a generation-log entry whose name is not 20 ASCII digits, which used to\nstop its heartbeat thread or delete real generations. :pr:\u003ccode\u003e778\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:class:\u003ccode\u003e~filelock.ReadWriteLock\u003c/code\u003e, :class:\u003ccode\u003e~filelock.SoftReadWriteLock\u003c/code\u003e and their async wrappers treat a\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/5830a7e2c39d387ae5320bb3be1fbb2aa7742d4a\"\u003e\u003ccode\u003e5830a7e\u003c/code\u003e\u003c/a\u003e Release 4.1.1\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/a5fb607a8655035bb6d5ae4326637e25cf1af849\"\u003e\u003ccode\u003ea5fb607\u003c/code\u003e\u003c/a\u003e fix(read-write): reject a hostile pid in _owner_is_gone (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/821\"\u003e#821\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/4c6f32f2797b2883bbcb0cca1ee81211d3e09c12\"\u003e\u003ccode\u003e4c6f32f\u003c/code\u003e\u003c/a\u003e test: make lock error checks deterministic (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/817\"\u003e#817\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/f11f52357425943a6dbffd36ea1112726255f970\"\u003e\u003ccode\u003ef11f523\u003c/code\u003e\u003c/a\u003e fix(tests): bound concurrent lock progress (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/819\"\u003e#819\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/5fd0c8f2e6a778da1933204e4a95bd84db9cdd43\"\u003e\u003ccode\u003e5fd0c8f\u003c/code\u003e\u003c/a\u003e fix(rw): avoid macOS descriptor lookups (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/820\"\u003e#820\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/0c3aaabc75ca927b2530b7264a04b965d64acf55\"\u003e\u003ccode\u003e0c3aaab\u003c/code\u003e\u003c/a\u003e feat(python): default to Python 3.15 (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/816\"\u003e#816\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/6c0ecc28f898f08cd0438cd489c3eaabad79a4b7\"\u003e\u003ccode\u003e6c0ecc2\u003c/code\u003e\u003c/a\u003e Release 4.1.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/df06bbd640765ad3f1ed4a096cbe29e64b5592bb\"\u003e\u003ccode\u003edf06bbd\u003c/code\u003e\u003c/a\u003e 🐛 fix: close regressions since 4.0.12 (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/815\"\u003e#815\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/071204515d211b560d203cb68105ec06789eab46\"\u003e\u003ccode\u003e0712045\u003c/code\u003e\u003c/a\u003e 🐛 fix(read-write): refuse a database moved mid-acquire (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/808\"\u003e#808\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/73fefc1e907457dd9bc9793eeba52f183d7f9c40\"\u003e\u003ccode\u003e73fefc1\u003c/code\u003e\u003c/a\u003e 📝 docs: point canonical and og:url at versioned pages (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/813\"\u003e#813\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/tox-dev/py-filelock/compare/4.0.9...4.1.1\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `iniconfig` from 2.3.0 to 2.3.1\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pytest-dev/iniconfig/releases\"\u003einiconfig's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003eVersion 2.3.1\u003c/h2\u003e\n\u003ch2\u003eFixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eParsing values with many continuation lines is now linear instead of quadratic in time (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/78\"\u003e#78\u003c/a\u003e, regarding \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/77\"\u003e#77\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003eA leading UTF-8 BOM is now stripped when reading INI files. Files saved by Windows editors used to fail with \u003ccode\u003eParseError\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/76\"\u003e#76\u003c/a\u003e, thanks \u003ca href=\"https://github.com/Pitchfork-and-Torch\"\u003e\u003ccode\u003e@​Pitchfork-and-Torch\u003c/code\u003e\u003c/a\u003e).\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eInternal\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003einiconfig._parse.ParsedLine.value\u003c/code\u003e is now a list of lines. This is private API.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eDocs\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eThe README example now uses \u003ccode\u003eIniConfig.parse()\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/79\"\u003e#79\u003c/a\u003e, thanks \u003ca href=\"https://github.com/MbappeWU\"\u003e\u003ccode\u003e@​MbappeWU\u003c/code\u003e\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003eFixed the issue tracker link (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/74\"\u003e#74\u003c/a\u003e, thanks \u003ca href=\"https://github.com/stefan6419846\"\u003e\u003ccode\u003e@​stefan6419846\u003c/code\u003e\u003c/a\u003e).\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull diff:\u003c/strong\u003e \u003ca href=\"https://github.com/pytest-dev/iniconfig/compare/v2.3.0...v2.3.1\"\u003ehttps://github.com/pytest-dev/iniconfig/compare/v2.3.0...v2.3.1\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e[pre-commit.ci] pre-commit autoupdate by \u003ca href=\"https://github.com/pre-commit-ci\"\u003e\u003ccode\u003e@​pre-commit-ci\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/71\"\u003epytest-dev/iniconfig#71\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[pre-commit.ci] pre-commit autoupdate by \u003ca href=\"https://github.com/pre-commit-ci\"\u003e\u003ccode\u003e@​pre-commit-ci\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/72\"\u003epytest-dev/iniconfig#72\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix link to issues by \u003ca href=\"https://github.com/stefan6419846\"\u003e\u003ccode\u003e@​stefan6419846\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/74\"\u003epytest-dev/iniconfig#74\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eparse_lines: keep values as list of lines, join once by \u003ca href=\"https://github.com/RonnyPfannschmidt\"\u003e\u003ccode\u003e@​RonnyPfannschmidt\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/78\"\u003epytest-dev/iniconfig#78\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[pre-commit.ci] pre-commit autoupdate by \u003ca href=\"https://github.com/pre-commit-ci\"\u003e\u003ccode\u003e@​pre-commit-ci\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/73\"\u003epytest-dev/iniconfig#73\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003etest: expect sorted \u003cstrong\u003eall\u003c/strong\u003e after ruff autofix by \u003ca href=\"https://github.com/RonnyPfannschmidt\"\u003e\u003ccode\u003e@​RonnyPfannschmidt\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/80\"\u003epytest-dev/iniconfig#80\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003edocs: use parse API in the README example by \u003ca href=\"https://github.com/MbappeWU\"\u003e\u003ccode\u003e@​MbappeWU\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/79\"\u003epytest-dev/iniconfig#79\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eStrip leading UTF-8 BOM when reading INI files by \u003ca href=\"https://github.com/Pitchfork-and-Torch\"\u003e\u003ccode\u003e@​Pitchfork-and-Torch\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/76\"\u003epytest-dev/iniconfig#76\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echangelog: add BOM stripping (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/76\"\u003e#76\u003c/a\u003e) to 2.3.1 by \u003ca href=\"https://github.com/RonnyPfannschmidt\"\u003e\u003ccode\u003e@​RonnyPfannschmidt\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/81\"\u003epytest-dev/iniconfig#81\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/stefan6419846\"\u003e\u003ccode\u003e@​stefan6419846\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/74\"\u003epytest-dev/iniconfig#74\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/MbappeWU\"\u003e\u003ccode\u003e@​MbappeWU\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/79\"\u003epytest-dev/iniconfig#79\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/Pitchfork-and-Torch\"\u003e\u003ccode\u003e@​Pitchfork-and-Torch\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/76\"\u003epytest-dev/iniconfig#76\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pytest-dev/iniconfig/compare/v2.3.0...v2.3.1\"\u003ehttps://github.com/pytest-dev/iniconfig/compare/v2.3.0...v2.3.1\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pytest-dev/iniconfig/blob/main/CHANGELOG\"\u003einiconfig's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e2.3.1\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003efix quadratic parse time for values with many continuation lines (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/78\"\u003e#78\u003c/a\u003e, regarding \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/77\"\u003e#77\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003estrip a leading UTF-8 BOM when reading INI files, which previously raised \u003ccode\u003eParseError\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/76\"\u003e#76\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003einternal: \u003ccode\u003einiconfig._parse.ParsedLine.value\u003c/code\u003e is now a list of lines\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/316fbfaf2752d89326e1e75b45cd070f5b5ace9a\"\u003e\u003ccode\u003e316fbfa\u003c/code\u003e\u003c/a\u003e changelog: add BOM stripping (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/76\"\u003e#76\u003c/a\u003e) to 2.3.1 (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/81\"\u003e#81\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/d2dcb7289291e7e7019c183659814d42f7264b2d\"\u003e\u003ccode\u003ed2dcb72\u003c/code\u003e\u003c/a\u003e Strip leading UTF-8 BOM when reading INI files (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/76\"\u003e#76\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/40d8c03a1553953350d787e45f1cb768e2c14e6a\"\u003e\u003ccode\u003e40d8c03\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/79\"\u003e#79\u003c/a\u003e from MbappeWU/codex/docs-parse-inline-comments\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/48359c3a7c2c8648a134ea8469e802b5aa8d5030\"\u003e\u003ccode\u003e48359c3\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/80\"\u003e#80\u003c/a\u003e from pytest-dev/claude/fix-iniconfig-test-eukh2n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/b153213a011fa92f4370c83cef614cf73c987f57\"\u003e\u003ccode\u003eb153213\u003c/code\u003e\u003c/a\u003e test: expect sorted \u003cstrong\u003eall\u003c/strong\u003e after ruff RUF022 autofix\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/4fddfabc850afee28178931c62535ba1c2b30c72\"\u003e\u003ccode\u003e4fddfab\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/73\"\u003e#73\u003c/a\u003e from pytest-dev/pre-commit-ci-update-config\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/15852c2d1f9178ff960bf6c39a6f0f1495f1009e\"\u003e\u003ccode\u003e15852c2\u003c/code\u003e\u003c/a\u003e [pre-commit.ci] auto fixes from pre-commit.com hooks\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/2e68639c3f41ea5b693f89807172cf304c94fb9e\"\u003e\u003ccode\u003e2e68639\u003c/code\u003e\u003c/a\u003e [pre-commit.ci] pre-commit autoupdate\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/23c9e088a909f16d0d8dc03b5090c66964c428b0\"\u003e\u003ccode\u003e23c9e08\u003c/code\u003e\u003c/a\u003e docs: use parse API in the README example\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/e038536fbee6b5e76b180fce6694fd54661ced12\"\u003e\u003ccode\u003ee038536\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/78\"\u003e#78\u003c/a\u003e from RonnyPfannschmidt/claude/dazzling-einstein-h8zq7m\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/pytest-dev/iniconfig/compare/v2.3.0...v2.3.1\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `platformdirs` from 4.12.2 to 4.13.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/platformdirs/releases\"\u003eplatformdirs's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e4.13.0\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003efix: recognize Homebrew Cellar framework prefixes by \u003ca href=\"https://github.com/sricharanreddycheruku\"\u003e\u003ccode\u003e@​sricharanreddycheruku\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/612\"\u003etox-dev/platformdirs#612\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat(python): require 3.11 and default to 3.15 by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/613\"\u003etox-dev/platformdirs#613\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/sricharanreddycheruku\"\u003e\u003ccode\u003e@​sricharanreddycheruku\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/612\"\u003etox-dev/platformdirs#612\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/tox-dev/platformdirs/compare/4.12.4...4.13.0\"\u003ehttps://github.com/tox-dev/platformdirs/compare/4.12.4...4.13.0\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e4.12.4\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eci: download coverage during tool setup by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/609\"\u003etox-dev/platformdirs#609\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(api): keep root's site dir readable in place_*_file by \u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/610\"\u003etox-dev/platformdirs#610\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix: fall back from unreachable runtime directory with ensure_exists by \u003ca href=\"https://github.com/harbinresearcher\"\u003e\u003ccode\u003e@​harbinresearcher\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/611\"\u003etox-dev/platformdirs#611\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/harbinresearcher\"\u003e\u003ccode\u003e@​harbinresearcher\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/611\"\u003etox-dev/platformdirs#611\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/tox-dev/platformdirs/compare/4.12.3...4.12.4\"\u003ehttps://github.com/tox-dev/platformdirs/compare/4.12.3...4.12.4\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e4.12.3\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003ePlace root config and data files in the first site directory by \u003ca href=\"https://github.com/PDGGK\"\u003e\u003ccode\u003e@​PDGGK\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/607\"\u003etox-dev/platformdirs#607\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/PDGGK\"\u003e\u003ccode\u003e@​PDGGK\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/607\"\u003etox-dev/platformdirs#607\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/tox-dev/platformdirs/compare/4.12.2...4.12.3\"\u003ehttps://github.com/tox-dev/platformdirs/compare/4.12.2...4.12.3\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/platformdirs/blob/main/docs/changelog.rst\"\u003eplatformdirs's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e###########\nChangelog\n###########\u003c/p\u003e\n\u003cp\u003e.. towncrier-draft-entries:: Unreleased\u003c/p\u003e\n\u003cp\u003e.. towncrier release notes start\u003c/p\u003e\n\u003chr /\u003e\n\u003cp\u003e4.13.0 (2026-10-10)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eDetect Homebrew Python for the :class:\u003ccode\u003e~platformdirs.macos.MacOS\u003c/code\u003e site directories under :option:\u003ccode\u003epython:-S\u003c/code\u003e, which\nleaves :data:\u003ccode\u003esys.base_prefix\u003c/code\u003e on the \u003ccode\u003eCellar\u003c/code\u003e keg, and for the \u003ccode\u003epython-freethreading\u003c/code\u003e formula - by\n:user:\u003ccode\u003esricharanreddycheruku\u003c/code\u003e. :pr:\u003ccode\u003e612\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eUse Python 3.15 for development and automation. :pr:\u003ccode\u003e613\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.12.4 (2026-10-07)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eKeep site directories readable by other users when root calls\n:meth:\u003ccode\u003e~platformdirs.api.PlatformDirsABC.place_config_file\u003c/code\u003e or another \u003ccode\u003eplace_*_file\u003c/code\u003e method with\n:attr:\u003ccode\u003e~platformdirs.api.PlatformDirsABC.use_site_for_root\u003c/code\u003e - by :user:\u003ccode\u003edarrenhuai\u003c/code\u003e. :pr:\u003ccode\u003e610\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eMake :func:\u003ccode\u003e~platformdirs.user_runtime_dir\u003c/code\u003e warn and fall back from an unreachable \u003ccode\u003eXDG_RUNTIME_DIR\u003c/code\u003e under\n:attr:\u003ccode\u003e~platformdirs.api.PlatformDirsABC.ensure_exists\u003c/code\u003e instead of raising. :pr:\u003ccode\u003e611\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.12.3 (2026-10-03)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003ePlace files from \u003ccode\u003eplace_config_file\u003c/code\u003e and \u003ccode\u003eplace_data_file\u003c/code\u003e in the first site directory for root on Unix with\n\u003ccode\u003euse_site_for_root=True\u003c/code\u003e and \u003ccode\u003emultipath=True\u003c/code\u003e, where \u003ccode\u003efind_config_file\u003c/code\u003e and \u003ccode\u003efind_data_file\u003c/code\u003e look for them.\n:pr:\u003ccode\u003e607\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.12.2 (2026-09-29)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eKeep \u003ccode\u003eos.pathsep\u003c/code\u003e in \u003ccode\u003esite_applications_path\u003c/code\u003e under \u003ccode\u003emultipath=True\u003c/code\u003e on platforms with one applications\ndirectory. :pr:\u003ccode\u003e604\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.12.1 (2026-09-28)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eAvoid \u003ccode\u003ePytestAssertRewriteWarning\u003c/code\u003e when importing \u003ccode\u003eplatformdirs\u003c/code\u003e before invoking pytest. :pr:\u003ccode\u003e601\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.12.0 (2026-09-26)\u003c/p\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/f05fb4ef31f38dfc316802c5301db972fd75468e\"\u003e\u003ccode\u003ef05fb4e\u003c/code\u003e\u003c/a\u003e Release 4.13.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/b3174fdd4e80c83d72cf723fd2a7bb6cb54cbd5f\"\u003e\u003ccode\u003eb3174fd\u003c/code\u003e\u003c/a\u003e feat(python): require 3.11 and default to 3.15 (\u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/issues/613\"\u003e#613\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/d7eb4fe34231df80a6b1c7abc362aa504feddbf1\"\u003e\u003ccode\u003ed7eb4fe\u003c/code\u003e\u003c/a\u003e fix: recognize Homebrew Cellar framework prefixes (\u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/issues/612\"\u003e#612\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/19338a4fdfc0cdd6b5342ec137efd9e5613d67d2\"\u003e\u003ccode\u003e19338a4\u003c/code\u003e\u003c/a\u003e Release 4.12.4\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/f2a4fa944f3637c8e7aa1fe8e95c9adfefe8ed2c\"\u003e\u003ccode\u003ef2a4fa9\u003c/code\u003e\u003c/a\u003e fix: fall back from unreachable runtime directory with ensure_exists (\u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/issues/611\"\u003e#611\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/16429e2135fa70b314ef69fa7da4d5e746eb75c9\"\u003e\u003ccode\u003e16429e2\u003c/code\u003e\u003c/a\u003e 🐛 fix(api): keep root's site dir readable in place_*_file (\u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/issues/610\"\u003e#610\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/b9735d3c9f4a0b5ca4dafc15b53541fe3973f453\"\u003e\u003ccode\u003eb9735d3\u003c/code\u003e\u003c/a\u003e ci: download coverage during tool setup (\u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/issues/609\"\u003e#609\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/344f2497bce1fba7838ef112f2bd91e9d5f23b58\"\u003e\u003ccode\u003e344f249\u003c/code\u003e\u003c/a\u003e [pre-commit.ci] pre-commit autoupdate (\u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/issues/608\"\u003e#608\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/960ff632eb575deb6f0d5bf49519d5a2ee2098b6\"\u003e\u003ccode\u003e960ff63\u003c/code\u003e\u003c/a\u003e Release 4.12.3\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/8047ad5bf0e5fd3db9c8ce9f250f73c3d961fe19\"\u003e\u003ccode\u003e8047ad5\u003c/code\u003e\u003c/a\u003e Place root config and data files in the first site directory (\u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/issues/607\"\u003e#607\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/tox-dev/platformdirs/compare/4.12.2...4.13.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `python-discovery` from 1.6.1 to 1.6.2\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/python-discovery/releases\"\u003epython-discovery's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev1.6.2\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003efix: ignore broken sphinx-llm release by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/pull/134\"\u003etox-dev/python-discovery#134\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e👷 ci: pin ubuntu-26.04 and bump dependencies by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/pull/138\"\u003etox-dev/python-discovery#138\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eci: run old Python checks in parallel by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/pull/140\"\u003etox-dev/python-discovery#140\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat(python): default to 3.15 and match virtualenv by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/pull/142\"\u003etox-dev/python-discovery#142\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(cache): discard unusable interpreter cache entries by \u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/pull/141\"\u003etox-dev/python-discovery#141\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(query): validate PY_DISCOVERY_TIMEOUT by \u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/pull/143\"\u003etox-dev/python-discovery#143\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/pull/141\"\u003etox-dev/python-discovery#141\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/tox-dev/python-discovery/compare/1.6.1...1.6.2\"\u003ehttps://github.com/tox-dev/python-discovery/compare/1.6.1...1.6.2\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/python-discovery/blob/main/docs/changelog.rst\"\u003epython-discovery's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003eBug fixes - 1.6.2\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eDiscard malformed interpreter cache entries and query the interpreter again, including entries with missing,\nnon-string or unusable \u003ccode\u003esystem_executable\u003c/code\u003e paths - by :user:\u003ccode\u003edarrenhuai\u003c/code\u003e. (:issue:\u003ccode\u003e141\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eUse the default interpreter query timeout and warn for invalid \u003ccode\u003ePY_DISCOVERY_TIMEOUT\u003c/code\u003e values. Accept \u003ccode\u003einf\u003c/code\u003e\nor values above the subprocess wait limit to disable the timeout - by :user:\u003ccode\u003edarrenhuai\u003c/code\u003e. (:issue:\u003ccode\u003e143\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003ev1.6.1 (2026-09-18)\u003c/p\u003e\n\u003chr /\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/4fe2ade736e5191de42ca3d4a0b8bf672ffc5652\"\u003e\u003ccode\u003e4fe2ade\u003c/code\u003e\u003c/a\u003e release 1.6.2\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/60ddef109aafdd6d54aa25c8057a569c76e3dba2\"\u003e\u003ccode\u003e60ddef1\u003c/code\u003e\u003c/a\u003e fix(query): validate PY_DISCOVERY_TIMEOUT (\u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/issues/143\"\u003e#143\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/eb1eab726924245c533ad867d1b4bcc4c47b6d2a\"\u003e\u003ccode\u003eeb1eab7\u003c/code\u003e\u003c/a\u003e fix(cache): discard unusable interpreter cache entries (\u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/issues/141\"\u003e#141\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/db810b8206339892c0cd15f000b8e18860a8b913\"\u003e\u003ccode\u003edb810b8\u003c/code\u003e\u003c/a\u003e feat(python): default to 3.15 and match virtualenv (\u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/issues/142\"\u003e#142\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/614afa4adaa5fb36daf38919e3c407af71f3260b\"\u003e\u003ccode\u003e614afa4\u003c/code\u003e\u003c/a\u003e ci: run old Python checks in parallel (\u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/issues/140\"\u003e#140\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/9148aa454b276b5745d56bb2a42bdc8f26ee7f55\"\u003e\u003ccode\u003e9148aa4\u003c/code\u003e\u003c/a\u003e [pre-commit.ci] pre-commit autoupdate (\u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/issues/139\"\u003e#139\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/a69c0d9139ff0f1276d318d75d25d59cbc172bf4\"\u003e\u003ccode\u003ea69c0d9\u003c/code\u003e\u003c/a\u003e 👷 ci: pin ubuntu-26.04 and bump dependencies (\u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/issues/138\"\u003e#138\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/c8fcbf599ac401c8b1ad793187b28e45ccd1ffc8\"\u003e\u003ccode\u003ec8fcbf5\u003c/code\u003e\u003c/a\u003e build(deps): bump astral-sh/setup-uv from 10.1.0 to 10.2.0 in the github-acti...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/f0b3a2030c57a4f9217cd6ab09f837123ad0bc17\"\u003e\u003ccode\u003ef0b3a20\u003c/code\u003e\u003c/a\u003e [pre-commit.ci] pre-commit autoupdate (\u003ca href=\"https://redirect.github.com/tox-dev/python-discovery/issues/136\"\u003e#136\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/python-discovery/commit/b4eea32e584c0c1f08c9ad4b9f5850cb8c2275da\"\u003e\u003ccode\u003eb4eea32\u003c/code\u003e\u003c/a\u003e build(deps): bump astral-sh/setup-uv from 10.0.1 to 10.1.0 in the github-acti...\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/tox-dev/python-discovery/compare/1.6.1...1.6.2\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `rpds-py` from 2026.6.3 to 2026.9.1\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/crate-py/rpds/commit/fc7a1853152f23ee056c07fc97bb2a63557553ed\"\u003e\u003ccode\u003efc7a185\u003c/code\u003e\u003c/a\u003e Release rpds-py version 2026.9.1\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/crate-py/rpds/commit/d19ef61c41045976356e869a0490c40e11b701f7\"\u003e\u003ccode\u003ed19ef61\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/crate-py/rpds/issues/311\"\u003e#311\u003c/a\u003e from edgarrmondragon/pypy312\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/crate-py/rpds/commit/47ac82fa8f7303d3a72dac0d336f0a7792631f18\"\u003e\u003ccode\u003e47ac82f\u003c/code\u003e\u003c/a\u003e Bump PyO3 to 0.29.3 and start building PyPy 3.12 wheels\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/crate-py/rpds/commit/cf0900dee2eb945f38124893c306116829215b2b\"\u003e\u003ccode\u003ecf0900d\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/crate-py/rpds/issues/308\"\u003e#308\u003c/a\u003e from crate-py/dependabot/github_actions/github/codeql...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/crate-py/rpds/commit/204fd02dd2c1c7c1efa722dc151be68e865a60de\"\u003e\u003ccode\u003e204fd02\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/crate-py/rpds/issues/309\"\u003e#309\u003c/a\u003e from crate-py/dependabot/github_actions/astral-sh/set...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/crate-py/rpds/commit/264fdef59c9c85a0d9ff1ff603cfc7f15739d169\"\u003e\u003ccode\u003e264fdef\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/crate-py/rpds/issues/310\"\u003e#310\u003c/a\u003e from crate-py/pre-commit-ci-update-config\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/crate-py/rpds/commit/5ddee5c339c87c591b3ed85b848a677e5f43ddc5\"\u003e\u003ccode\u003e5ddee5c\u003c/code\u003e\u003c/a\u003e [pre-commit.ci] pre-commit autoupdate\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/crate-py/rpds/commit/9fe33188f058b7686775737bc839ec076956ec21\"\u003e\u003ccode\u003e9fe3318\u003c/code\u003e\u003c/a\u003e Bump astral-sh/setup-uv from 10.1.0 to 10.2.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/crate-py/rpds/commit/2302c70d7db939ce0fc77215923a790179a21e0f\"\u003e\u003ccode\u003e2302c70\u003c/code\u003e\u003c/a\u003e Bump github/codeql-action/upload-sarif from 4.38.0 to 4.38.1\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/crate-py/rpds/commit/93bbcbbb62008402aecfdbd8830377d1e2270514\"\u003e\u003ccode\u003e93bbcbb\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/crate-py/rpds/issues/305\"\u003e#305\u003c/a\u003e from crate-py/dependabot/github_actions/astral-sh/set...\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/crate-py/rpds/compare/v2026.6.3...v2026.9.1\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `tomli` from 2.4.1 to 2.5.0\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/hukkin/tomli/blob/master/CHANGELOG.md\"\u003etomli's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e2.5.0\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eAdded\n\u003cul\u003e\n\u003cli\u003eBinary wheels for Python 3.15\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eFixed\n\u003cul\u003e\n\u003cli\u003eSet nested inline array/table limit to 400 to fix mypyc generated binaries crashing unrecoverably in constrained environments (e.g. worker thread in a \u003ccode\u003epython:3.13-alpine\u003c/code\u003e image)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e2.3.1\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eFixed\n\u003cul\u003e\n\u003cli\u003eBackport: Limit number of parts of a TOML key to address quadratic time complexity\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/hukkin/tomli/commit/a2a578949199336ebc3884eeba4aede87da41ef2\"\u003e\u003ccode\u003ea2a5789\u003c/code\u003e\u003c/a\u003e Bump version: 2.4.1 → 2.5.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/hukkin/tomli/commit/94a60819c4f0b244829513f19f3caf64ef16b466\"\u003e\u003ccode\u003e94a6081\u003c/code\u003e\u003c/a\u003e Add 2.5.0 changelog\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/hukkin/tomli/commit/85f8748d51e42f4bb1f4969e3911fa8e52eaa7b5\"\u003e\u003ccode\u003e85f8748\u003c/code\u003e\u003c/a\u003e Update README.md\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/hukkin/tomli/commit/70fd4609dd97ea30ade101a4c8deb37ff2d694ed\"\u003e\u003ccode\u003e70fd460\u003c/code\u003e\u003c/a\u003e Allow flit_core v4\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/hukkin/tomli/commit/00d06107cad00485e1d4eb0b51a2ec3980d52c1c\"\u003e\u003ccode\u003e00d0610\u003c/code\u003e\u003c/a\u003e Update pre-commit\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/hukkin/tomli/commit/eb93c1225a5540e61a3a4054673e364fc6efe307\"\u003e\u003ccode\u003eeb93c12\u003c/code\u003e\u003c/a\u003e Improve tomllib compatibility and sync docs (\u003ca href=\"https://redirect.github.com/hukkin/tomli/issues/299\"\u003e#299\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/hukkin/tomli/commit/18d8d59db6d632ebbcfe63f1f7636145d652da21\"\u003e\u003ccode\u003e18d8d59\u003c/code\u003e\u003c/a\u003e Bump cibuildwheel for Python 3.15 wheels (\u003ca href=\"https://redirect.github.com/hukkin/tomli/issues/317\"\u003e#317\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/hukkin/tomli/commit/1e6e869aa9dbbddc492608944e82d9ad5397280f\"\u003e\u003ccode\u003e1e6e869\u003c/code\u003e\u003c/a\u003e Set smaller MAX_INLINE_NESTING to avoid python:3.13-alpine worker thread crash\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/hukkin/tomli/commit/c3299981db699cacabbd6edd0e32934f5e3e600b\"\u003e\u003ccode\u003ec329998\u003c/code\u003e\u003c/a\u003e Use Trusted Publishing\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/hukkin/tomli/commit/ba611c5a97da9226533e3c39d5c46c0b55b80acb\"\u003e\u003ccode\u003eba611c5\u003c/code\u003e\u003c/a\u003e Add zizmor security scanner to pre-commit (\u003ca href=\"https://redirect.github.com/hukkin/tomli/issues/301\"\u003e#301\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/hukkin/tomli/compare/2.4.1...2.5.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `types-requests` from 2.33.0.20260906 to 2.33.0.20261006\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/python/typeshed/commits\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `virtualenv` from 21.14.3 to 21.14.6\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pypa/virtualenv/releases\"\u003evirtualenv's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e21.14.6\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e👷 ci: pin ubuntu-26.04, clear warnings, bump deps by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3378\"\u003epypa/virtualenv#3378\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(ci): defer upgrades blocked by release age by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3379\"\u003epypa/virtualenv#3379\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eci: overlap release transfers and verification by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3382\"\u003epypa/virtualenv#3382\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(seed): guard every embed update log read, not just one by \u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3383\"\u003epypa/virtualenv#3383\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.14.5...21.14.6\"\u003ehttps://github.com/pypa/virtualenv/compare/21.14.5...21.14.6\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e21.14.5\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e🎨 style(test): mark prompt fixture locals Final by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3374\"\u003epypa/virtualenv#3374\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🎨 style: give every Final annotation its type by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3375\"\u003epypa/virtualenv#3375\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(ci): dump stacks from a thread that holds the GIL by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3377\"\u003epypa/virtualenv#3377\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eReset the embed update log when it cannot be read by \u003ca href=\"https://github.com/pasmud\"\u003e\u003ccode\u003e@​pasmud\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3376\"\u003epypa/virtualenv#3376\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.14.4...21.14.5\"\u003ehttps://github.com/pypa/virtualenv/compare/21.14.4...21.14.5\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e21.14.4\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eUpgrade embedded pip/setuptools/wheel and CI test tools by \u003ca href=\"https://github.com/github-actions\"\u003e\u003ccode\u003e@​github-actions\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3372\"\u003epypa/virtualenv#3372\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e📝 docs(changelog): note the zsh prompt fix by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3373\"\u003epypa/virtualenv#3373\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.14.3...21.14.4\"\u003ehttps://github.com/pypa/virtualenv/compare/21.14.3...21.14.4\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pypa/virtualenv/blob/main/docs/changelog.rst\"\u003evirtualenv's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003eBugfixes - 21.14.6\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eFall back to the bundled seed wheel with periodic update on (the default) when the embed update log holds JSON of the\nwrong shape, instead of downloading the wheel or, offline, failing to create the environment - by :user:\u003ccode\u003edarrenhuai\u003c/code\u003e.\n(:issue:\u003ccode\u003e3383\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003ev21.14.5 (2026-10-02)\u003c/p\u003e\n\u003chr /\u003e\n\u003ch1\u003eBugfixes - 21.14.5\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eFall back to the bundled seed wheel and remove the embed update log when the log in the app data folder holds JSON of\nthe wrong shape, instead of failing to create the environment - by :user:\u003ccode\u003epasmud\u003c/code\u003e. (:issue:\u003ccode\u003e3376\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003ev21.14.4 (2026-10-02)\u003c/p\u003e\n\u003chr /\u003e\n\u003ch1\u003eBugfixes - 21.14.4\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eFix \u003ccode\u003eactivate\u003c/code\u003e running commands from a virtual environment name or \u003ccode\u003e--prompt\u003c/code\u003e that holds \u003ccode\u003e$(...)\u003c/code\u003e, backticks or\n\u003ccode\u003e${...}\u003c/code\u003e when zsh has \u003ccode\u003ePROMPT_SUBST\u003c/code\u003e set, and show a \u003ccode\u003e%\u003c/code\u003e in the name as typed under zsh (\u003ccode\u003eGHSA-5vjq-rrrf-7h2q \u0026lt;https://github.com/pypa/virtualenv/security/advisories/GHSA-5vjq-rrrf-7h2q\u0026gt;\u003c/code\u003e_); reported by :user:\u003ccode\u003ekemrec\u003c/code\u003e.\n(:issue:\u003ccode\u003e3373\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003ev21.14.3 (2026-10-01)\u003c/p\u003e\n\u003chr /\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/9e69ac725fd4dc83726536c084ab9ca4f099c5b6\"\u003e\u003ccode\u003e9e69ac7\u003c/code\u003e\u003c/a\u003e release 21.14.6\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/464c34b696c81190cd1ad6589158f6ce59467351\"\u003e\u003ccode\u003e464c34b\u003c/code\u003e\u003c/a\u003e 🐛 fix(seed): guard every embed update log read, not just one (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3383\"\u003e#3383\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/3f56d7f4b88884296249b83889d717c41ed6e668\"\u003e\u003ccode\u003e3f56d7f\u003c/code\u003e\u003c/a\u003e ci: overlap release transfers and verification (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3382\"\u003e#3382\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/7577efd46b0e62c5edbd803ded2788eb6d48f5ca\"\u003e\u003ccode\u003e7577efd\u003c/code\u003e\u003c/a\u003e chore(deps): bump the runtime-dependencies group with 10 updates (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3381\"\u003e#3381\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/f6d172367b48d5138fcab911ff8fdd86b4e8cdaf\"\u003e\u003ccode\u003ef6d1723\u003c/code\u003e\u003c/a\u003e [pre-commit.ci] pre-commit autoupdate (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3380\"\u003e#3380\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/7c56749d7b3065f6a99b21fd61089ba692e4aaec\"\u003e\u003ccode\u003e7c56749\u003c/code\u003e\u003c/a\u003e fix(ci): defer upgrades blocked by release age (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3379\"\u003e#3379\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/95d02526dc5f2c569767d8ee572f72f571b8a6ce\"\u003e\u003ccode\u003e95d0252\u003c/code\u003e\u003c/a\u003e 👷 ci: pin ubuntu-26.04, clear warnings, bump deps (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3378\"\u003e#3378\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/571bc2041dae5ecbd250d82ec7ef482cfd3c3b69\"\u003e\u003ccode\u003e571bc20\u003c/code\u003e\u003c/a\u003e release 21.14.5\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/5b9b7de4f2f850d94deec4d5a9764e7b879e8865\"\u003e\u003ccode\u003e5b9b7de\u003c/code\u003e\u003c/a\u003e Reset the embed update log when it cannot be read (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3376\"\u003e#3376\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/9fd48c89ad6986d37d20598fd3d8bb5eee94ecba\"\u003e\u003ccode\u003e9fd48c8\u003c/code\u003e\u003c/a\u003e 🐛 fix(ci): dump stacks from a thread that holds the GIL (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3377\"\u003e#3377\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.14.3...21.14.6\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore \u003cdependency name\u003e major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself)\n- `@dependabot ignore \u003cdependency name\u003e minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself)\n- `@dependabot ignore \u003cdependency name\u003e` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself)\n- `@dependabot unignore \u003cdependency name\u003e` will remove all of the ignore conditions of the specified dependency\n- `@dependabot unignore \u003cdependency name\u003e \u003cignore condition\u003e` will remove the ignore condition of the specified dependency and ignore conditions\n\n\n\u003c/details\u003e","html_url":"https://github.com/aisecnomad/Nexus-ShadowScan/pull/223","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/aisecnomad%2FNexus-ShadowScan/issues/223","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/223/packages"}},{"old_version":"21.9.0","new_version":"21.11.0","update_type":"minor","path":null,"pr_created_at":"2026-10-14T12:34:28.000Z","version_change":"21.9.0 → 21.11.0","issue":{"uuid":"5847869070","node_id":"PR_kwDOKfFlGM8AAAABIY5KHQ","number":556,"state":"open","title":"Bump virtualenv from 21.9.0 to 21.11.0","user":"dependabot[bot]","labels":["dependencies","python"],"assignees":[],"locked":false,"comments_count":2,"pull_request":true,"closed_at":null,"author_association":null,"state_reason":null,"created_at":"2026-10-14T12:34:28.000Z","updated_at":"2026-10-14T12:38:45.000Z","time_to_close":null,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"Bump","packages":[{"name":"virtualenv","old_version":"21.9.0","new_version":"21.11.0","repository_url":"https://github.com/pypa/virtualenv"}],"path":null,"ecosystem":"pip"},"body":"Bumps [virtualenv](https://github.com/pypa/virtualenv) from 21.9.0 to 21.11.0.\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pypa/virtualenv/releases\"\u003evirtualenv's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e21.11.0\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eci(pre-release): disable the uv cache by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3288\"\u003epypa/virtualenv#3288\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eci: pass expressions to run scripts via env by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3292\"\u003epypa/virtualenv#3292\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eci(release): audit egress in build and publish by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3289\"\u003epypa/virtualenv#3289\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e📝 docs: define maintainer roles and access by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3290\"\u003epypa/virtualenv#3290\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eci: resolve zizmor auditor findings by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3297\"\u003epypa/virtualenv#3297\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eci(pre-commit): freeze hook revs to commit SHAs by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3298\"\u003epypa/virtualenv#3298\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003edocs: link docs and pyvideo over https by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3300\"\u003epypa/virtualenv#3300\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003edocs(development): add a one-year roadmap by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3304\"\u003epypa/virtualenv#3304\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(seed): fail closed when PyPI digest is unknown by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3302\"\u003epypa/virtualenv#3302\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e✨ feat(release): publish SBOMs as release assets by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3299\"\u003epypa/virtualenv#3299\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003edocs(security): describe the project under the CRA by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3295\"\u003epypa/virtualenv#3295\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003edocs(template): name the trust boundary crossed by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3296\"\u003epypa/virtualenv#3296\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e♻️ refactor(sbom): type the SPDX renderer by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3307\"\u003epypa/virtualenv#3307\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e✨ feat(zipapp): publish an SBOM for the zipapp by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3310\"\u003epypa/virtualenv#3310\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e👷 ci(check): pin test tool downloads and bump them weekly by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3293\"\u003epypa/virtualenv#3293\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e📝 docs: explain what a release publishes and how to verify it by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3305\"\u003epypa/virtualenv#3305\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e👷 ci(release): verify the zipapp served by bootstrap.pypa.io by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3309\"\u003epypa/virtualenv#3309\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e👷 ci(release): mint app tokens instead of a PAT by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3301\"\u003epypa/virtualenv#3301\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e📝 docs(security): add threat model and assurance case by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3294\"\u003epypa/virtualenv#3294\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(zipapp): bundle wheels pinned by a PEP 751 lock by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3306\"\u003epypa/virtualenv#3306\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e📝 docs(security): sync threat model with merged fixes by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3312\"\u003epypa/virtualenv#3312\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(sbom): keep the build machine out of the SBOMs by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3311\"\u003epypa/virtualenv#3311\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.10.0...21.11.0\"\u003ehttps://github.com/pypa/virtualenv/compare/21.10.0...21.11.0\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e21.10.0\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003efeat: allow filelock 4.x on Python 3.10+ by \u003ca href=\"https://github.com/r3wretrhy\"\u003e\u003ccode\u003e@​r3wretrhy\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3286\"\u003epypa/virtualenv#3286\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(batch): reject paths altered by quoting by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3280\"\u003epypa/virtualenv#3280\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003etest(upgrade): verify generator convergence by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3282\"\u003epypa/virtualenv#3282\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eci(release): verify published artifacts by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3284\"\u003epypa/virtualenv#3284\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(upgrade): isolate generation credentials by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3283\"\u003epypa/virtualenv#3283\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat(sbom): identify vendored packages by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3281\"\u003epypa/virtualenv#3281\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.9.1...21.10.0\"\u003ehttps://github.com/pypa/virtualenv/compare/21.9.1...21.10.0\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e21.9.1\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e🐛 fix(upgrade): format generated notices by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3272\"\u003epypa/virtualenv#3272\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(release): preserve partial publications by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3279\"\u003epypa/virtualenv#3279\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pypa/virtualenv/blob/main/docs/changelog.rst\"\u003evirtualenv's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003eFeatures - 21.11.0\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eAttach the CycloneDX SBOM and an SPDX 2.3 rendering of it (\u003ccode\u003evirtualenv.cdx.json\u003c/code\u003e, \u003ccode\u003evirtualenv.spdx.json\u003c/code\u003e) to each\nGitHub release, and attest the SPDX document against the sdist and wheel. (:issue:\u003ccode\u003e3299\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eDescribe the zipapp in its own CycloneDX SBOM, which lists virtualenv, the embedded pip and setuptools wheels, and\neach bundled dependency with the Python versions that load it, down to a SHA-256 per file. The SBOM sits at the root\nof \u003ccode\u003evirtualenv.pyz\u003c/code\u003e, ships as the \u003ccode\u003evirtualenv.pyz.cdx.json\u003c/code\u003e release asset, and GitHub attests it against the\nzipapp. (:issue:\u003ccode\u003e3310\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch1\u003eBugfixes - 21.11.0\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eRefuse a seed wheel downloaded from the default index when virtualenv cannot get its sha256 from PyPI after three\nretries, instead of seeding it unverified. Seeding falls back to the bundled wheel unless a specific version was\nrequested. (:issue:\u003ccode\u003e3302\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eBuild the zipapp from the dependency wheels that \u003ccode\u003epylock.zipapp.toml\u003c/code\u003e pins by URL and sha256, so a release bundles\nonly files matching the committed hashes. (:issue:\u003ccode\u003e3306\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eLeave the build machine out of the wheel and zipapp SBOMs, so the wheel rebuilds byte for byte on any operating system\nand architecture given the same source, \u003ccode\u003eSOURCE_DATE_EPOCH\u003c/code\u003e, Python patch version and build backend versions. Zipapp\nentries now carry the \u003ccode\u003eSOURCE_DATE_EPOCH\u003c/code\u003e timestamp and fixed permissions instead of the build time. (:issue:\u003ccode\u003e3311\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch1\u003eImproved Documentation - 21.11.0\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eDocument the backup maintainer and the two-factor authentication and access review expectations for maintainers.\n(:issue:\u003ccode\u003e3290\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eLink the Carl Meyer talk on the home page over HTTPS - by :user:\u003ccode\u003egaborbernat\u003c/code\u003e. (:issue:\u003ccode\u003e3300\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eAdd a roadmap to the development guide listing what the project plans to do, and not do, through September 2027 - by\n:user:\u003ccode\u003egaborbernat\u003c/code\u003e. (:issue:\u003ccode\u003e3304\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eDocument what a release publishes and how to verify each file, covering the PyPI attestations, the zipapp and its\nprovenance, the CycloneDX and SPDX SBOMs of the wheel, the zipapp SBOM, and rebuilding the sdist from its tag.\n(:issue:\u003ccode\u003e3305\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003ev21.10.0 (2026-09-22)\u003c/p\u003e\n\u003chr /\u003e\n\u003ch1\u003eFeatures - 21.10.0\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eInclude versioned identities for packages vendored inside seed wheels in the embedded SBOM. (:issue:\u003ccode\u003e3281\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eAllow \u003ccode\u003efilelock\u003c/code\u003e 4.x on Python 3.10+ by relaxing the upper bound from \u003ccode\u003e\u0026lt;4\u003c/code\u003e to \u003ccode\u003e\u0026lt;5\u003c/code\u003e - by :user:\u003ccode\u003er3wretrhy\u003c/code\u003e.\n(:issue:\u003ccode\u003e3285\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch1\u003eBugfixes - 21.10.0\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eSkip Windows batch activation scripts when environment or Tcl/Tk paths contain \u003ccode\u003e^\u003c/code\u003e or \u003ccode\u003e!\u003c/code\u003e, since quoting changes\nthose paths. Other activation scripts remain available. (:issue:\u003ccode\u003e3280\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/49077e788f2b22bfc7c00616e2008b250905846b\"\u003e\u003ccode\u003e49077e7\u003c/code\u003e\u003c/a\u003e release 21.11.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/5d9dc5843f5fca7669e7998868cca450dee1bf70\"\u003e\u003ccode\u003e5d9dc58\u003c/code\u003e\u003c/a\u003e 🐛 fix(sbom): keep the build machine out of the SBOMs (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3311\"\u003e#3311\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/bcb0fa61f4d6364f5c8be923871dcfca3fccba22\"\u003e\u003ccode\u003ebcb0fa6\u003c/code\u003e\u003c/a\u003e 📝 docs(security): sync threat model with merged fixes (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3312\"\u003e#3312\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/b80a3bdfc674a995d28c1e9ce5235a5ae9ae22d9\"\u003e\u003ccode\u003eb80a3bd\u003c/code\u003e\u003c/a\u003e 🐛 fix(zipapp): bundle wheels pinned by a PEP 751 lock (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3306\"\u003e#3306\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/29fba3940ae5bb4b92d6dd63291b045f696b10ed\"\u003e\u003ccode\u003e29fba39\u003c/code\u003e\u003c/a\u003e 📝 docs(security): add threat model and assurance case (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3294\"\u003e#3294\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/4608b9dbe07d05053b3a01db3e8bed3c0601e3d6\"\u003e\u003ccode\u003e4608b9d\u003c/code\u003e\u003c/a\u003e 👷 ci(release): mint app tokens instead of a PAT (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3301\"\u003e#3301\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/d10b8e82c94014a28c0caaeea11d3a715e068a98\"\u003e\u003ccode\u003ed10b8e8\u003c/code\u003e\u003c/a\u003e 👷 ci(release): verify the zipapp served by bootstrap.pypa.io (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3309\"\u003e#3309\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/1ad97020c18bf4272e78988d46b9973c4a431181\"\u003e\u003ccode\u003e1ad9702\u003c/code\u003e\u003c/a\u003e 📝 docs: explain what a release publishes and how to verify it (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3305\"\u003e#3305\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/6f7d4424f05b08ed7709dd72b6b1b59fde330458\"\u003e\u003ccode\u003e6f7d442\u003c/code\u003e\u003c/a\u003e 👷 ci(check): pin test tool downloads and bump them weekly (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3293\"\u003e#3293\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/7af56ffa217558800ef52fe464179b915544bb6e\"\u003e\u003ccode\u003e7af56ff\u003c/code\u003e\u003c/a\u003e ✨ feat(zipapp): publish an SBOM for the zipapp (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3310\"\u003e#3310\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.9.0...21.11.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=virtualenv\u0026package-manager=pip\u0026previous-version=21.9.0\u0026new-version=21.11.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n\n\n\u003c/details\u003e","html_url":"https://github.com/senzing-garage/sz-sdk-python-core/pull/556","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/senzing-garage%2Fsz-sdk-python-core/issues/556","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/556/packages"}},{"old_version":"20.31.2","new_version":"21.14.6","update_type":"major","path":null,"pr_created_at":"2026-10-14T12:24:44.000Z","version_change":"20.31.2 → 21.14.6","issue":{"uuid":"5847725221","node_id":"PR_kwDOS8i2VM8AAAABIYxyPQ","number":145,"state":"closed","title":"Bump virtualenv from 20.31.2 to 21.14.6","user":"dependabot[bot]","labels":["dependencies"],"assignees":[],"locked":false,"comments_count":2,"pull_request":true,"closed_at":"2026-10-15T06:22:50.000Z","author_association":null,"state_reason":null,"created_at":"2026-10-14T12:24:44.000Z","updated_at":"2026-10-15T06:22:53.000Z","time_to_close":64686,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"Bump","packages":[{"name":"virtualenv","old_version":"20.31.2","new_version":"21.14.6","repository_url":"https://github.com/pypa/virtualenv"}],"path":null,"ecosystem":"pip"},"body":"Bumps [virtualenv](https://github.com/pypa/virtualenv) from 20.31.2 to 21.14.6.\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pypa/virtualenv/releases\"\u003evirtualenv's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e21.14.6\u003c/h2\u003e\n\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e👷 ci: pin ubuntu-26.04, clear warnings, bump deps by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3378\"\u003epypa/virtualenv#3378\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(ci): defer upgrades blocked by release age by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3379\"\u003epypa/virtualenv#3379\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eci: overlap release transfers and verification by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3382\"\u003epypa/virtualenv#3382\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(seed): guard every embed update log read, not just one by \u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3383\"\u003epypa/virtualenv#3383\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.14.5...21.14.6\"\u003ehttps://github.com/pypa/virtualenv/compare/21.14.5...21.14.6\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e21.14.5\u003c/h2\u003e\n\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e🎨 style(test): mark prompt fixture locals Final by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3374\"\u003epypa/virtualenv#3374\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🎨 style: give every Final annotation its type by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3375\"\u003epypa/virtualenv#3375\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(ci): dump stacks from a thread that holds the GIL by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3377\"\u003epypa/virtualenv#3377\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eReset the embed update log when it cannot be read by \u003ca href=\"https://github.com/pasmud\"\u003e\u003ccode\u003e@​pasmud\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3376\"\u003epypa/virtualenv#3376\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.14.4...21.14.5\"\u003ehttps://github.com/pypa/virtualenv/compare/21.14.4...21.14.5\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e21.14.4\u003c/h2\u003e\n\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eUpgrade embedded pip/setuptools/wheel and CI test tools by \u003ca href=\"https://github.com/github-actions\"\u003e\u003ccode\u003e@​github-actions\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3372\"\u003epypa/virtualenv#3372\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e📝 docs(changelog): note the zsh prompt fix by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3373\"\u003epypa/virtualenv#3373\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.14.3...21.14.4\"\u003ehttps://github.com/pypa/virtualenv/compare/21.14.3...21.14.4\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e21.14.3\u003c/h2\u003e\n\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e✨ feat(security): add a private vulnerability report form by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3370\"\u003epypa/virtualenv#3370\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e📝 docs(changelog): link the 21.14.0 wheel-order fix to \u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3361\"\u003e#3361\u003c/a\u003e by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3371\"\u003epypa/virtualenv#3371\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eApply the whole Requires-Python specifier set in Wheel.support_py by \u003ca href=\"https://github.com/pasmud\"\u003e\u003ccode\u003e@​pasmud\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3369\"\u003epypa/virtualenv#3369\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUpgrade embedded pip/setuptools/wheel and CI test tools by \u003ca href=\"https://github.com/github-actions\"\u003e\u003ccode\u003e@​github-actions\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3368\"\u003epypa/virtualenv#3368\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.14.2...21.14.3\"\u003ehttps://github.com/pypa/virtualenv/compare/21.14.2...21.14.3\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e21.14.2\u003c/h2\u003e\n\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pypa/virtualenv/blob/main/docs/changelog.rst\"\u003evirtualenv's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003eBugfixes - 21.14.6\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eFall back to the bundled seed wheel with periodic update on (the default) when the embed update log holds JSON of the\nwrong shape, instead of downloading the wheel or, offline, failing to create the environment - by :user:\u003ccode\u003edarrenhuai\u003c/code\u003e.\n(:issue:\u003ccode\u003e3383\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003ev21.14.5 (2026-10-02)\u003c/p\u003e\n\u003chr /\u003e\n\u003ch1\u003eBugfixes - 21.14.5\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eFall back to the bundled seed wheel and remove the embed update log when the log in the app data folder holds JSON of\nthe wrong shape, instead of failing to create the environment - by :user:\u003ccode\u003epasmud\u003c/code\u003e. (:issue:\u003ccode\u003e3376\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003ev21.14.4 (2026-10-02)\u003c/p\u003e\n\u003chr /\u003e\n\u003ch1\u003eBugfixes - 21.14.4\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eFix \u003ccode\u003eactivate\u003c/code\u003e running commands from a virtual environment name or \u003ccode\u003e--prompt\u003c/code\u003e that holds \u003ccode\u003e$(...)\u003c/code\u003e, backticks or\n\u003ccode\u003e${...}\u003c/code\u003e when zsh has \u003ccode\u003ePROMPT_SUBST\u003c/code\u003e set, and show a \u003ccode\u003e%\u003c/code\u003e in the name as typed under zsh (\u003ccode\u003eGHSA-5vjq-rrrf-7h2q \u0026lt;https://github.com/pypa/virtualenv/security/advisories/GHSA-5vjq-rrrf-7h2q\u0026gt;\u003c/code\u003e_); reported by :user:\u003ccode\u003ekemrec\u003c/code\u003e.\n(:issue:\u003ccode\u003e3373\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003ev21.14.3 (2026-10-01)\u003c/p\u003e\n\u003chr /\u003e\n\u003ch1\u003eBugfixes - 21.14.3\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eHonor \u003ccode\u003e~=\u003c/code\u003e and every clause of a seed wheel's \u003ccode\u003eRequires-Python\u003c/code\u003e when picking a wheel for the target Python, and\nskip a wheel whose \u003ccode\u003eRequires-Python\u003c/code\u003e is not a valid specifier instead of failing - by :user:\u003ccode\u003epasmud\u003c/code\u003e.\n(:issue:\u003ccode\u003e3369\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003ev21.14.2 (2026-10-01)\u003c/p\u003e\n\u003chr /\u003e\n\u003ch1\u003eBugfixes - 21.14.2\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eFix \u003ccode\u003epyvenv.cfg\u003c/code\u003e getting an absolute path in \u003ccode\u003epython-version\u003c/code\u003e, \u003ccode\u003einclude-system-site-packages\u003c/code\u003e and the other keys\nthat hold no path when the working directory has an entry named like the value, such as \u003ccode\u003e3.14\u003c/code\u003e for \u003ccode\u003evirtualenv 3.14\u003c/code\u003e or \u003ccode\u003etrue\u003c/code\u003e with \u003ccode\u003e--system-site-packages\u003c/code\u003e - by :user:\u003ccode\u003edarrenhuai\u003c/code\u003e. (:issue:\u003ccode\u003e3366\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/9e69ac725fd4dc83726536c084ab9ca4f099c5b6\"\u003e\u003ccode\u003e9e69ac7\u003c/code\u003e\u003c/a\u003e release 21.14.6\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/464c34b696c81190cd1ad6589158f6ce59467351\"\u003e\u003ccode\u003e464c34b\u003c/code\u003e\u003c/a\u003e 🐛 fix(seed): guard every embed update log read, not just one (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3383\"\u003e#3383\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/3f56d7f4b88884296249b83889d717c41ed6e668\"\u003e\u003ccode\u003e3f56d7f\u003c/code\u003e\u003c/a\u003e ci: overlap release transfers and verification (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3382\"\u003e#3382\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/7577efd46b0e62c5edbd803ded2788eb6d48f5ca\"\u003e\u003ccode\u003e7577efd\u003c/code\u003e\u003c/a\u003e chore(deps): bump the runtime-dependencies group with 10 updates (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3381\"\u003e#3381\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/f6d172367b48d5138fcab911ff8fdd86b4e8cdaf\"\u003e\u003ccode\u003ef6d1723\u003c/code\u003e\u003c/a\u003e [pre-commit.ci] pre-commit autoupdate (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3380\"\u003e#3380\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/7c56749d7b3065f6a99b21fd61089ba692e4aaec\"\u003e\u003ccode\u003e7c56749\u003c/code\u003e\u003c/a\u003e fix(ci): defer upgrades blocked by release age (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3379\"\u003e#3379\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/95d02526dc5f2c569767d8ee572f72f571b8a6ce\"\u003e\u003ccode\u003e95d0252\u003c/code\u003e\u003c/a\u003e 👷 ci: pin ubuntu-26.04, clear warnings, bump deps (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3378\"\u003e#3378\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/571bc2041dae5ecbd250d82ec7ef482cfd3c3b69\"\u003e\u003ccode\u003e571bc20\u003c/code\u003e\u003c/a\u003e release 21.14.5\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/5b9b7de4f2f850d94deec4d5a9764e7b879e8865\"\u003e\u003ccode\u003e5b9b7de\u003c/code\u003e\u003c/a\u003e Reset the embed update log when it cannot be read (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3376\"\u003e#3376\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/9fd48c89ad6986d37d20598fd3d8bb5eee94ecba\"\u003e\u003ccode\u003e9fd48c8\u003c/code\u003e\u003c/a\u003e 🐛 fix(ci): dump stacks from a thread that holds the GIL (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3377\"\u003e#3377\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/pypa/virtualenv/compare/20.31.2...21.14.6\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=virtualenv\u0026package-manager=pip\u0026previous-version=20.31.2\u0026new-version=21.14.6)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n\n\n\u003c/details\u003e","html_url":"https://github.com/yhfgyyf/vllm-deepseek-v4-sm89/pull/145","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/yhfgyyf%2Fvllm-deepseek-v4-sm89/issues/145","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/145/packages"}},{"old_version":"21.14.5","new_version":"21.14.6","update_type":"patch","path":null,"pr_created_at":"2026-10-14T01:41:55.000Z","version_change":"21.14.5 → 21.14.6","issue":{"uuid":"5840471646","node_id":"PR_kwDOTtMS4M8AAAABIS_Unw","number":139,"state":"closed","title":"Bump virtualenv from 21.14.5 to 21.14.6","user":"dependabot[bot]","labels":[],"assignees":[],"locked":false,"comments_count":1,"pull_request":true,"closed_at":"2026-10-14T01:42:06.000Z","author_association":null,"state_reason":null,"created_at":"2026-10-14T01:41:55.000Z","updated_at":"2026-10-14T01:42:16.000Z","time_to_close":11,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"Bump","packages":[{"name":"virtualenv","old_version":"21.14.5","new_version":"21.14.6","repository_url":"https://github.com/pypa/virtualenv"}],"path":null,"ecosystem":"pip"},"body":"Bumps [virtualenv](https://github.com/pypa/virtualenv) from 21.14.5 to 21.14.6.\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pypa/virtualenv/releases\"\u003evirtualenv's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e21.14.6\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e👷 ci: pin ubuntu-26.04, clear warnings, bump deps by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3378\"\u003epypa/virtualenv#3378\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(ci): defer upgrades blocked by release age by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3379\"\u003epypa/virtualenv#3379\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eci: overlap release transfers and verification by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3382\"\u003epypa/virtualenv#3382\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(seed): guard every embed update log read, not just one by \u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3383\"\u003epypa/virtualenv#3383\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.14.5...21.14.6\"\u003ehttps://github.com/pypa/virtualenv/compare/21.14.5...21.14.6\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pypa/virtualenv/blob/main/docs/changelog.rst\"\u003evirtualenv's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003eBugfixes - 21.14.6\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eFall back to the bundled seed wheel with periodic update on (the default) when the embed update log holds JSON of the\nwrong shape, instead of downloading the wheel or, offline, failing to create the environment - by :user:\u003ccode\u003edarrenhuai\u003c/code\u003e.\n(:issue:\u003ccode\u003e3383\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003ev21.14.5 (2026-10-02)\u003c/p\u003e\n\u003chr /\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/9e69ac725fd4dc83726536c084ab9ca4f099c5b6\"\u003e\u003ccode\u003e9e69ac7\u003c/code\u003e\u003c/a\u003e release 21.14.6\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/464c34b696c81190cd1ad6589158f6ce59467351\"\u003e\u003ccode\u003e464c34b\u003c/code\u003e\u003c/a\u003e 🐛 fix(seed): guard every embed update log read, not just one (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3383\"\u003e#3383\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/3f56d7f4b88884296249b83889d717c41ed6e668\"\u003e\u003ccode\u003e3f56d7f\u003c/code\u003e\u003c/a\u003e ci: overlap release transfers and verification (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3382\"\u003e#3382\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/7577efd46b0e62c5edbd803ded2788eb6d48f5ca\"\u003e\u003ccode\u003e7577efd\u003c/code\u003e\u003c/a\u003e chore(deps): bump the runtime-dependencies group with 10 updates (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3381\"\u003e#3381\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/f6d172367b48d5138fcab911ff8fdd86b4e8cdaf\"\u003e\u003ccode\u003ef6d1723\u003c/code\u003e\u003c/a\u003e [pre-commit.ci] pre-commit autoupdate (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3380\"\u003e#3380\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/7c56749d7b3065f6a99b21fd61089ba692e4aaec\"\u003e\u003ccode\u003e7c56749\u003c/code\u003e\u003c/a\u003e fix(ci): defer upgrades blocked by release age (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3379\"\u003e#3379\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/95d02526dc5f2c569767d8ee572f72f571b8a6ce\"\u003e\u003ccode\u003e95d0252\u003c/code\u003e\u003c/a\u003e 👷 ci: pin ubuntu-26.04, clear warnings, bump deps (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3378\"\u003e#3378\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.14.5...21.14.6\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=virtualenv\u0026package-manager=pip\u0026previous-version=21.14.5\u0026new-version=21.14.6)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n\n\n\u003c/details\u003e","html_url":"https://github.com/huawei-zxs/aiohttp/pull/139","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/huawei-zxs%2Faiohttp/issues/139","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/139/packages"}},{"old_version":"21.7.9","new_version":"21.14.6","update_type":"minor","path":null,"pr_created_at":"2026-10-13T17:14:52.000Z","version_change":"21.7.9 → 21.14.6","issue":{"uuid":"5834589787","node_id":"PR_kwDOUXDMF88AAAABIOTIrg","number":17,"state":"open","title":"Bump the python group across 1 directory with 46 updates","user":"dependabot[bot]","labels":["dependencies","python:uv"],"assignees":[],"locked":false,"comments_count":1,"pull_request":true,"closed_at":null,"author_association":null,"state_reason":null,"created_at":"2026-10-13T17:14:52.000Z","updated_at":"2026-10-14T20:33:08.000Z","time_to_close":null,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"Bump","group_name":"python","update_count":46,"packages":[{"name":"django","old_version":"6.0.8","new_version":"6.1.2","repository_url":"https://github.com/django/django"},{"name":"django-allauth","old_version":"65.19.2","new_version":"65.19.7","repository_url":"https://github.com/sponsors/pennersr"},{"name":"djangorestframework","old_version":"3.18.1","new_version":"3.18.3","repository_url":"https://github.com/encode/django-rest-framework"},{"name":"hiredis","old_version":"3.4.1","new_version":"3.4.2","repository_url":"https://github.com/redis/hiredis-py"},{"name":"coverage","old_version":"7.16.0","new_version":"7.16.2","repository_url":"https://github.com/coveragepy/coveragepy"},{"name":"django-stubs","old_version":"6.1.0","new_version":"6.1.2","repository_url":"https://github.com/typeddjango/django-stubs"},{"name":"django-upgrade","old_version":"1.32.0","new_version":"1.33.0","repository_url":"https://github.com/adamchainz/django-upgrade"},{"name":"djlint","old_version":"1.46.1","new_version":"1.46.4","repository_url":"https://github.com/djlint/djLint"},{"name":"mypy","old_version":"2.3.1","new_version":"2.4.0","repository_url":"https://github.com/python/mypy"},{"name":"ruff","old_version":"0.16.6","new_version":"0.17.0","repository_url":"https://github.com/astral-sh/ruff"},{"name":"werkzeug","old_version":"3.1.8","new_version":"3.1.9","repository_url":"https://github.com/pallets/werkzeug"},{"name":"ast-serialize","old_version":"0.11.2","new_version":"0.12.1","repository_url":"https://github.com/mypyc/ast_serialize"},{"name":"charset-normalizer","old_version":"3.5.1","new_version":"3.5.2","repository_url":"https://github.com/jawah/charset_normalizer"},{"name":"cryptography","old_version":"50.0.1","new_version":"50.0.2","repository_url":"https://github.com/pyca/cryptography"},{"name":"django-allauth","old_version":"65.19.2","new_version":"65.19.7","repository_url":"https://github.com/sponsors/pennersr"},{"name":"django-stubs","old_version":"6.1.0","new_version":"6.1.2","repository_url":"https://github.com/typeddjango/django-stubs"},{"name":"django-stubs-ext","old_version":"6.1.0","new_version":"6.1.2","repository_url":"https://github.com/typeddjango/django-stubs"},{"name":"docutils","old_version":"0.22.4","new_version":"0.23","repository_url":"https://github.com/rtfd/recommonmark"},{"name":"executing","old_version":"2.2.1","new_version":"2.3.0","repository_url":"https://github.com/alexmojaki/executing"},{"name":"faker","old_version":"40.38.0","new_version":"40.43.0","repository_url":"https://github.com/joke2k/faker"},{"name":"identify","old_version":"2.6.19","new_version":"2.6.20","repository_url":"https://github.com/pre-commit/identify"},{"name":"idna","old_version":"3.19","new_version":"3.20","repository_url":"https://github.com/kjd/idna"},{"name":"iniconfig","old_version":"2.3.0","new_version":"2.3.1","repository_url":"https://github.com/pytest-dev/iniconfig"},{"name":"json5","old_version":"0.15.0","new_version":"0.17.3","repository_url":"https://github.com/dpranke/pyjson5"},{"name":"librt","old_version":"0.15.0","new_version":"0.16.0","repository_url":"https://github.com/mypyc/librt"},{"name":"markupsafe","old_version":"3.0.3","new_version":"3.0.4","repository_url":"https://github.com/pallets/markupsafe"},{"name":"nodeenv","old_version":"1.10.0","new_version":"1.11.0","repository_url":"https://github.com/ekalinin/nodeenv"},{"name":"platformdirs","old_version":"4.11.8","new_version":"4.12.4","repository_url":"https://github.com/tox-dev/platformdirs"},{"name":"psycopg","old_version":"3.3.5","new_version":"3.3.6","repository_url":"https://github.com/psycopg/psycopg"},{"name":"psycopg-binary","old_version":"3.3.5","new_version":"3.3.6","repository_url":"https://github.com/psycopg/psycopg"},{"name":"psycopg-c","old_version":"3.3.5","new_version":"3.3.6","repository_url":"https://github.com/psycopg/psycopg"},{"name":"pycparser","old_version":"3.0","new_version":"3.11","repository_url":"https://github.com/eliben/pycparser"},{"name":"python-discovery","old_version":"1.6.0","new_version":"1.6.2","repository_url":"https://github.com/tox-dev/python-discovery"},{"name":"rcssmin","old_version":"1.2.2","new_version":"1.3.0","repository_url":"https://github.com/ndparker/rcssmin"},{"name":"regex","old_version":"2026.9.10","new_version":"2026.9.29","repository_url":"https://github.com/mrabarnett/mrab-regex"},{"name":"rjsmin","old_version":"1.2.5","new_version":"1.3.0","repository_url":"https://github.com/ndparker/rjsmin"},{"name":"rpds-py","old_version":"2026.6.3","new_version":"2026.9.1","repository_url":"https://github.com/crate-py/rpds"},{"name":"starlette","old_version":"1.6.0","new_version":"1.7.0","repository_url":"https://github.com/Kludex/starlette"},{"name":"tzdata","old_version":"2026.4","new_version":"2026.5","repository_url":"https://github.com/python/tzdata"},{"name":"urllib3","old_version":"2.7.0","new_version":"2.8.0","repository_url":"https://github.com/urllib3/urllib3"},{"name":"uvicorn","old_version":"0.52.4","new_version":"0.54.0","repository_url":"https://github.com/Kludex/uvicorn"},{"name":"virtualenv","old_version":"21.7.9","new_version":"21.14.6","repository_url":"https://github.com/pypa/virtualenv"},{"name":"watchfiles","old_version":"1.2.0","new_version":"1.3.0","repository_url":"https://github.com/samuelcolvin/watchfiles"},{"name":"wcwidth","old_version":"0.8.3","new_version":"0.9.2","repository_url":"https://github.com/jquast/wcwidth"},{"name":"websockets","old_version":"17.1","new_version":"17.2","repository_url":"https://github.com/python-websockets/websockets"},{"name":"werkzeug","old_version":"3.1.8","new_version":"3.1.9","repository_url":"https://github.com/pallets/werkzeug"}],"path":null,"ecosystem":"pip"},"body":"Bumps the python group with 46 updates in the / directory:\n\n| Package | From | To |\n| --- | --- | --- |\n| [django](https://github.com/django/django) | `6.0.8` | `6.1.2` |\n| [django-allauth[mfa]](https://github.com/sponsors/pennersr) | `65.19.2` | `65.19.7` |\n| [djangorestframework](https://github.com/encode/django-rest-framework) | `3.18.1` | `3.18.3` |\n| [hiredis](https://github.com/redis/hiredis-py) | `3.4.1` | `3.4.2` |\n| [coverage](https://github.com/coveragepy/coveragepy) | `7.16.0` | `7.16.2` |\n| [django-stubs[compatible-mypy]](https://github.com/typeddjango/django-stubs) | `6.1.0` | `6.1.2` |\n| [django-upgrade](https://github.com/adamchainz/django-upgrade) | `1.32.0` | `1.33.0` |\n| [djlint](https://github.com/djlint/djLint) | `1.46.1` | `1.46.4` |\n| [mypy](https://github.com/python/mypy) | `2.3.1` | `2.4.0` |\n| [ruff](https://github.com/astral-sh/ruff) | `0.16.6` | `0.17.0` |\n| [werkzeug[watchdog]](https://github.com/pallets/werkzeug) | `3.1.8` | `3.1.9` |\n| [ast-serialize](https://github.com/mypyc/ast_serialize) | `0.11.2` | `0.12.1` |\n| [charset-normalizer](https://github.com/jawah/charset_normalizer) | `3.5.1` | `3.5.2` |\n| [cryptography](https://github.com/pyca/cryptography) | `50.0.1` | `50.0.2` |\n| [django-allauth](https://github.com/sponsors/pennersr) | `65.19.2` | `65.19.7` |\n| [django-stubs](https://github.com/typeddjango/django-stubs) | `6.1.0` | `6.1.2` |\n| [django-stubs-ext](https://github.com/typeddjango/django-stubs) | `6.1.0` | `6.1.2` |\n| [docutils](https://github.com/rtfd/recommonmark) | `0.22.4` | `0.23` |\n| [executing](https://github.com/alexmojaki/executing) | `2.2.1` | `2.3.0` |\n| [faker](https://github.com/joke2k/faker) | `40.38.0` | `40.43.0` |\n| [identify](https://github.com/pre-commit/identify) | `2.6.19` | `2.6.20` |\n| [idna](https://github.com/kjd/idna) | `3.19` | `3.20` |\n| [iniconfig](https://github.com/pytest-dev/iniconfig) | `2.3.0` | `2.3.1` |\n| [json5](https://github.com/dpranke/pyjson5) | `0.15.0` | `0.17.3` |\n| [librt](https://github.com/mypyc/librt) | `0.15.0` | `0.16.0` |\n| [markupsafe](https://github.com/pallets/markupsafe) | `3.0.3` | `3.0.4` |\n| [nodeenv](https://github.com/ekalinin/nodeenv) | `1.10.0` | `1.11.0` |\n| [platformdirs](https://github.com/tox-dev/platformdirs) | `4.11.8` | `4.12.4` |\n| [psycopg](https://github.com/psycopg/psycopg) | `3.3.5` | `3.3.6` |\n| [psycopg-binary](https://github.com/psycopg/psycopg) | `3.3.5` | `3.3.6` |\n| [psycopg-c](https://github.com/psycopg/psycopg) | `3.3.5` | `3.3.6` |\n| [pycparser](https://github.com/eliben/pycparser) | `3.0` | `3.11` |\n| [python-discovery](https://github.com/tox-dev/python-discovery) | `1.6.0` | `1.6.2` |\n| [rcssmin](https://github.com/ndparker/rcssmin) | `1.2.2` | `1.3.0` |\n| [regex](https://github.com/mrabarnett/mrab-regex) | `2026.9.10` | `2026.9.29` |\n| [rjsmin](https://github.com/ndparker/rjsmin) | `1.2.5` | `1.3.0` |\n| [rpds-py](https://github.com/crate-py/rpds) | `2026.6.3` | `2026.9.1` |\n| [starlette](https://github.com/Kludex/starlette) | `1.6.0` | `1.7.0` |\n| [tzdata](https://github.com/python/tzdata) | `2026.4` | `2026.5` |\n| [urllib3](https://github.com/urllib3/urllib3) | `2.7.0` | `2.8.0` |\n| [uvicorn](https://github.com/Kludex/uvicorn) | `0.52.4` | `0.54.0` |\n| [virtualenv](https://github.com/pypa/virtualenv) | `21.7.9` | `21.14.6` |\n| [watchfiles](https://github.com/samuelcolvin/watchfiles) | `1.2.0` | `1.3.0` |\n| [wcwidth](https://github.com/jquast/wcwidth) | `0.8.3` | `0.9.2` |\n| [websockets](https://github.com/python-websockets/websockets) | `17.1` | `17.2` |\n| [werkzeug](https://github.com/pallets/werkzeug) | `3.1.8` | `3.1.9` |\n\n\nUpdates `django` from 6.0.8 to 6.1.2\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/django/django/commit/2212534bae393714e1e51db2341d4fd5545e19f6\"\u003e\u003ccode\u003e2212534\u003c/code\u003e\u003c/a\u003e [6.1.x] Bumped version for 6.1.2 release.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/django/django/commit/75d401a1491e04a907ed745c128836d51c982c0f\"\u003e\u003ccode\u003e75d401a\u003c/code\u003e\u003c/a\u003e [6.1.x] Refs CVE-2026-15830 -- Fixed WKB geometry collection limit bypasses.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/django/django/commit/cce6c57ed30ea83725f9d6abb2fe5ee932bab107\"\u003e\u003ccode\u003ecce6c57\u003c/code\u003e\u003c/a\u003e [6.1.x] Fixed CVE-2026-87975 -- Prevented forging actions in model formsets w...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/django/django/commit/4e77ef1e69c94780006b82795aa7db101996c3af\"\u003e\u003ccode\u003e4e77ef1\u003c/code\u003e\u003c/a\u003e [6.1.x] Fixed CVE-2026-87890 -- Blocked bytes in spatial lookups.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/django/django/commit/de56deeabd4c48dfb5193f0001469d80102fb367\"\u003e\u003ccode\u003ede56dee\u003c/code\u003e\u003c/a\u003e [6.1.x] Fixed CVE-2026-84429 -- Simplified parse_header_parameters by leverag...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/django/django/commit/7e878b0f8bd42260903e6a0d38996a93b0474a0b\"\u003e\u003ccode\u003e7e878b0\u003c/code\u003e\u003c/a\u003e [6.1.x] Fixed CVE-2026-77050 -- Prevented memory exhaustion in get_supported_...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/django/django/commit/d8cf296d9668e146067337c6f2259be6ea2c7370\"\u003e\u003ccode\u003ed8cf296\u003c/code\u003e\u003c/a\u003e [6.1.x] Fixed \u003ca href=\"https://redirect.github.com/django/django/issues/37322\"\u003e#37322\u003c/a\u003e -- Avoided transforms on spatial fields with srid=None.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/django/django/commit/71084d68d3be55307be6698a7cff93244f98ad88\"\u003e\u003ccode\u003e71084d6\u003c/code\u003e\u003c/a\u003e [6.1.x] Fixed \u003ca href=\"https://redirect.github.com/django/django/issues/37377\"\u003e#37377\u003c/a\u003e -- Fixed JSONField __in crash/wrong result for Value() p...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/django/django/commit/e34d77639cebc30b13bbbb82b04f97ba0da82cb4\"\u003e\u003ccode\u003ee34d776\u003c/code\u003e\u003c/a\u003e [6.1.x] Fixed \u003ca href=\"https://redirect.github.com/django/django/issues/37386\"\u003e#37386\u003c/a\u003e -- Observed delete_confirmation_max_display=0 for inlines.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/django/django/commit/25872ef34ee19f49887509138218fc08320f526c\"\u003e\u003ccode\u003e25872ef\u003c/code\u003e\u003c/a\u003e [6.1.x] Fixed \u003ca href=\"https://redirect.github.com/django/django/issues/37361\"\u003e#37361\u003c/a\u003e -- Fixed permission renames for chained RenameModel oper...\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/django/django/compare/6.0.8...6.1.2\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `django-allauth[mfa]` from 65.19.2 to 65.19.7\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/sponsors/pennersr/commits\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `djangorestframework` from 3.18.1 to 3.18.3\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/encode/django-rest-framework/releases\"\u003edjangorestframework's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e3.18.3\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003ch3\u003eBug fixes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eRestore \u003ccode\u003eorder_by_precedence\u003c/code\u003e from 3.18.1 to fix broken return value by \u003ca href=\"https://github.com/browniebroke\"\u003e\u003ccode\u003e@​browniebroke\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/encode/django-rest-framework/pull/10066\"\u003eencode/django-rest-framework#10066\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/encode/django-rest-framework/compare/3.18.2...3.18.3\"\u003ehttps://github.com/encode/django-rest-framework/compare/3.18.2...3.18.3\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e3.18.2\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003ch3\u003eSecurity\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eGHSA-33wh-fxxf-88vv: Harden content negotiation against large \u003ccode\u003eAccept\u003c/code\u003e headers by \u003ca href=\"https://github.com/jisung-02\"\u003e\u003ccode\u003e@​jisung-02\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://github.com/encode/django-rest-framework/commit/148ab65\"\u003e148ab65\u003c/a\u003e. Thanks \u003ca href=\"https://github.com/jisung-02\"\u003e\u003ccode\u003e@​jisung-02\u003c/code\u003e\u003c/a\u003e for the report.\u003c/li\u003e\n\u003cli\u003eGHSA-3547-9m27-7rxg: Refuse non-text encoding charsets by \u003ca href=\"https://github.com/syrull\"\u003e\u003ccode\u003e@​syrull\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://github.com/encode/django-rest-framework/commit/3c26345\"\u003e3c26345\u003c/a\u003e. Thanks \u003ca href=\"https://github.com/syrull\"\u003e\u003ccode\u003e@​syrull\u003c/code\u003e\u003c/a\u003e and \u003ca href=\"https://github.com/jisung-02\"\u003e\u003ccode\u003e@​jisung-02\u003c/code\u003e\u003c/a\u003e who both reported the problem.\u003c/li\u003e\n\u003cli\u003eGHSA-xw6w-gcfp-cf8m: Make \u003ccode\u003eTokenProxy\u003c/code\u003e deletion actually delete the token by \u003ca href=\"https://github.com/syrull\"\u003e\u003ccode\u003e@​syrull\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://github.com/encode/django-rest-framework/commit/af3fabf\"\u003eaf3fabf\u003c/a\u003e. Thanks \u003ca href=\"https://github.com/syrull\"\u003e\u003ccode\u003e@​syrull\u003c/code\u003e\u003c/a\u003e for the report.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eFeatures\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAdd support for Python 3.15 by \u003ca href=\"https://github.com/p-r-a-v-i-n\"\u003e\u003ccode\u003e@​p-r-a-v-i-n\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/encode/django-rest-framework/pull/10025\"\u003eencode/django-rest-framework#10025\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eBug fixes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eFix \u003ccode\u003eblank=True\u003c/code\u003e fields in unique constraints being treated as required by \u003ca href=\"https://github.com/MehrazRumman\"\u003e\u003ccode\u003e@​MehrazRumman\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/encode/django-rest-framework/pull/10039\"\u003eencode/django-rest-framework#10039\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix \u003ccode\u003eUniqueConstraint\u003c/code\u003e validation with conditional fields by \u003ca href=\"https://github.com/majidkhazaei\"\u003e\u003ccode\u003e@​majidkhazaei\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/encode/django-rest-framework/pull/10021\"\u003eencode/django-rest-framework#10021\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/olitreadwell\"\u003e\u003ccode\u003e@​olitreadwell\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/encode/django-rest-framework/pull/10038\"\u003eencode/django-rest-framework#10038\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/majidkhazaei\"\u003e\u003ccode\u003e@​majidkhazaei\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/encode/django-rest-framework/pull/10021\"\u003eencode/django-rest-framework#10021\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/rblotsky\"\u003e\u003ccode\u003e@​rblotsky\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/encode/django-rest-framework/pull/10045\"\u003eencode/django-rest-framework#10045\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mrchatam\"\u003e\u003ccode\u003e@​mrchatam\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/encode/django-rest-framework/pull/10042\"\u003eencode/django-rest-framework#10042\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/haimingZZ\"\u003e\u003ccode\u003e@​haimingZZ\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/encode/django-rest-framework/pull/10052\"\u003eencode/django-rest-framework#10052\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jisung-02\"\u003e\u003ccode\u003e@​jisung-02\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://github.com/encode/django-rest-framework/commit/148ab65\"\u003e148ab65\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/syrull\"\u003e\u003ccode\u003e@​syrull\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://github.com/encode/django-rest-framework/commit/3c26345\"\u003e3c26345\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/encode/django-rest-framework/compare/3.18.1...3.18.2\"\u003ehttps://github.com/encode/django-rest-framework/compare/3.18.1...3.18.2\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/encode/django-rest-framework/commit/1af5b55758ac514c492ed3a5fc1a6fb244cdb257\"\u003e\u003ccode\u003e1af5b55\u003c/code\u003e\u003c/a\u003e Prepare release 3.18.3 (\u003ca href=\"https://redirect.github.com/encode/django-rest-framework/issues/10067\"\u003e#10067\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/encode/django-rest-framework/commit/e140de794d11149a09c04a3ee7cc4815946148f8\"\u003e\u003ccode\u003ee140de7\u003c/code\u003e\u003c/a\u003e Restore order_by_precedence from 3.18.1 (\u003ca href=\"https://redirect.github.com/encode/django-rest-framework/issues/10066\"\u003e#10066\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/encode/django-rest-framework/commit/7195f7e4c51527054623ea55fc4491786acc91f8\"\u003e\u003ccode\u003e7195f7e\u003c/code\u003e\u003c/a\u003e Bump the pre-commit group across 1 directory with 2 updates (\u003ca href=\"https://redirect.github.com/encode/django-rest-framework/issues/10063\"\u003e#10063\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/encode/django-rest-framework/commit/69694a17d0b6ac14b4ea4d77916b73c68dc5a3e8\"\u003e\u003ccode\u003e69694a1\u003c/code\u003e\u003c/a\u003e Prepare release 3.18.2 (\u003ca href=\"https://redirect.github.com/encode/django-rest-framework/issues/10065\"\u003e#10065\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/encode/django-rest-framework/commit/af3fabfd517307fbc5d500fba1ab8f6e25f220b0\"\u003e\u003ccode\u003eaf3fabf\u003c/code\u003e\u003c/a\u003e Merge commit from fork\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/encode/django-rest-framework/commit/3c2634599b26a9f789b03045118dbc276117611a\"\u003e\u003ccode\u003e3c26345\u003c/code\u003e\u003c/a\u003e Merge commit from fork\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/encode/django-rest-framework/commit/148ab6523922d5a0c110f76615935e5220b63029\"\u003e\u003ccode\u003e148ab65\u003c/code\u003e\u003c/a\u003e Merge commit from fork\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/encode/django-rest-framework/commit/3d18900ead34e9491f94597617a12fdd47161e97\"\u003e\u003ccode\u003e3d18900\u003c/code\u003e\u003c/a\u003e Fix CI that broke due to latest Django bugfix (\u003ca href=\"https://redirect.github.com/encode/django-rest-framework/issues/10064\"\u003e#10064\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/encode/django-rest-framework/commit/d6c45646edc9c6644ea159f7f786da598bc1ab66\"\u003e\u003ccode\u003ed6c4564\u003c/code\u003e\u003c/a\u003e Improve teardown of test modifying INSTALLED_APPS (\u003ca href=\"https://redirect.github.com/encode/django-rest-framework/issues/10056\"\u003e#10056\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/encode/django-rest-framework/commit/41764f1f8cfb6d40b77b58c97cf9aeaab57c6b5c\"\u003e\u003ccode\u003e41764f1\u003c/code\u003e\u003c/a\u003e Bump codecov/codecov-action in the github-actions group (\u003ca href=\"https://redirect.github.com/encode/django-rest-framework/issues/10058\"\u003e#10058\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/encode/django-rest-framework/compare/3.18.1...3.18.3\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `hiredis` from 3.4.1 to 3.4.2\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/hiredis-py/releases\"\u003ehiredis's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e3.4.2\u003c/h2\u003e\n\u003cp\u003eThis is a bugfix release. Users of hiredis-py 3.4.x that receive RESP3 push notifications — pub/sub deliveries or client-side cache invalidations — are encouraged to upgrade.\u003c/p\u003e\n\u003ch1\u003e🐛 Bug Fixes\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eRelease the list each push notification is sized from (\u003ca href=\"https://redirect.github.com/redis/hiredis-py/issues/239\"\u003e#239\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003ccode\u003ePushNotificationType_New\u003c/code\u003e pre-sized every \u003ccode\u003ePushNotification\u003c/code\u003e with a list that \u003ccode\u003ePyList_SetSlice\u003c/code\u003e only borrows, and the reference was never dropped. Each RESP3 push notification therefore stranded one list object for the lifetime of the process. Because push notifications carry pub/sub deliveries and client-side caching invalidations, the leak grew with \u003cem\u003emessage volume\u003c/em\u003e rather than with the number of connections, making it unbounded for a long-lived subscriber — roughly 20 MB per 200,000 four-element notifications, and more for larger ones. Dropping the reference also removes an allocation from the parse path, which makes parsing a small notification about 10% faster.\u003c/p\u003e\n\u003cp\u003eThe same change checks \u003ccode\u003ePyList_New\u003c/code\u003e for failure and guards \u003ccode\u003etryParentize\u003c/code\u003e against a \u003ccode\u003eNULL\u003c/code\u003e reply, so an allocation failure is now reported as an error instead of writing elements past the end of a zero-length notification.\u003c/p\u003e\n\u003cp\u003eRESP2 array replies were never affected.\u003c/p\u003e\n\u003ch2\u003eContributors\u003c/h2\u003e\n\u003cp\u003eThanks to \u003ca href=\"https://github.com/mmick78\"\u003e\u003ccode\u003e@​mmick78\u003c/code\u003e\u003c/a\u003e for finding and fixing this.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/hiredis-py/commit/b1b29513f005fbd2554711c1ed051a04b424283c\"\u003e\u003ccode\u003eb1b2951\u003c/code\u003e\u003c/a\u003e [3.4] Release the list each push notification is sized from, release 3.4.2 (#...\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/redis/hiredis-py/compare/v3.4.1...v3.4.2\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `coverage` from 7.16.0 to 7.16.2\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/coveragepy/coveragepy/releases\"\u003ecoverage's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e7.16.2\u003c/h2\u003e\n\u003ch2\u003eVersion 7.16.2 — 2026-09-27\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eFix: on Python 3.14 and later, a \u003ccode\u003efor\u003c/code\u003e loop completing immediately before a function return could mistakenly report an uncovered branch. This is now fixed, closing \u003ca href=\"https://redirect.github.com/coveragepy/coveragepy/issues/2168\"\u003eissue 2168\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003eFix: on Python 3.14 and later, the \u003ccode\u003eelse\u003c/code\u003e clause of a \u003ccode\u003etry\u003c/code\u003e whose body is a \u003ccode\u003ewith\u003c/code\u003e statement could incorrectly be reported as covered when the \u003ccode\u003ewith\u003c/code\u003e raised. This is now fixed, closing \u003ca href=\"https://redirect.github.com/coveragepy/coveragepy/issues/2289\"\u003eissue 2289\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003eFix: with \u003ccode\u003edynamic_context = test_function\u003c/code\u003e, test methods written as \u003ccode\u003e@staticmethod\u003c/code\u003e or \u003ccode\u003e@classmethod\u003c/code\u003e were not given a context of their own. Now they are, on Python 3.11 and later. Closes \u003ca href=\"https://redirect.github.com/coveragepy/coveragepy/issues/1923\"\u003eissue 1923\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e:arrow_right:  PyPI page: \u003ca href=\"https://pypi.org/project/coverage/7.16.2\"\u003ecoverage 7.16.2\u003c/a\u003e.\n:arrow_right:  To install: \u003ccode\u003epython3 -m pip install coverage==7.16.2\u003c/code\u003e\u003c/p\u003e\n\u003ch2\u003e7.16.1\u003c/h2\u003e\n\u003ch2\u003eVersion 7.16.1 — 2026-09-13\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eFix: when the body of an irrefutable \u003ccode\u003ecase\u003c/code\u003e (like \u003ccode\u003ecase _:\u003c/code\u003e) is entirely excluded, the \u003ccode\u003ecase\u003c/code\u003e line is now excluded too, just as an excluded \u003ccode\u003eelse:\u003c/code\u003e body removes the \u003ccode\u003eelse:\u003c/code\u003e line. Previously the \u003ccode\u003ecase\u003c/code\u003e line was left behind and reported as missing. Closes \u003ca href=\"https://redirect.github.com/coveragepy/coveragepy/issues/1563\"\u003eissue 1563\u003c/a\u003e with \u003ca href=\"https://redirect.github.com/coveragepy/coveragepy/pull/2269\"\u003epull 2269\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003eFix: using \u003ca href=\"https://coverage.readthedocs.io/en/latest/api_coveragedata.html#coverage.CoverageData.update\"\u003eCoverageData.update()\u003c/a\u003e twice on an in-memory database would fail, as described in \u003ca href=\"https://redirect.github.com/coveragepy/coveragepy/issues/2279\"\u003eissue 2279\u003c/a\u003e. This is now fixed.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e:arrow_right:  PyPI page: \u003ca href=\"https://pypi.org/project/coverage/7.16.1\"\u003ecoverage 7.16.1\u003c/a\u003e.\n:arrow_right:  To install: \u003ccode\u003epython3 -m pip install coverage==7.16.1\u003c/code\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/coveragepy/coveragepy/blob/main/CHANGES.rst\"\u003ecoverage's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003eVersion 7.16.2 — 2026-09-27\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eFix: on Python 3.14 and later, a \u003ccode\u003efor\u003c/code\u003e loop completing immediately before a\nfunction return could mistakenly report an uncovered branch. This is now\nfixed, closing \u003ccode\u003eissue 2168\u003c/code\u003e_.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFix: on Python 3.14 and later, the \u003ccode\u003eelse\u003c/code\u003e clause of a \u003ccode\u003etry\u003c/code\u003e whose body is\na \u003ccode\u003ewith\u003c/code\u003e statement could incorrectly be reported as covered when the\n\u003ccode\u003ewith\u003c/code\u003e raised.  This is now fixed, closing \u003ccode\u003eissue 2289\u003c/code\u003e_.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFix: with \u003ccode\u003edynamic_context = test_function\u003c/code\u003e, test methods written as\n\u003ccode\u003e@staticmethod\u003c/code\u003e or \u003ccode\u003e@classmethod\u003c/code\u003e were not given a context of their own.\nNow they are, on Python 3.11 and later.  Closes \u003ccode\u003eissue 1923\u003c/code\u003e_.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e.. _issue 1923: \u003ca href=\"https://redirect.github.com/coveragepy/coveragepy/issues/1923\"\u003ecoveragepy/coveragepy#1923\u003c/a\u003e\n.. _issue 2168: \u003ca href=\"https://redirect.github.com/coveragepy/coveragepy/issues/2168\"\u003ecoveragepy/coveragepy#2168\u003c/a\u003e\n.. _issue 2289: \u003ca href=\"https://redirect.github.com/coveragepy/coveragepy/issues/2289\"\u003ecoveragepy/coveragepy#2289\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e.. _changes_7-16-1:\u003c/p\u003e\n\u003ch2\u003eVersion 7.16.1 — 2026-09-13\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eFix: when the body of an irrefutable \u003ccode\u003ecase\u003c/code\u003e (like \u003ccode\u003ecase _:\u003c/code\u003e) is entirely\nexcluded, the \u003ccode\u003ecase\u003c/code\u003e line is now excluded too, just as an excluded\n\u003ccode\u003eelse:\u003c/code\u003e body removes the \u003ccode\u003eelse:\u003c/code\u003e line.  Previously the \u003ccode\u003ecase\u003c/code\u003e line was\nleft behind and reported as missing.  Closes \u003ccode\u003eissue 1563\u003c/code\u003e_ with \u003ccode\u003epull 2269\u003c/code\u003e_.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFix: using :meth:\u003ccode\u003e.CoverageData.update\u003c/code\u003e twice on an in-memory database would\nfail, as described in \u003ccode\u003eissue 2279\u003c/code\u003e_. This is now fixed.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e.. _issue 1563: \u003ca href=\"https://redirect.github.com/coveragepy/coveragepy/issues/1563\"\u003ecoveragepy/coveragepy#1563\u003c/a\u003e\n.. _pull 2269: \u003ca href=\"https://redirect.github.com/coveragepy/coveragepy/pull/2269\"\u003ecoveragepy/coveragepy#2269\u003c/a\u003e\n.. _issue 2279: \u003ca href=\"https://redirect.github.com/coveragepy/coveragepy/issues/2279\"\u003ecoveragepy/coveragepy#2279\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e.. _changes_7-16-0:\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/coveragepy/coveragepy/commit/5643ae7c682bbd56ee1ac2b11556145ab8c2cab0\"\u003e\u003ccode\u003e5643ae7\u003c/code\u003e\u003c/a\u003e docs: prep for 7.16.2\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/coveragepy/coveragepy/commit/a3e969fc6ce8273538702a2336d8c2674f8017d8\"\u003e\u003ccode\u003ea3e969f\u003c/code\u003e\u003c/a\u003e fix: dynamic_context for \u003ca href=\"https://github.com/staticmethod\"\u003e\u003ccode\u003e@​staticmethod\u003c/code\u003e\u003c/a\u003e and \u003ca href=\"https://github.com/classmethod\"\u003e\u003ccode\u003e@​classmethod\u003c/code\u003e\u003c/a\u003e tests (issue 1923) (#...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/coveragepy/coveragepy/commit/8ad72362f03e59643865d15ffadd002529a777a9\"\u003e\u003ccode\u003e8ad7236\u003c/code\u003e\u003c/a\u003e fix: stop counting the try/else line when a with statement raises (\u003ca href=\"https://redirect.github.com/coveragepy/coveragepy/issues/2301\"\u003e#2301\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/coveragepy/coveragepy/commit/c6dab1fc387d161fe5938ce9421a7a38ca81ae7f\"\u003e\u003ccode\u003ec6dab1f\u003c/code\u003e\u003c/a\u003e fix(debug): debug output doesn't mis-handle odd line separators \u003ca href=\"https://redirect.github.com/coveragepy/coveragepy/issues/2296\"\u003e#2296\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/coveragepy/coveragepy/commit/08fbc3229adc8e7681a0d9134d3d5beb1684ae54\"\u003e\u003ccode\u003e08fbc32\u003c/code\u003e\u003c/a\u003e style: Protocols should use \u003ccode\u003e...\u003c/code\u003e for method bodies\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/coveragepy/coveragepy/commit/bc7b0e386388148687241cadcab56ac3e17aea9c\"\u003e\u003ccode\u003ebc7b0e3\u003c/code\u003e\u003c/a\u003e refactor: positional-only args are better than pragmas\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/coveragepy/coveragepy/commit/52afd6be360c3b949d69ff83aca873c119a7959a\"\u003e\u003ccode\u003e52afd6b\u003c/code\u003e\u003c/a\u003e Document parallel tox coverage data files (\u003ca href=\"https://redirect.github.com/coveragepy/coveragepy/issues/2284\"\u003e#2284\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/coveragepy/coveragepy/commit/f653aaec4c58f89375716389e4ca17dd056d2069\"\u003e\u003ccode\u003ef653aae\u003c/code\u003e\u003c/a\u003e fix: loop completion arcs on Python 3.14 (\u003ca href=\"https://redirect.github.com/coveragepy/coveragepy/issues/2281\"\u003e#2281\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/coveragepy/coveragepy/commit/cc1ced4d4c8ef7674a824002aa5157d1f37acd78\"\u003e\u003ccode\u003ecc1ced4\u003c/code\u003e\u003c/a\u003e test: PyPy still compiles comprehensions as functions\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/coveragepy/coveragepy/commit/85a9088395e89840cb11c1c86735ba1f7a62d50d\"\u003e\u003ccode\u003e85a9088\u003c/code\u003e\u003c/a\u003e chore: make upgrade\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/coveragepy/coveragepy/compare/7.16.0...7.16.2\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `django-stubs[compatible-mypy]` from 6.1.0 to 6.1.2\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/typeddjango/django-stubs/releases\"\u003edjango-stubs[compatible-mypy]'s releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e6.1.2\u003c/h2\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eSupport \u003ccode\u003emypy@2.4\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eLoosen \u003ccode\u003eWidget.format_value\u003c/code\u003e and remove override ignores by \u003ca href=\"https://github.com/brianhelba\"\u003e\u003ccode\u003e@​brianhelba\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/pull/3643\"\u003etypeddjango/django-stubs#3643\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003email: Accept smtp timeout as float by \u003ca href=\"https://github.com/9128305\"\u003e\u003ccode\u003e@​9128305\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/pull/3656\"\u003etypeddjango/django-stubs#3656\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix lookup expected type for transform chains (e.g. start_date__year__in) by \u003ca href=\"https://github.com/manysuq\"\u003e\u003ccode\u003e@​manysuq\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/pull/3655\"\u003etypeddjango/django-stubs#3655\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAllow a sequence of ActionLocation in admin.action's location by \u003ca href=\"https://github.com/knyghty\"\u003e\u003ccode\u003e@​knyghty\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/pull/3661\"\u003etypeddjango/django-stubs#3661\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/9128305\"\u003e\u003ccode\u003e@​9128305\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/pull/3656\"\u003etypeddjango/django-stubs#3656\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/typeddjango/django-stubs/compare/6.1.1...6.1.2\"\u003ehttps://github.com/typeddjango/django-stubs/compare/6.1.1...6.1.2\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e6.1.1\u003c/h2\u003e\n\u003ch2\u003eHighlight\u003c/h2\u003e\n\u003cp\u003eThis release does some changes around \u003ccode\u003eManager\u003c/code\u003e / \u003ccode\u003eRelatedManager\u003c/code\u003e and the auto generated \u003ccode\u003eobjects\u003c/code\u003e attribute to work better with typechecker like pyright / ty / pyrefly and be more strict about the fact that \u003ccode\u003eMyModel().objects\u003c/code\u003e is not valid.\u003c/p\u003e\n\u003cp\u003eHowever, to support that, existing broad annotations of related managers need to be narrowed or access to these related managers will be flagged as an error. For ex:\u003c/p\u003e\n\u003cpre lang=\"diff\"\u003e\u003ccode\u003efrom django.db import models\r\nfrom django_stubs_ext.db.models.manager import ManyRelatedManager, RelatedManager\r\n\u003cp\u003eclass Article(models.Model):\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ecategory_set: Manager[Category]\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003ecategory_set: RelatedManager[Category]\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003etags: Manager[Tag, ArticleTag]\u003c/li\u003e\n\u003c/ul\u003e\n\u003cul\u003e\n\u003cli\u003etags: ManyRelatedManager[Tag, ArticleTag]\n\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eIf you use the mypy plugin, you should also be able to drop these annotation completely in most cases. The plugin infers these types automatically.\u003c/p\u003e\n\u003cp\u003eSee \u003ca href=\"https://github.com/typeddjango/django-stubs#do-i-need-to-annotate-reverse-relations\"\u003ehttps://github.com/typeddjango/django-stubs#do-i-need-to-annotate-reverse-relations\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eFix revealed type for DistanceField and AreaField by \u003ca href=\"https://github.com/WhyNotHugo\"\u003e\u003ccode\u003e@​WhyNotHugo\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/pull/3587\"\u003etypeddjango/django-stubs#3587\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAllow database variants in on_delete for related fields. by \u003ca href=\"https://github.com/felixxm\"\u003e\u003ccode\u003e@​felixxm\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/pull/3591\"\u003etypeddjango/django-stubs#3591\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix bogus name-defined error for cross-module as_manager overrides by \u003ca href=\"https://github.com/BenA-SA\"\u003e\u003ccode\u003e@​BenA-SA\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/pull/3597\"\u003etypeddjango/django-stubs#3597\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix monkeypatch() erasing parametrization of real Generic subclasses by \u003ca href=\"https://github.com/mylittletraf\"\u003e\u003ccode\u003e@​mylittletraf\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/pull/3610\"\u003etypeddjango/django-stubs#3610\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eDon't build a ManyRelatedManager from a placeholder _Through by \u003ca href=\"https://github.com/codebreach\"\u003e\u003ccode\u003e@​codebreach\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/pull/3608\"\u003etypeddjango/django-stubs#3608\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAnnotate \u003ccode\u003eFileField.save_form_data\u003c/code\u003e by \u003ca href=\"https://github.com/brianhelba\"\u003e\u003ccode\u003e@​brianhelba\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/pull/3606\"\u003etypeddjango/django-stubs#3606\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eDisallow \u003ccode\u003eNone\u003c/code\u003e passed to \u003ccode\u003eFileField.generate_filename\u003c/code\u003e by \u003ca href=\"https://github.com/brianhelba\"\u003e\u003ccode\u003e@​brianhelba\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/pull/3607\"\u003etypeddjango/django-stubs#3607\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdd overloads for \u003ccode\u003eassertTemplateUsed\u003c/code\u003e and \u003ccode\u003eassertTemplateNotUsed\u003c/code\u003e by \u003ca href=\"https://github.com/brianhelba\"\u003e\u003ccode\u003e@​brianhelba\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/pull/3564\"\u003etypeddjango/django-stubs#3564\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdd defaults to the form type parameters of generic editing views by \u003ca href=\"https://github.com/brianhelba\"\u003e\u003ccode\u003e@​brianhelba\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/pull/3615\"\u003etypeddjango/django-stubs#3615\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eResolve objects through the metaclass and ban manager access on instances by \u003ca href=\"https://github.com/UnknownPlatypus\"\u003e\u003ccode\u003e@​UnknownPlatypus\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/pull/3593\"\u003etypeddjango/django-stubs#3593\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eType \u003ccode\u003esetter\u003c/code\u003e in \u003ccode\u003ehashers.check_password\u003c/code\u003e better by \u003ca href=\"https://github.com/Kakadus\"\u003e\u003ccode\u003e@​Kakadus\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/pull/3621\"\u003etypeddjango/django-stubs#3621\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRelax \u003ccode\u003eAbstractBaseUser.natural_key\u003c/code\u003e return type by \u003ca href=\"https://github.com/Kakadus\"\u003e\u003ccode\u003e@​Kakadus\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/pull/3622\"\u003etypeddjango/django-stubs#3622\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix \u003ccode\u003e@admin.display\u003c/code\u003e overload to specify \u003ccode\u003efunction\u003c/code\u003e by \u003ca href=\"https://github.com/ngnpope\"\u003e\u003ccode\u003e@​ngnpope\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/pull/3620\"\u003etypeddjango/django-stubs#3620\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/typeddjango/django-stubs/commit/fa03b48b8cdfe336065f5ad8eb51fbcc40c6b1d2\"\u003e\u003ccode\u003efa03b48\u003c/code\u003e\u003c/a\u003e Version 6.1.2 release (\u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/issues/3681\"\u003e#3681\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/typeddjango/django-stubs/commit/3568355bc144517b793f360884ea500f8c4c8352\"\u003e\u003ccode\u003e3568355\u003c/code\u003e\u003c/a\u003e Update dependency mypy to \u0026gt;=1.13,\u0026lt;2.5 (\u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/issues/3680\"\u003e#3680\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/typeddjango/django-stubs/commit/46cd7de1d2f48ecf9727992e4c7ce114d3f98b8f\"\u003e\u003ccode\u003e46cd7de\u003c/code\u003e\u003c/a\u003e Update dependency pyrefly to v1.3.2 (\u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/issues/3677\"\u003e#3677\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/typeddjango/django-stubs/commit/de0b49c8fb5d82bb2d5ab86ab4e4a92430a3893b\"\u003e\u003ccode\u003ede0b49c\u003c/code\u003e\u003c/a\u003e [pre-commit.ci] pre-commit autoupdate (\u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/issues/3675\"\u003e#3675\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/typeddjango/django-stubs/commit/c7b59a09461784a6ec07704fcfc67391f7e8000d\"\u003e\u003ccode\u003ec7b59a0\u003c/code\u003e\u003c/a\u003e Update dependency ty to v0.0.83 (\u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/issues/3671\"\u003e#3671\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/typeddjango/django-stubs/commit/e3a1189abb30e181d2e68fd6dd3cb868505dd584\"\u003e\u003ccode\u003ee3a1189\u003c/code\u003e\u003c/a\u003e Update astral-sh/setup-uv action to v10.2.0 (\u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/issues/3672\"\u003e#3672\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/typeddjango/django-stubs/commit/f0a186a2e272abcfdbd01e3f774c46afff9cd208\"\u003e\u003ccode\u003ef0a186a\u003c/code\u003e\u003c/a\u003e Update int128/hide-comment-action action to v1.75.0 (\u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/issues/3669\"\u003e#3669\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/typeddjango/django-stubs/commit/63161efeb94263520bed6fb6fb1023844b4b5872\"\u003e\u003ccode\u003e63161ef\u003c/code\u003e\u003c/a\u003e [pre-commit.ci] pre-commit autoupdate (\u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/issues/3667\"\u003e#3667\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/typeddjango/django-stubs/commit/dc0185492a5a26c64d8fc67278580ea5eb911c3f\"\u003e\u003ccode\u003edc01854\u003c/code\u003e\u003c/a\u003e Update dependency psycopg to v3.3.6 (\u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/issues/3668\"\u003e#3668\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/typeddjango/django-stubs/commit/d563832a021a84d56592e2828d054e56572421cb\"\u003e\u003ccode\u003ed563832\u003c/code\u003e\u003c/a\u003e Update dependency ty to v0.0.82 (\u003ca href=\"https://redirect.github.com/typeddjango/django-stubs/issues/3665\"\u003e#3665\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/typeddjango/django-stubs/compare/6.1.0...6.1.2\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `django-upgrade` from 1.32.0 to 1.33.0\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/adamchainz/django-upgrade/blob/main/docs/changelog.rst\"\u003edjango-upgrade's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e1.33.0 (2026-10-02)\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eReduce garbage collection frequency while fixing files, yielding a performance improvement of 2-7%, depending on Python version.\nMeasured on the source code of Django, Saleor, Wagtail, and Zulip, with no changes to make, the median speedups were ~7% on Python 3.11, ~3% on Python 3.13, and ~2% on Python 3.14, with no change in peak memory usage.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003ePR [#735](https://github.com/adamchainz/django-upgrade/issues/735) \u0026lt;https://github.com/adamchainz/django-upgrade/pull/735\u0026gt;\u003c/code\u003e__.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSpeed up the AST traversal by skipping fields that never contain nodes for fixers, such as expression contexts, yielding a further performance improvement of 3-7% on the same projects.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003ePR [#736](https://github.com/adamchainz/django-upgrade/issues/736) \u0026lt;https://github.com/adamchainz/django-upgrade/pull/736\u0026gt;\u003c/code\u003e__.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOnly call fixers for function calls, names, and attributes with names they handle, yielding a further performance improvement of 23-29% on the same projects.\nCombined with the above changes, django-upgrade is now 27-38% faster on these projects.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003ePR [#737](https://github.com/adamchainz/django-upgrade/issues/737) \u0026lt;https://github.com/adamchainz/django-upgrade/pull/737\u0026gt;\u003c/code\u003e__.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/adamchainz/django-upgrade/commit/5ccd385680292c5e5b10bedf0a3e509b5e6e9da8\"\u003e\u003ccode\u003e5ccd385\u003c/code\u003e\u003c/a\u003e Version 1.33.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/adamchainz/django-upgrade/commit/1d134cf353066b9cb281d45e88efd01c75f0de27\"\u003e\u003ccode\u003e1d134cf\u003c/code\u003e\u003c/a\u003e Add links to changelog notes\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/adamchainz/django-upgrade/commit/8dc2dbac056bf44b3487e68dfa57e45d84a56766\"\u003e\u003ccode\u003e8dc2dba\u003c/code\u003e\u003c/a\u003e Dispatch fixer callbacks by name (\u003ca href=\"https://redirect.github.com/adamchainz/django-upgrade/issues/737\"\u003e#737\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/adamchainz/django-upgrade/commit/7c4ff49d3870c6b746cf2ca11c89aaadff359ee8\"\u003e\u003ccode\u003e7c4ff49\u003c/code\u003e\u003c/a\u003e Speed up AST traversal in \u003ccode\u003evisit()\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/adamchainz/django-upgrade/issues/736\"\u003e#736\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/adamchainz/django-upgrade/commit/f2edbc3b0eaa517f1c36732c475007c700356191\"\u003e\u003ccode\u003ef2edbc3\u003c/code\u003e\u003c/a\u003e Reduce garbage collection frequency while fixing (\u003ca href=\"https://redirect.github.com/adamchainz/django-upgrade/issues/735\"\u003e#735\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/adamchainz/django-upgrade/commit/4580ebd9bf9fb9bcb89c3f61aceff21c4a9c74ab\"\u003e\u003ccode\u003e4580ebd\u003c/code\u003e\u003c/a\u003e Upgrade dependencies (\u003ca href=\"https://redirect.github.com/adamchainz/django-upgrade/issues/734\"\u003e#734\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/adamchainz/django-upgrade/commit/0c01d574b5cda79327614493c20fbefaf6f9fc49\"\u003e\u003ccode\u003e0c01d57\u003c/code\u003e\u003c/a\u003e [pre-commit.ci] pre-commit autoupdate (\u003ca href=\"https://redirect.github.com/adamchainz/django-upgrade/issues/732\"\u003e#732\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/adamchainz/django-upgrade/commit/592d36791b845dba8d0333f5c1f05289baf5a075\"\u003e\u003ccode\u003e592d367\u003c/code\u003e\u003c/a\u003e Upgrade dependencies (\u003ca href=\"https://redirect.github.com/adamchainz/django-upgrade/issues/731\"\u003e#731\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/adamchainz/django-upgrade/compare/1.32.0...1.33.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `djlint` from 1.46.1 to 1.46.4\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/djlint/djLint/releases\"\u003edjlint's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev1.46.4\u003c/h2\u003e\n\u003ch3\u003eFix\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eA line that opens a template block now indents the lines inside it when the rest of the line looks like a single-line html tag. Before, html in a string argument, as in \u003ccode\u003e{% call modal(\u0026quot;\u0026lt;strong\u0026gt;\u0026quot; ~ n ~ \u0026quot;\u0026lt;/strong\u0026gt;\u0026quot;) %}\u003c/code\u003e, or inline html right after the opening tag, as in \u003ccode\u003e{% if a %}\u0026lt;b\u0026gt;x\u0026lt;/b\u0026gt;\u003c/code\u003e, left the block's contents at its own level, and its closing tag ended up one level too far out.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev1.46.3\u003c/h2\u003e\n\u003ch3\u003ePerformance\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eA long run of unclosed \u003ccode\u003e{{\u003c/code\u003e or \u003ccode\u003e{%\u003c/code\u003e no longer makes linting and formatting quadratic. Each was read again from every opener to the end of the line or the file, so eight thousand \u003ccode\u003e{{\u003c/code\u003e on one line took over half a minute to lint and as long again to format, and twenty thousand in one attribute value took \u003ccode\u003eH054\u003c/code\u003e alone 80 seconds; each now takes well under a second. A second opener is taken to mean the first one never closed, which is how the tokenizer already read them. \u003ccode\u003eT038\u003c/code\u003e still reads an unclosed \u003ccode\u003e{%\u003c/code\u003e up to the next \u003ccode\u003e%}\u003c/code\u003e, as django does, so a run of those stays slow there.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eFix\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eA \u003ccode\u003e\u0026gt;\u003c/code\u003e inside a string of a template tag no longer ends the html tag around it when the string reuses the attribute's quote, as in \u003ccode\u003eclass=\u0026quot;{{ classes|default:\u0026quot;[\u0026amp;\u0026gt;a]:flex\u0026quot; }}\u0026quot;\u003c/code\u003e. Before, the linter lost the rest of the tag, so \u003ccode\u003eH037\u003c/code\u003e missed a repeated attribute after it, and the formatter put a line break inside the string.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eH054\u003c/code\u003e no longer reads an attribute out of a \u003ccode\u003e{# #}\u003c/code\u003e comment in another attribute's value, as in \u003ccode\u003e\u0026lt;a title=\u0026quot;{# \u0026quot; href #}\u0026quot;\u0026gt;\u003c/code\u003e, and leaves an input alone when an \u003ccode\u003e{% if %}\u003c/code\u003e writes its type and another tag writes the value, as in \u003ccode\u003e{% if shown %}type=\u0026quot;{% if hidden %}hidden{% else %}text{% endif %}\u0026quot;{% endif %}\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eA \u003ccode\u003e{#\u003c/code\u003e inside a \u003ccode\u003e{{ }}\u003c/code\u003e or \u003ccode\u003e{% %}\u003c/code\u003e tag, as in \u003ccode\u003e{{ \u0026quot;{# x\u0026quot; }}\u003c/code\u003e or an ICU message such as \u003ccode\u003e{n, plural, one {# item} other {# items}}\u003c/code\u003e, no longer opens a comment that runs to the next \u003ccode\u003e#}\u003c/code\u003e in the file. Before, the linter skipped everything in between, so \u003ccode\u003eT038\u003c/code\u003e reported the \u003ccode\u003e{% if %}\u003c/code\u003e before it as unclosed and \u003ccode\u003eT041\u003c/code\u003e missed an \u003ccode\u003e{% extends %}\u003c/code\u003e after it, and the formatter left the lines in between unformatted. A tag ends at its first closing delimiter, which is where django ends it.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev1.46.2\u003c/h2\u003e\n\u003ch3\u003eDocs\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eEach option on the configuration page now carries the release that brought it, so a reader held to an older djLint can tell at a glance what is there to reach for. The page's filter searches the versions too.\u003c/li\u003e\n\u003cli\u003edjLint publishes its own json schema at \u003ca href=\"https://djlint.com/schema/djlint.json\"\u003ehttps://djlint.com/schema/djlint.json\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003ePackaging\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eThe minimum required regex version is lowered from 2022.6.2 back to 2021.8.21, the first release that ships wheels for Python 3.10, which is djLint's own minimum.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/djlint/djLint/blob/master/CHANGELOG.md\"\u003edjlint's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e[1.46.4] - 2026-10-01\u003c/h2\u003e\n\u003ch3\u003eFix\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eA line that opens a template block now indents the lines inside it when the rest of the line looks like a single-line html tag. Before, html in a string argument, as in \u003ccode\u003e{% call modal(\u0026quot;\u0026lt;strong\u0026gt;\u0026quot; ~ n ~ \u0026quot;\u0026lt;/strong\u0026gt;\u0026quot;) %}\u003c/code\u003e, or inline html right after the opening tag, as in \u003ccode\u003e{% if a %}\u0026lt;b\u0026gt;x\u0026lt;/b\u0026gt;\u003c/code\u003e, left the block's contents at its own level, and its closing tag ended up one level too far out.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e[1.46.3] - 2026-09-28\u003c/h2\u003e\n\u003ch3\u003ePerformance\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eA long run of unclosed \u003ccode\u003e{{\u003c/code\u003e or \u003ccode\u003e{%\u003c/code\u003e no longer makes linting and formatting quadratic. Each was read again from every opener to the end of the line or the file, so eight thousand \u003ccode\u003e{{\u003c/code\u003e on one line took over half a minute to lint and as long again to format, and twenty thousand in one attribute value took \u003ccode\u003eH054\u003c/code\u003e alone 80 seconds; each now takes well under a second. A second opener is taken to mean the first one never closed, which is how the tokenizer already read them. \u003ccode\u003eT038\u003c/code\u003e still reads an unclosed \u003ccode\u003e{%\u003c/code\u003e up to the next \u003ccode\u003e%}\u003c/code\u003e, as django does, so a run of those stays slow there.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eFix\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eA \u003ccode\u003e\u0026gt;\u003c/code\u003e inside a string of a template tag no longer ends the html tag around it when the string reuses the attribute's quote, as in \u003ccode\u003eclass=\u0026quot;{{ classes|default:\u0026quot;[\u0026amp;\u0026gt;a]:flex\u0026quot; }}\u0026quot;\u003c/code\u003e. Before, the linter lost the rest of the tag, so \u003ccode\u003eH037\u003c/code\u003e missed a repeated attribute after it, and the formatter put a line break inside the string.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eH054\u003c/code\u003e no longer reads an attribute out of a \u003ccode\u003e{# #}\u003c/code\u003e comment in another attribute's value, as in \u003ccode\u003e\u0026lt;a title=\u0026quot;{# \u0026quot; href #}\u0026quot;\u0026gt;\u003c/code\u003e, and leaves an input alone when an \u003ccode\u003e{% if %}\u003c/code\u003e writes its type and another tag writes the value, as in \u003ccode\u003e{% if shown %}type=\u0026quot;{% if hidden %}hidden{% else %}text{% endif %}\u0026quot;{% endif %}\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eA \u003ccode\u003e{#\u003c/code\u003e inside a \u003ccode\u003e{{ }}\u003c/code\u003e or \u003ccode\u003e{% %}\u003c/code\u003e tag, as in \u003ccode\u003e{{ \u0026quot;{# x\u0026quot; }}\u003c/code\u003e or an ICU message such as \u003ccode\u003e{n, plural, one {# item} other {# items}}\u003c/code\u003e, no longer opens a comment that runs to the next \u003ccode\u003e#}\u003c/code\u003e in the file. Before, the linter skipped everything in between, so \u003ccode\u003eT038\u003c/code\u003e reported the \u003ccode\u003e{% if %}\u003c/code\u003e before it as unclosed and \u003ccode\u003eT041\u003c/code\u003e missed an \u003ccode\u003e{% extends %}\u003c/code\u003e after it, and the formatter left the lines in between unformatted. A tag ends at its first closing delimiter, which is where django ends it.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e[1.46.2] - 2026-09-19\u003c/h2\u003e\n\u003ch3\u003eDocs\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eEach option on the configuration page now carries the release that brought it, so a reader held to an older djLint can tell at a glance what is there to reach for. The page's filter searches the versions too.\u003c/li\u003e\n\u003cli\u003edjLint publishes its own json schema at \u003ca href=\"https://djlint.com/schema/djlint.json\"\u003ehttps://djlint.com/schema/djlint.json\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003ePackaging\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eThe minimum required regex version is lowered from 2022.6.2 back to 2021.8.21, the first release that ships wheels for Python 3.10, which is djLint's own minimum.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/djlint/djLint/commit/97266b950ee135d6ef89c9ace9d88baadced6f67\"\u003e\u003ccode\u003e97266b9\u003c/code\u003e\u003c/a\u003e chore(deps): update pre-commit hook tombi-toml/tombi-pre-commit to v1.5.6 (\u003ca href=\"https://redirect.github.com/djlint/djLint/issues/2\"\u003e#2\u003c/a\u003e...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/djlint/djLint/commit/5f40a434241d69428152cada7a63f3e25d19582e\"\u003e\u003ccode\u003e5f40a43\u003c/code\u003e\u003c/a\u003e v1.46.4\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/djlint/djLint/commit/47128e081ee74481e5c7386f3e3739158c3c09b1\"\u003e\u003ccode\u003e47128e0\u003c/code\u003e\u003c/a\u003e fix: indent under a block opener that holds inline html\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/djlint/djLint/commit/afe85bc3358ddc5d7ceb1af9ecf12bbb6491047e\"\u003e\u003ccode\u003eafe85bc\u003c/code\u003e\u003c/a\u003e chore(deps): lock file maintenance (\u003ca href=\"https://redirect.github.com/djlint/djLint/issues/2583\"\u003e#2583\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/djlint/djLint/commit/257c30fb1ddf311eb9b82658cc0d5adad4c90857\"\u003e\u003ccode\u003e257c30f\u003c/code\u003e\u003c/a\u003e chore(deps): lock file maintenance (\u003ca href=\"https://redirect.github.com/djlint/djLint/issues/2582\"\u003e#2582\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/djlint/djLint/commit/f1db0c54ccd6bc1934640e09cf977a640adcb0e5\"\u003e\u003ccode\u003ef1db0c5\u003c/code\u003e\u003c/a\u003e chore(deps): lock file maintenance (\u003ca href=\"https://redirect.github.com/djlint/djLint/issues/2581\"\u003e#2581\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/djlint/djLint/commit/0fe43b78ec51686f2db7167e311d4293fd0680cd\"\u003e\u003ccode\u003e0fe43b7\u003c/code\u003e\u003c/a\u003e chore(deps): lock file maintenance (\u003ca href=\"https://redirect.github.com/djlint/djLint/issues/2580\"\u003e#2580\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/djlint/djLint/commit/df19d81c59b0b15585e5ae3144952a2903646210\"\u003e\u003ccode\u003edf19d81\u003c/code\u003e\u003c/a\u003e v1.46.3\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/djlint/djLint/commit/83a1c0fc483e7ba7e3efd5a39bced6c681007ae7\"\u003e\u003ccode\u003e83a1c0f\u003c/code\u003e\u003c/a\u003e perf: stop reading a template tag at the next opener\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/djlint/djLint/commit/6ab9892a68620a0bdcc4e2ff964f84069689e65a\"\u003e\u003ccode\u003e6ab9892\u003c/code\u003e\u003c/a\u003e perf: read a run of unclosed template openers once\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/djlint/djLint/compare/v1.46.1...v1.46.4\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `mypy` from 2.3.1 to 2.4.0\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/python/mypy/blob/master/CHANGELOG.md\"\u003emypy's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003eMypy Release Notes\u003c/h1\u003e\n\u003ch2\u003eNext Release\u003c/h2\u003e\n\u003ch2\u003eMypy 2.4\u003c/h2\u003e\n\u003cp\u003eWe've just uploaded mypy 2.4.0 to the Python Package Index (\u003ca href=\"https://pypi.org/project/mypy/\"\u003ePyPI\u003c/a\u003e).\nMypy is a static type checker for Python. This release includes new features, performance\nimprovements and bug fixes. You can install it as follows:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003epython3 -m pip install -U mypy\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eYou can read the full documentation for this release on \u003ca href=\"http://mypy.readthedocs.io\"\u003eRead the Docs\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003ePython 3.15 Support\u003c/h3\u003e\n\u003cp\u003eMypy 2.4 supports running on Python 3.15 and type checking most Python\n3.15 features. This includes the new builtin \u003ccode\u003esentinel\u003c/code\u003e type for\nsentinel values (PEP 661), which mypy now supports (see below for\ndetails). Lazy imports (PEP 810) and unpacking in comprehensions\n(PEP 798) are also supported. Closed TypedDicts (PEP 728) have been\nsupported since mypy 2.2, but the \u003ccode\u003eextra_items\u003c/code\u003e TypedDict argument,\nalso introduced in PEP 728, is still unsupported. Support for\n\u003ccode\u003eextra_items\u003c/code\u003e will be added in a future mypy release.\u003c/p\u003e\n\u003ch3\u003eNative Parser Enabled by Default\u003c/h3\u003e\n\u003cp\u003eMypy now uses the new native parser by default. It's based on the Ruff\nparser, and it's significantly faster than the legacy parser, which\nuses the stdlib \u003ccode\u003east\u003c/code\u003e module. The native parser also has other\nbenefits:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eYou can target newer Python versions and use recent Python syntax\neven when running mypy on an older Python version. For example, you\ncan use \u003ccode\u003e--python-version 3.15\u003c/code\u003e when running mypy on Python 3.14.\u003c/li\u003e\n\u003cli\u003eStub files can use syntax that is newer than the target Python\nversion. For example, stubs can use the PEP 695 generic class syntax\n(\u003ccode\u003eclass Box[T]: ...\u003c/code\u003e) when running on or targeting Python 3.10.\u003c/li\u003e\n\u003cli\u003eParallel type checking requires the native parser.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe legacy parser is still available through \u003ccode\u003e--no-native-parser\u003c/code\u003e, or\n\u003ccode\u003enative_parser = False\u003c/code\u003e in the config file (\u003ccode\u003enative_parser = false\u003c/code\u003e\nunder \u003ccode\u003e[tool.mypy]\u003c/code\u003e in pyproject.toml). We are planning to remove the\nlegacy parser in early 2027. If you run into a problem with the native\nparser, please report it on the\n\u003ca href=\"https://github.com/python/mypy/issues\"\u003eissue tracker\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eUnlike the legacy parser, the native parser doesn't support type\ncomments for variables defined by \u003ccode\u003efor\u003c/code\u003e and \u003ccode\u003ewith\u003c/code\u003e statements. These\ntype comments are silently ignored, and the types of the variables are\u003c/p\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/935ba8afba7ceacca0651579450c74339f343016\"\u003e\u003ccode\u003e935ba8a\u003c/code\u003e\u003c/a\u003e Bump version to 2.4.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/334a678967dc6bcda3d3f8cb82e253dd61fa2be9\"\u003e\u003ccode\u003e334a678\u003c/code\u003e\u003c/a\u003e Add link for PR 22066 in mypy 2.4 changelog (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22082\"\u003e#22082\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/fe69660bcdaa76cccb1aedbb4b9c1c7627215571\"\u003e\u003ccode\u003efe69660\u003c/code\u003e\u003c/a\u003e Finalize mypy 2.4 changelog (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22080\"\u003e#22080\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/541fd87ac53581fb3c511b277fd780ec4e869c95\"\u003e\u003ccode\u003e541fd87\u003c/code\u003e\u003c/a\u003e Various mypy 2.4 changelog updates (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22077\"\u003e#22077\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/b231182c0b2993918f74594236bda7d3ec6fcbe5\"\u003e\u003ccode\u003eb231182\u003c/code\u003e\u003c/a\u003e Update native parser docs (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22078\"\u003e#22078\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/04fe42ce217f120a4de2c1fd62b71ef77452d699\"\u003e\u003ccode\u003e04fe42c\u003c/code\u003e\u003c/a\u003e Initial Changelog for Mypy 2.4 (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22071\"\u003e#22071\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/06174941bca0e88567441ee3cb0ffaef0dd22e2c\"\u003e\u003ccode\u003e0617494\u003c/code\u003e\u003c/a\u003e Quick fix for non UTF-8 encodings with new parser (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22066\"\u003e#22066\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/b2f9b60eae5ac7cd9c6a60650b128815bb703daf\"\u003e\u003ccode\u003eb2f9b60\u003c/code\u003e\u003c/a\u003e Bump librt to 0.16.0 (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22067\"\u003e#22067\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/9d798dcb9589f9bd62e625a97d8db23ad9a678fa\"\u003e\u003ccode\u003e9d798dc\u003c/code\u003e\u003c/a\u003e Sync typeshed (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22054\"\u003e#22054\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/python/mypy/commit/0861bb6450d6d3658e44dbca9cd2ba478faf3c1d\"\u003e\u003ccode\u003e0861bb6\u003c/code\u003e\u003c/a\u003e Reduce max protocol stack size to 20 (\u003ca href=\"https://redirect.github.com/python/mypy/issues/22053\"\u003e#22053\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/python/mypy/compare/v2.3.1...v2.4.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `ruff` from 0.16.6 to 0.17.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/astral-sh/ruff/releases\"\u003eruff's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e0.17.0\u003c/h2\u003e\n\u003ch2\u003eRelease Notes\u003c/h2\u003e\n\u003cp\u003eReleased on 2026-10-09.\u003c/p\u003e\n\u003cp\u003eThe executables in our macOS and Windows release archives and \u003ccode\u003eruff\u003c/code\u003e wheels are now code-signed. macOS executables are signed with an Apple Developer ID certificate and notarized by Apple. Windows executables have timestamped Authenticode signatures from Azure Artifact Signing. This enables verification of the release publisher and binary integrity, supports publisher-based allowlisting, and should reduce security warnings and antivirus false positives.\u003c/p\u003e\n\u003ch3\u003eBreaking changes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate the default and latest Python versions for 3.15 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28792\"\u003e#28792\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eRuff now defaults to Python 3.11 instead of 3.10 when no Python version is configured through \u003ca href=\"https://docs.astral.sh/ruff/settings/#target-version\"\u003e\u003ccode\u003etarget-version\u003c/code\u003e\u003c/a\u003e or \u003ca href=\"https://docs.astral.sh/ruff/configuration/#inferring-the-python-version\"\u003e\u003ccode\u003erequires-python\u003c/code\u003e\u003c/a\u003e. When checking for syntax errors without a configured Python version, Ruff now defaults to Python 3.15 instead of 3.14.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate the default rule set (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28786\"\u003e#28786\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eSeveral of the \u003ccode\u003eflake8-datetimez\u003c/code\u003e rules (\u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-without-tzinfo/\"\u003e\u003ccode\u003eDTZ001\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-now-without-tzinfo/\"\u003e\u003ccode\u003eDTZ005\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-fromtimestamp/\"\u003e\u003ccode\u003eDTZ006\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-strptime-without-zone/\"\u003e\u003ccode\u003eDTZ007\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://docs.astral.sh/ruff/rules/call-date-today/\"\u003e\u003ccode\u003eDTZ011\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://docs.astral.sh/ruff/rules/call-date-fromtimestamp/\"\u003e\u003ccode\u003eDTZ012\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://docs.astral.sh/ruff/rules/datetime-min-max/\"\u003e\u003ccode\u003eDTZ901\u003c/code\u003e\u003c/a\u003e) are no longer enabled by default, while \u003ca href=\"https://docs.astral.sh/ruff/rules/undefined-local-with-nested-import-star-usage/\"\u003e\u003ccode\u003eundefined-local-with-nested-import-star-usage\u003c/code\u003e\u003c/a\u003e (\u003ccode\u003eF406\u003c/code\u003e), which corresponds to a syntax error, is now enabled by default.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate Rust crate quick-junit to 0.8.0 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/27295\"\u003e#27295\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eJUnit output now uses a \u003ccode\u003eskipped\u003c/code\u003e attribute instead of \u003ccode\u003edisabled\u003c/code\u003e on \u003ccode\u003e\u0026lt;testsuite\u0026gt;\u003c/code\u003e elements and includes a \u003ccode\u003eskipped\u003c/code\u003e attribute on the root \u003ccode\u003e\u0026lt;testsuites\u0026gt;\u003c/code\u003e element.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e[\u003ccode\u003eflake8-import-conventions\u003c/code\u003e] Add \u003ccode\u003edatetime as dt\u003c/code\u003e as a conventional alias (\u003ccode\u003eICN001\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28790\"\u003e#28790\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSupport Unicode dummy variable names (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28722\"\u003e#28722\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eThe default \u003ca href=\"https://docs.astral.sh/ruff/settings/#lint_dummy-variable-rgx\"\u003e\u003ccode\u003elint.dummy-variable-rgx\u003c/code\u003e\u003c/a\u003e now recognizes underscore-prefixed Unicode names, such as \u003ccode\u003e_次\u003c/code\u003e, as dummy variables.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate to Unicode 17 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/21229\"\u003e#21229\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28784\"\u003e#28784\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eRuff now uses Unicode 17 data for identifier normalization and named character escapes (\u003ccode\u003e\u0026quot;\\N{...}\u0026quot;\u003c/code\u003e).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAlways show unsafe and display-only fixes in the CLI (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/27810\"\u003e#27810\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eThe default \u003ccode\u003efull\u003c/code\u003e output format now shows unsafe fixes and suggestions requiring manual review, regardless of the \u003ca href=\"https://docs.astral.sh/ruff/settings/#unsafe-fixes\"\u003e\u003ccode\u003eunsafe-fixes\u003c/code\u003e\u003c/a\u003e setting. Actually applying unsafe fixes still requires explicit opt-in.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRemove the Python dependency from conda-forge builds (\u003ca href=\"https://redirect.github.com/conda-forge/ruff-feedstock/pull/361\"\u003econda-forge/ruff-feedstock#361\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eThe conda-forge build no longer depends on Python, now supports linux-riscv64, win-arm64, and linux-ppc64le platforms, and now includes shell completions. However, no longer depending on Python means that \u003ccode\u003epython -m ruff\u003c/code\u003e and \u003ccode\u003eimport ruff\u003c/code\u003e will no longer work. Use \u003ccode\u003eruff\u003c/code\u003e directly from \u003ccode\u003ePATH\u003c/code\u003e instead. PyPI installations and those from the standalone installer are unaffected.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRemove support for ruff-lsp (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28750\"\u003e#28750\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eSupport for \u003ccode\u003eruff-lsp\u003c/code\u003e, the legacy Python language server \u003ca href=\"https://github.com/astral-sh/ruff/releases/tag/0.9.5\"\u003edeprecated in Ruff v0.9.5\u003c/a\u003e, has been removed. The Ruff VS Code extension now always uses the native language server; \u003ccode\u003eruff.nativeServer\u003c/code\u003e is deprecated and ignored. See the \u003ca href=\"https://docs.astral.sh/ruff/editors/migration/\"\u003emigration guide\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eStabilization\u003c/h3\u003e\n\u003cp\u003eThe following rules have been stabilized and are no longer in preview:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://docs.astral.sh/ruff/rules/lazy-import-mismatch\"\u003e\u003ccode\u003elazy-import-mismatch\u003c/code\u003e\u003c/a\u003e (\u003ccode\u003eTID254\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://docs.astral.sh/ruff/rules/lazy-import-immediately-resolved\"\u003e\u003ccode\u003elazy-import-immediately-resolved\u003c/code\u003e\u003c/a\u003e (\u003ccode\u003eTID255\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://docs.astral.sh/ruff/rules/os-path-commonprefix\"\u003e\u003ccode\u003eos-path-commonprefix\u003c/code\u003e\u003c/a\u003e (\u003ccode\u003eRUF071\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md\"\u003eruff's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e0.17.0\u003c/h2\u003e\n\u003cp\u003eReleased on 2026-10-09.\u003c/p\u003e\n\u003cp\u003eThe executables in our macOS and Windows release archives and \u003ccode\u003eruff\u003c/code\u003e wheels are now code-signed.\nmacOS executables are signed with an Apple Developer ID certificate and notarized by Apple. Windows\nexecutables have timestamped Authenticode signatures from Azure Artifact Signing. This enables\nverification of the release publisher and binary integrity, supports publisher-based allowlisting,\nand should reduce security warnings and antivirus false positives.\u003c/p\u003e\n\u003ch3\u003eBreaking changes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate the default and latest Python versions for 3.15 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28792\"\u003e#28792\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eRuff now defaults to Python 3.11 instead of 3.10 when no Python version is configured through\n\u003ca href=\"https://docs.astral.sh/ruff/settings/#target-version\"\u003e\u003ccode\u003etarget-version\u003c/code\u003e\u003c/a\u003e or\n\u003ca href=\"https://docs.astral.sh/ruff/configuration/#inferring-the-python-version\"\u003e\u003ccode\u003erequires-python\u003c/code\u003e\u003c/a\u003e. When\nchecking for syntax errors without a configured Python version, Ruff now defaults to Python 3.15\ninstead of 3.14.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate the default rule set (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28786\"\u003e#28786\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eSeveral of the \u003ccode\u003eflake8-datetimez\u003c/code\u003e rules\n(\u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-without-tzinfo/\"\u003e\u003ccode\u003eDTZ001\u003c/code\u003e\u003c/a\u003e,\n\u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-now-without-tzinfo/\"\u003e\u003ccode\u003eDTZ005\u003c/code\u003e\u003c/a\u003e,\n\u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-fromtimestamp/\"\u003e\u003ccode\u003eDTZ006\u003c/code\u003e\u003c/a\u003e,\n\u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-strptime-without-zone/\"\u003e\u003ccode\u003eDTZ007\u003c/code\u003e\u003c/a\u003e,\n\u003ca href=\"https://docs.astral.sh/ruff/rules/call-date-today/\"\u003e\u003ccode\u003eDTZ011\u003c/code\u003e\u003c/a\u003e,\n\u003ca href=\"https://docs.astral.sh/ruff/rules/call-date-fromtimestamp/\"\u003e\u003ccode\u003eDTZ012\u003c/code\u003e\u003c/a\u003e, and\n\u003ca href=\"https://docs.astral.sh/ruff/rules/datetime-min-max/\"\u003e\u003ccode\u003eDTZ901\u003c/code\u003e\u003c/a\u003e) are no longer enabled by default,\nwhile \u003ca href=\"https://docs.astral.sh/ruff/rules/undefined-local-with-nested-import-star-usage/\"\u003e\u003ccode\u003eundefined-local-with-nested-import-star-usage\u003c/code\u003e\u003c/a\u003e\n(\u003ccode\u003eF406\u003c/code\u003e), which corresponds to a syntax error, is now enabled by default.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate Rust crate quick-junit to 0.8.0 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/27295\"\u003e#27295\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eJUnit output now uses a \u003ccode\u003eskipped\u003c/code\u003e attribute instead of \u003ccode\u003edisabled\u003c/code\u003e on \u003ccode\u003e\u0026lt;testsuite\u0026gt;\u003c/code\u003e elements and\nincludes a \u003ccode\u003eskipped\u003c/code\u003e attribute on the root \u003ccode\u003e\u0026lt;testsuites\u0026gt;\u003c/code\u003e element.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e[\u003ccode\u003eflake8-import-conventions\u003c/code\u003e] Add \u003ccode\u003edatetime as dt\u003c/code\u003e as a conventional alias (\u003ccode\u003eICN001\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28790\"\u003e#28790\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSupport Unicode dummy variable names (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28722\"\u003e#28722\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eThe default \u003ca href=\"https://docs.astral.sh/ruff/settings/#lint_dummy-variable-rgx\"\u003e\u003ccode\u003elint.dummy-variable-rgx\u003c/code\u003e\u003c/a\u003e\nnow recognizes underscore-prefixed Unicode names, such as \u003ccode\u003e_次\u003c/code\u003e, as dummy variables.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate to Unicode 17 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/21229\"\u003e#21229\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28784\"\u003e#28784\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eRuff now uses Unicode 17 data for identifier normalization and named character escapes (\u003ccode\u003e\u0026quot;\\N{...}\u0026quot;\u003c/code\u003e).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAlways show unsafe and display-only fixes in the CLI (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/27810\"\u003e#27810\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/5b27c1ccfaa230fb195855f5cf3404a21e3379cd\"\u003e\u003ccode\u003e5b27c1c\u003c/code\u003e\u003c/a\u003e Bump version to 0.17.0 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/29259\"\u003e#29259\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/8f362bf4cb5dbad095ac416602496705d41fc843\"\u003e\u003ccode\u003e8f362bf\u003c/code\u003e\u003c/a\u003e Integrate vendored Unicode names into Ruff\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/88a50d695c1142294bb4c780fad47d3306173885\"\u003e\u003ccode\u003e88a50d6\u003c/code\u003e\u003c/a\u003e Revert upstream Unicode loose matching\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/276832aa91f2086a6ec880884fcdd987991cddf2\"\u003e\u003ccode\u003e276832a\u003c/code\u003e\u003c/a\u003e Revert upstream Unicode alias normalization\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/26911caa2800758779965510d2f222b438abbb38\"\u003e\u003ccode\u003e26911ca\u003c/code\u003e\u003c/a\u003e Vendor unicode_names2 from upstream\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/27e3797508d1a7ad69e4900d51e38d78785aaf73\"\u003e\u003ccode\u003e27e3797\u003c/code\u003e\u003c/a\u003e [\u003ccode\u003eruff\u003c/code\u003e] Stabilize \u003ccode\u003eos-path-commonprefix\u003c/code\u003e (\u003ccode\u003eRUF071\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/28764\"\u003e#28764\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/bbb52c1267cf39aba67e54c2b5800878d23073a9\"\u003e\u003ccode\u003ebbb52c1\u003c/code\u003e\u003c/a\u003e [\u003ccode\u003eflake8-tidy-imports\u003c/code\u003e] Stabilize \u003ccode\u003elazy-import-immediately-resolved\u003c/code\u003e (`TID255...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/5aa9cbd3a49d32b24ac21fa7797ca87a330792a2\"\u003e\u003ccode\u003e5aa9cbd\u003c/code\u003e\u003c/a\u003e [\u003ccode\u003eflake8-tidy-imports\u003c/code\u003e] Stabilize \u003ccode\u003elazy-import-mismatch\u003c/code\u003e (\u003ccode\u003eTID254\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/28760\"\u003e#28760\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/dba1bc893aedfeea2064c4e8e764135f0d44dc3f\"\u003e\u003ccode\u003edba1bc8\u003c/code\u003e\u003c/a\u003e [\u003ccode\u003eflake8-import-conventions\u003c/code\u003e] Add \u003ccode\u003edatetime as dt\u003c/code\u003e as a conventional alias (`...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/ef23c9c39eb3029bab0139c3ea7ae6d95c4131e0\"\u003e\u003ccode\u003eef23c9c\u003c/code\u003e\u003c/a\u003e Update default and latest Python versions for 3.15 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/28792\"\u003e#28792\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/astral-sh/ruff/compare/0.16.6...0.17.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `werkzeug[watchdog]` from 3.1.8 to 3.1.9\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pallets/werkzeug/releases\"\u003ewerkzeug[watchdog]'s releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e3.1.9\u003c/h2\u003e\n\u003cp\u003eThis is the Werkzeug 3.1.9 security fix release, which fixes security issues and bugs but does not otherwise change behavior and should not result in breaking changes compared to the latest feature release.\u003c/p\u003e\n\u003cp\u003ePyPI: \u003ca href=\"https://pypi.org/project/Werkzeug/3.1.9/\"\u003ehttps://pypi.org/project/Werkzeug/3.1.9/\u003c/a\u003e\nChanges: \u003ca href=\"https://werkzeug.palletsprojects.com/page/changes/#version-3-1-9\"\u003ehttps://werkzeug.palletsprojects.com/page/changes/#version-3-1-9\u003c/a\u003e\nMilestone: \u003ca href=\"https://github.com/pallets/werkzeug/milestone/46?closed=1\"\u003ehttps://github.com/pallets/werkzeug/milestone/46?closed=1\u003c/a\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003esafe_join\u003c/code\u003e on Windows does not allow special devices names with empty ADS markers on NTFS. \u003ca href=\"https://github.com/pallets/werkzeug/security/advisories/GHSA-g6x2-hccm-hh4m\"\u003ehttps://github.com/pallets/werkzeug/security/advisories/GHSA-g6x2-hccm-hh4m\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eProfilerMiddleware\u003c/code\u003e uses \u003ccode\u003eprofiling.tracing\u003c/code\u003e on Python 3.15. \u003ca href=\"https://redirect.github.com/pallets/werkzeug/issues/3207\"\u003e#3207\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003euri_to_iri\u003c/code\u003e and \u003ccode\u003eiri_to_uri\u003c/code\u003e preserve empty username, password, and port 0. \u003ca href=\"https://redirect.github.com/pallets/werkzeug/issues/3189\"\u003e#3189\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eImprove performance of \u003ccode\u003eparse_options_header\u003c/code\u003e. \u003ca href=\"https://redirect.github.com/pallets/werkzeug/issues/3231\"\u003e#3231\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eImprove performance of \u003ccode\u003eparse_etags\u003c/code\u003e. \u003ca href=\"https://redirect.github.com/pallets/werkzeug/issues/3231\"\u003e#3231\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eImprove performance of \u003ccode\u003eparse_cookie\u003c/code\u003e. \u003ca href=\"https://redirect.github.com/pallets/werkzeug/issues/3231\"\u003e#3231\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eget_host\u003c/code\u003e also checks that the port is in the valid range. \u003ca href=\"https://redirect.github.com/pallets/werkzeug/issues/3236\"\u003e#3236\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eThe \u003ccode\u003eint\u003c/code\u003e URL converter returns a 404 instead of 500 error when the value is longer than \u003ccode\u003esys.get_int_max_str_digits()\u003c/code\u003e. \u003ca href=\"https://redirect.github.com/pallets/werkzeug/issues/3237\"\u003e#3237\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eImprove debugger PIN generation from cgroup data inside Podman. \u003ca href=\"https://redirect.github.com/pallets/werkzeug/issues/3245\"\u003e#3245\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eAuthorization\u003c/code\u003e parsing \u003ccode\u003ebasic\u003c/code\u003e auth disallows non-base64 characters.  \u003ca href=\"https://redirect.github.com/pallets/werkzeug/issues/3248\"\u003e#3248\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eapplication/x-www-form-urlencoded\u003c/code\u003e form data is no longer limited to \u003ccode\u003emax_form_memory_size\u003c/code\u003e...\n\n_Description has been truncated_","html_url":"https://github.com/christ-ph/projetFinal/pull/17","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/christ-ph%2FprojetFinal/issues/17","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/17/packages"}},{"old_version":"21.14.5","new_version":"21.14.6","update_type":"patch","path":null,"pr_created_at":"2026-10-13T06:51:29.000Z","version_change":"21.14.5 → 21.14.6","issue":{"uuid":"5825908296","node_id":"PR_kwDOAMpNN88AAAABIHUhyw","number":14049,"state":"open","title":"Bump virtualenv from 21.14.5 to 21.14.6","user":"dependabot[bot]","labels":["dependencies"],"assignees":[],"locked":false,"comments_count":2,"pull_request":true,"closed_at":null,"author_association":null,"state_reason":null,"created_at":"2026-10-13T06:51:29.000Z","updated_at":"2026-10-13T08:34:24.000Z","time_to_close":null,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"Bump","packages":[{"name":"virtualenv","old_version":"21.14.5","new_version":"21.14.6","repository_url":"https://github.com/pypa/virtualenv"}],"path":null,"ecosystem":"pip"},"body":"Bumps [virtualenv](https://github.com/pypa/virtualenv) from 21.14.5 to 21.14.6.\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pypa/virtualenv/releases\"\u003evirtualenv's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e21.14.6\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e👷 ci: pin ubuntu-26.04, clear warnings, bump deps by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3378\"\u003epypa/virtualenv#3378\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(ci): defer upgrades blocked by release age by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3379\"\u003epypa/virtualenv#3379\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eci: overlap release transfers and verification by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3382\"\u003epypa/virtualenv#3382\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(seed): guard every embed update log read, not just one by \u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3383\"\u003epypa/virtualenv#3383\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.14.5...21.14.6\"\u003ehttps://github.com/pypa/virtualenv/compare/21.14.5...21.14.6\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pypa/virtualenv/blob/main/docs/changelog.rst\"\u003evirtualenv's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003eBugfixes - 21.14.6\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eFall back to the bundled seed wheel with periodic update on (the default) when the embed update log holds JSON of the\nwrong shape, instead of downloading the wheel or, offline, failing to create the environment - by :user:\u003ccode\u003edarrenhuai\u003c/code\u003e.\n(:issue:\u003ccode\u003e3383\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003ev21.14.5 (2026-10-02)\u003c/p\u003e\n\u003chr /\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/9e69ac725fd4dc83726536c084ab9ca4f099c5b6\"\u003e\u003ccode\u003e9e69ac7\u003c/code\u003e\u003c/a\u003e release 21.14.6\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/464c34b696c81190cd1ad6589158f6ce59467351\"\u003e\u003ccode\u003e464c34b\u003c/code\u003e\u003c/a\u003e 🐛 fix(seed): guard every embed update log read, not just one (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3383\"\u003e#3383\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/3f56d7f4b88884296249b83889d717c41ed6e668\"\u003e\u003ccode\u003e3f56d7f\u003c/code\u003e\u003c/a\u003e ci: overlap release transfers and verification (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3382\"\u003e#3382\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/7577efd46b0e62c5edbd803ded2788eb6d48f5ca\"\u003e\u003ccode\u003e7577efd\u003c/code\u003e\u003c/a\u003e chore(deps): bump the runtime-dependencies group with 10 updates (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3381\"\u003e#3381\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/f6d172367b48d5138fcab911ff8fdd86b4e8cdaf\"\u003e\u003ccode\u003ef6d1723\u003c/code\u003e\u003c/a\u003e [pre-commit.ci] pre-commit autoupdate (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3380\"\u003e#3380\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/7c56749d7b3065f6a99b21fd61089ba692e4aaec\"\u003e\u003ccode\u003e7c56749\u003c/code\u003e\u003c/a\u003e fix(ci): defer upgrades blocked by release age (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3379\"\u003e#3379\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/95d02526dc5f2c569767d8ee572f72f571b8a6ce\"\u003e\u003ccode\u003e95d0252\u003c/code\u003e\u003c/a\u003e 👷 ci: pin ubuntu-26.04, clear warnings, bump deps (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3378\"\u003e#3378\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.14.5...21.14.6\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=virtualenv\u0026package-manager=pip\u0026previous-version=21.14.5\u0026new-version=21.14.6)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n\n\n\u003c/details\u003e","html_url":"https://github.com/aio-libs/aiohttp/pull/14049","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/aio-libs%2Faiohttp/issues/14049","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/14049/packages"}},{"old_version":"21.14.3","new_version":"21.14.6","update_type":"patch","path":null,"pr_created_at":"2026-10-13T02:07:18.000Z","version_change":"21.14.3 → 21.14.6","issue":{"uuid":"5823283779","node_id":"PR_kwDOQG1kCc8AAAABIFQNhA","number":87,"state":"closed","title":"deps(deps): bump the python-minor-patch group with 9 updates","user":"dependabot[bot]","labels":[],"assignees":["ay-mich"],"locked":false,"comments_count":1,"pull_request":true,"closed_at":"2026-10-13T02:07:32.000Z","author_association":null,"state_reason":null,"created_at":"2026-10-13T02:07:18.000Z","updated_at":"2026-10-13T02:07:42.000Z","time_to_close":14,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"deps(deps): bump","group_name":"python-minor-patch","update_count":9,"packages":[{"name":"pydantic","old_version":"2.13.5","new_version":"2.14.0","repository_url":"https://github.com/pydantic/pydantic"},{"name":"ruff","old_version":"0.16.10","new_version":"0.17.0","repository_url":"https://github.com/astral-sh/ruff"},{"name":"filelock","old_version":"4.0.9","new_version":"4.1.0","repository_url":"https://github.com/tox-dev/py-filelock"},{"name":"iniconfig","old_version":"2.3.0","new_version":"2.3.1","repository_url":"https://github.com/pytest-dev/iniconfig"},{"name":"markupsafe","old_version":"3.0.3","new_version":"3.0.4","repository_url":"https://github.com/pallets/markupsafe"},{"name":"platformdirs","old_version":"4.12.2","new_version":"4.12.4","repository_url":"https://github.com/tox-dev/platformdirs"},{"name":"pycparser","old_version":"3.0","new_version":"3.11","repository_url":"https://github.com/eliben/pycparser"},{"name":"pydantic-core","old_version":"2.49.0","new_version":"2.50.0","repository_url":"https://github.com/pydantic/pydantic"},{"name":"virtualenv","old_version":"21.14.3","new_version":"21.14.6","repository_url":"https://github.com/pypa/virtualenv"}],"path":null,"ecosystem":"pip"},"body":"Bumps the python-minor-patch group with 9 updates:\n\n| Package | From | To |\n| --- | --- | --- |\n| [pydantic](https://github.com/pydantic/pydantic) | `2.13.5` | `2.14.0` |\n| [ruff](https://github.com/astral-sh/ruff) | `0.16.10` | `0.17.0` |\n| [filelock](https://github.com/tox-dev/py-filelock) | `4.0.9` | `4.1.0` |\n| [iniconfig](https://github.com/pytest-dev/iniconfig) | `2.3.0` | `2.3.1` |\n| [markupsafe](https://github.com/pallets/markupsafe) | `3.0.3` | `3.0.4` |\n| [platformdirs](https://github.com/tox-dev/platformdirs) | `4.12.2` | `4.12.4` |\n| [pycparser](https://github.com/eliben/pycparser) | `3.0` | `3.11` |\n| [pydantic-core](https://github.com/pydantic/pydantic) | `2.49.0` | `2.50.0` |\n| [virtualenv](https://github.com/pypa/virtualenv) | `21.14.3` | `21.14.6` |\n\nUpdates `pydantic` from 2.13.5 to 2.14.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pydantic/pydantic/releases\"\u003epydantic's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev2.14.0 2026-10-08\u003c/h2\u003e\n\u003ch3\u003eWhat's Changed\u003c/h3\u003e\n\u003cp\u003eThe highlights of the v2.14 release are available in the \u003ca href=\"https://pydantic.dev/articles/pydantic-v2-14-release\"\u003eblog post\u003c/a\u003e.\nSeveral minor changes (considered non-breaking changes according to our \u003ca href=\"https://pydantic.dev/docs/validation/2.14/get-started/version-policy/#pydantic-v2\"\u003eversioning policy\u003c/a\u003e) are also included in this release. Make sure to look into them before upgrading.\u003c/p\u003e\n\u003cp\u003eThis release drops support for Python 3.9 and adds support for Python 3.15.\u003c/p\u003e\n\u003ch4\u003eNew Features\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eAdd support for \u003ccode\u003emultiple_of\u003c/code\u003e constraint in \u003ccode\u003efraction\u003c/code\u003e and \u003ccode\u003etimedelta\u003c/code\u003e core schemas by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13873\"\u003e#13873\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003e__namespace__\u003c/code\u003e parameter to \u003ccode\u003ecreate_model()\u003c/code\u003e by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13895\"\u003e#13895\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4\u003eChanges\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eAdd an \u003ccode\u003eordered-dict\u003c/code\u003e core schema by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13796\"\u003e#13796\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdd a \u003ccode\u003ecounter\u003c/code\u003e core schema by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13824\"\u003e#13824\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eDo not mutate \u003ccode\u003emodel_config\u003c/code\u003e attribute by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13825\"\u003e#13825\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eReject newlines in \u003ccode\u003eNameEmail\u003c/code\u003e validation by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13897\"\u003e#13897\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4\u003eFixes\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eCall enum constructors in both validation modes by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13792\"\u003e#13792\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix documentation examples not raising and remove unused \u003ccode\u003estring_sub_type\u003c/code\u003e unused error code by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13821\"\u003e#13821\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eCatch \u003ccode\u003eOverflowError\u003c/code\u003e during \u003ccode\u003eByteSize\u003c/code\u003e validation by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13850\"\u003e#13850\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRequire \u003ccode\u003emultiple_of\u003c/code\u003e constraints to be positive by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13862\"\u003e#13862\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAlways pop field name and model type stacks during schema generation by \u003ca href=\"https://github.com/saquibjawedbit\"\u003e\u003ccode\u003e@​saquibjawedbit\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13859\"\u003e#13859\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eHandle \u003ccode\u003eTypeError\u003c/code\u003e gracefully during docstring extraction by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13874\"\u003e#13874\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix config propagation of stdlib dataclasses and \u003ccode\u003eTypedDict\u003c/code\u003es in JSON Schema by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13891\"\u003e#13891\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eDon't apply \u003ccode\u003eser_json_timedelta\u003c/code\u003e to all datetime types in serialization inference by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13892\"\u003e#13892\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eEncode JSON Schema defaults with a consistent configuration by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13893\"\u003e#13893\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ePropagate \u003ccode\u003einit\u003c/code\u003e and \u003ccode\u003ekw_only=False\u003c/code\u003e from \u003ccode\u003eField()\u003c/code\u003e to stdlib dataclass fields by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13898\"\u003e#13898\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRespect propagated extra config in the JSON Schema of stdlib dataclasses by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13899\"\u003e#13899\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eHandle OS errors during \u003ccode\u003eZoneInfo\u003c/code\u003e validation by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13912\"\u003e#13912\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eHandle exceptions during \u003ccode\u003eDecimal\u003c/code\u003e validation by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13940\"\u003e#13940\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRebuild incomplete types during serialization inference by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13922\"\u003e#13922\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eReject large exponents in \u003ccode\u003eFraction\u003c/code\u003e validation by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13944\"\u003e#13944\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAvoid validating URL prefix multiple times in multi host URLs by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13945\"\u003e#13945\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pydantic/pydantic/compare/v2.13.0...v2.14.0\"\u003ehttps://github.com/pydantic/pydantic/compare/v2.13.0...v2.14.0\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003ev2.14.0b2 2026-09-09\u003c/h2\u003e\n\u003ch3\u003eWhat's Changed\u003c/h3\u003e\n\u003cp\u003eThis pre-release adds full support for Python 3.15 specific features, such as support for \u003ca href=\"https://docs.python.org/3.15/library/stdtypes.html#frozendict\"\u003e\u003ccode\u003efrozendict\u003c/code\u003e\u003c/a\u003e, making use of \u003ca href=\"https://docs.python.org/3.15/library/typing.html#typing.TypeForm\"\u003e\u003ccode\u003eTypeForm\u003c/code\u003e\u003c/a\u003e and stabilizing the \u003ca href=\"https://pydantic.dev/docs/validation/latest/concepts/types/#missing-sentinel\"\u003e\u003ccode\u003eMISSING\u003c/code\u003e sentinel\u003c/a\u003e type.\u003c/p\u003e\n\u003ch4\u003eNew Features\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eAllow any \u003ccode\u003eCoreSchema\u003c/code\u003e to be used as serialization by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13680\"\u003e#13680\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdd support for \u003ca href=\"https://docs.python.org/3.15/library/stdtypes.html#frozendict\"\u003e\u003ccode\u003efrozendict\u003c/code\u003e\u003c/a\u003e type by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13634\"\u003e#13634\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pydantic/pydantic/blob/main/HISTORY.md\"\u003epydantic's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev2.14.0 (2026-10-08)\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/pydantic/pydantic/releases/tag/v2.14.0\"\u003eGitHub release\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eWhat's Changed\u003c/h3\u003e\n\u003cp\u003eThe highlights of the v2.14 release are available in the \u003ca href=\"https://pydantic.dev/articles/pydantic-v2-14-release\"\u003eblog post\u003c/a\u003e.\nSeveral minor changes (considered non-breaking changes according to our \u003ca href=\"https://pydantic.dev/docs/validation/2.14/get-started/version-policy/#pydantic-v2\"\u003eversioning policy\u003c/a\u003e)\nare also included in this release. Make sure to look into them before upgrading.\u003c/p\u003e\n\u003cp\u003eThis release drops support for Python 3.9 and adds support for Python 3.15.\u003c/p\u003e\n\u003ch4\u003eNew Features\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eAdd support for \u003ccode\u003emultiple_of\u003c/code\u003e constraint in \u003ccode\u003efraction\u003c/code\u003e and \u003ccode\u003etimedelta\u003c/code\u003e core schemas by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13873\"\u003e#13873\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003e__namespace__\u003c/code\u003e parameter to \u003ccode\u003ecreate_model()\u003c/code\u003e by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13895\"\u003e#13895\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4\u003eChanges\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eAdd an \u003ccode\u003eordered-dict\u003c/code\u003e core schema by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13796\"\u003e#13796\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdd a \u003ccode\u003ecounter\u003c/code\u003e core schema by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13824\"\u003e#13824\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eDo not mutate \u003ccode\u003emodel_config\u003c/code\u003e attribute by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13825\"\u003e#13825\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eReject newlines in \u003ccode\u003eNameEmail\u003c/code\u003e validation by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13897\"\u003e#13897\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4\u003eFixes\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eCall enum constructors in both validation modes by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13792\"\u003e#13792\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix documentation examples not raising and remove unused \u003ccode\u003estring_sub_type\u003c/code\u003e unused error code by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13821\"\u003e#13821\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eCatch \u003ccode\u003eOverflowError\u003c/code\u003e during \u003ccode\u003eByteSize\u003c/code\u003e validation by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13850\"\u003e#13850\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRequire \u003ccode\u003emultiple_of\u003c/code\u003e constraints to be positive by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13862\"\u003e#13862\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAlways pop field name and model type stacks during schema generation by \u003ca href=\"https://github.com/saquibjawedbit\"\u003e\u003ccode\u003e@​saquibjawedbit\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13859\"\u003e#13859\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eHandle \u003ccode\u003eTypeError\u003c/code\u003e gracefully during docstring extraction by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13874\"\u003e#13874\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix config propagation of stdlib dataclasses and \u003ccode\u003eTypedDict\u003c/code\u003es in JSON Schema by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13891\"\u003e#13891\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eDon't apply \u003ccode\u003eser_json_timedelta\u003c/code\u003e to all datetime types in serialization inference by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13892\"\u003e#13892\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eEncode JSON Schema defaults with a consistent configuration by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13893\"\u003e#13893\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ePropagate \u003ccode\u003einit\u003c/code\u003e and \u003ccode\u003ekw_only=False\u003c/code\u003e from \u003ccode\u003eField()\u003c/code\u003e to stdlib dataclass fields by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13898\"\u003e#13898\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRespect propagated extra config in the JSON Schema of stdlib dataclasses by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13899\"\u003e#13899\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eHandle OS errors during \u003ccode\u003eZoneInfo\u003c/code\u003e validation by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13912\"\u003e#13912\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eHandle exceptions during \u003ccode\u003eDecimal\u003c/code\u003e validation by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13940\"\u003e#13940\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRebuild incomplete types during serialization inference by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13922\"\u003e#13922\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eReject large exponents in \u003ccode\u003eFraction\u003c/code\u003e validation by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13944\"\u003e#13944\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAvoid validating URL prefix multiple times in multi host URLs by \u003ca href=\"https://github.com/Viicos\"\u003e\u003ccode\u003e@​Viicos\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13945\"\u003e#13945\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eNew Contributors\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/saquibjawedbit\"\u003e\u003ccode\u003e@​saquibjawedbit\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/pydantic/pydantic/pull/13859\"\u003e#13859\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev2.14.0b2 (2026-09-09)\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/pydantic/pydantic/releases/tag/v2.14.0b2\"\u003eGitHub release\u003c/a\u003e\u003c/p\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pydantic/pydantic/commit/fcdefa7198c4fc94a22eecf1a5b7926e20b9fc8a\"\u003e\u003ccode\u003efcdefa7\u003c/code\u003e\u003c/a\u003e Correct v2.14.0 release date (\u003ca href=\"https://redirect.github.com/pydantic/pydantic/issues/13952\"\u003e#13952\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pydantic/pydantic/commit/c821eaccf9873357477a1e7d2d4d12dd4e161c8a\"\u003e\u003ccode\u003ec821eac\u003c/code\u003e\u003c/a\u003e Revert \u0026quot;Respect config in \u003ccode\u003eTypeAdapter.json_schemas()\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/pydantic/pydantic/issues/13890\"\u003e#13890\u003c/a\u003e)\u0026quot; (\u003ca href=\"https://redirect.github.com/pydantic/pydantic/issues/13951\"\u003e#13951\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pydantic/pydantic/commit/a656b75d58a80f5033f376f7af17092606bbfde2\"\u003e\u003ccode\u003ea656b75\u003c/code\u003e\u003c/a\u003e Prepare release v2.14.0 (\u003ca href=\"https://redirect.github.com/pydantic/pydantic/issues/13948\"\u003e#13948\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pydantic/pydantic/commit/b4028f9d87e34750e53be0ba011d70f3c0fcc94e\"\u003e\u003ccode\u003eb4028f9\u003c/code\u003e\u003c/a\u003e Avoid validating URL prefix multiple times in multi host URLs (\u003ca href=\"https://redirect.github.com/pydantic/pydantic/issues/13945\"\u003e#13945\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pydantic/pydantic/commit/69ed168e9ad465eef4c8d81efb152a93b604daf5\"\u003e\u003ccode\u003e69ed168\u003c/code\u003e\u003c/a\u003e Reject large exponents in \u003ccode\u003eFraction\u003c/code\u003e validation (\u003ca href=\"https://redirect.github.com/pydantic/pydantic/issues/13944\"\u003e#13944\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pydantic/pydantic/commit/895c0c285c5cb4c0c7c7a4619a80941c12f2c75f\"\u003e\u003ccode\u003e895c0c2\u003c/code\u003e\u003c/a\u003e Fix datetime parsing in custom validator examples (\u003ca href=\"https://redirect.github.com/pydantic/pydantic/issues/13931\"\u003e#13931\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pydantic/pydantic/commit/d2cbaaab74ba4a26bb66f604199ec9793aab6177\"\u003e\u003ccode\u003ed2cbaaa\u003c/code\u003e\u003c/a\u003e Bump virtualenv from 20.36.1 to 21.7.13 (\u003ca href=\"https://redirect.github.com/pydantic/pydantic/issues/13943\"\u003e#13943\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pydantic/pydantic/commit/3fbc25ab2bd4f370f478102652f20aea1f5de0b0\"\u003e\u003ccode\u003e3fbc25a\u003c/code\u003e\u003c/a\u003e Bump \u003ccode\u003epydantic-core\u003c/code\u003e dependencies (\u003ca href=\"https://redirect.github.com/pydantic/pydantic/issues/13942\"\u003e#13942\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pydantic/pydantic/commit/027b5c714791d5f6e86faea4110ef26f4776648c\"\u003e\u003ccode\u003e027b5c7\u003c/code\u003e\u003c/a\u003e Rebuild incomplete types during serialization inference (\u003ca href=\"https://redirect.github.com/pydantic/pydantic/issues/13922\"\u003e#13922\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pydantic/pydantic/commit/2706d1f6cdd0ca5b941fd5170ecf0254f933e1f6\"\u003e\u003ccode\u003e2706d1f\u003c/code\u003e\u003c/a\u003e Handle exceptions during \u003ccode\u003eDecimal\u003c/code\u003e validation (\u003ca href=\"https://redirect.github.com/pydantic/pydantic/issues/13940\"\u003e#13940\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/pydantic/pydantic/compare/v2.13.5...v2.14.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `ruff` from 0.16.10 to 0.17.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/astral-sh/ruff/releases\"\u003eruff's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e0.17.0\u003c/h2\u003e\n\u003ch2\u003eRelease Notes\u003c/h2\u003e\n\u003cp\u003eReleased on 2026-10-09.\u003c/p\u003e\n\u003cp\u003eThe executables in our macOS and Windows release archives and \u003ccode\u003eruff\u003c/code\u003e wheels are now code-signed. macOS executables are signed with an Apple Developer ID certificate and notarized by Apple. Windows executables have timestamped Authenticode signatures from Azure Artifact Signing. This enables verification of the release publisher and binary integrity, supports publisher-based allowlisting, and should reduce security warnings and antivirus false positives.\u003c/p\u003e\n\u003ch3\u003eBreaking changes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate the default and latest Python versions for 3.15 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28792\"\u003e#28792\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eRuff now defaults to Python 3.11 instead of 3.10 when no Python version is configured through \u003ca href=\"https://docs.astral.sh/ruff/settings/#target-version\"\u003e\u003ccode\u003etarget-version\u003c/code\u003e\u003c/a\u003e or \u003ca href=\"https://docs.astral.sh/ruff/configuration/#inferring-the-python-version\"\u003e\u003ccode\u003erequires-python\u003c/code\u003e\u003c/a\u003e. When checking for syntax errors without a configured Python version, Ruff now defaults to Python 3.15 instead of 3.14.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate the default rule set (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28786\"\u003e#28786\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eSeveral of the \u003ccode\u003eflake8-datetimez\u003c/code\u003e rules (\u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-without-tzinfo/\"\u003e\u003ccode\u003eDTZ001\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-now-without-tzinfo/\"\u003e\u003ccode\u003eDTZ005\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-fromtimestamp/\"\u003e\u003ccode\u003eDTZ006\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-strptime-without-zone/\"\u003e\u003ccode\u003eDTZ007\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://docs.astral.sh/ruff/rules/call-date-today/\"\u003e\u003ccode\u003eDTZ011\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://docs.astral.sh/ruff/rules/call-date-fromtimestamp/\"\u003e\u003ccode\u003eDTZ012\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://docs.astral.sh/ruff/rules/datetime-min-max/\"\u003e\u003ccode\u003eDTZ901\u003c/code\u003e\u003c/a\u003e) are no longer enabled by default, while \u003ca href=\"https://docs.astral.sh/ruff/rules/undefined-local-with-nested-import-star-usage/\"\u003e\u003ccode\u003eundefined-local-with-nested-import-star-usage\u003c/code\u003e\u003c/a\u003e (\u003ccode\u003eF406\u003c/code\u003e), which corresponds to a syntax error, is now enabled by default.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate Rust crate quick-junit to 0.8.0 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/27295\"\u003e#27295\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eJUnit output now uses a \u003ccode\u003eskipped\u003c/code\u003e attribute instead of \u003ccode\u003edisabled\u003c/code\u003e on \u003ccode\u003e\u0026lt;testsuite\u0026gt;\u003c/code\u003e elements and includes a \u003ccode\u003eskipped\u003c/code\u003e attribute on the root \u003ccode\u003e\u0026lt;testsuites\u0026gt;\u003c/code\u003e element.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e[\u003ccode\u003eflake8-import-conventions\u003c/code\u003e] Add \u003ccode\u003edatetime as dt\u003c/code\u003e as a conventional alias (\u003ccode\u003eICN001\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28790\"\u003e#28790\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSupport Unicode dummy variable names (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28722\"\u003e#28722\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eThe default \u003ca href=\"https://docs.astral.sh/ruff/settings/#lint_dummy-variable-rgx\"\u003e\u003ccode\u003elint.dummy-variable-rgx\u003c/code\u003e\u003c/a\u003e now recognizes underscore-prefixed Unicode names, such as \u003ccode\u003e_次\u003c/code\u003e, as dummy variables.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate to Unicode 17 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/21229\"\u003e#21229\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28784\"\u003e#28784\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eRuff now uses Unicode 17 data for identifier normalization and named character escapes (\u003ccode\u003e\u0026quot;\\N{...}\u0026quot;\u003c/code\u003e).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAlways show unsafe and display-only fixes in the CLI (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/27810\"\u003e#27810\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eThe default \u003ccode\u003efull\u003c/code\u003e output format now shows unsafe fixes and suggestions requiring manual review, regardless of the \u003ca href=\"https://docs.astral.sh/ruff/settings/#unsafe-fixes\"\u003e\u003ccode\u003eunsafe-fixes\u003c/code\u003e\u003c/a\u003e setting. Actually applying unsafe fixes still requires explicit opt-in.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRemove the Python dependency from conda-forge builds (\u003ca href=\"https://redirect.github.com/conda-forge/ruff-feedstock/pull/361\"\u003econda-forge/ruff-feedstock#361\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eThe conda-forge build no longer depends on Python, now supports linux-riscv64, win-arm64, and linux-ppc64le platforms, and now includes shell completions. However, no longer depending on Python means that \u003ccode\u003epython -m ruff\u003c/code\u003e and \u003ccode\u003eimport ruff\u003c/code\u003e will no longer work. Use \u003ccode\u003eruff\u003c/code\u003e directly from \u003ccode\u003ePATH\u003c/code\u003e instead. PyPI installations and those from the standalone installer are unaffected.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRemove support for ruff-lsp (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28750\"\u003e#28750\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eSupport for \u003ccode\u003eruff-lsp\u003c/code\u003e, the legacy Python language server \u003ca href=\"https://github.com/astral-sh/ruff/releases/tag/0.9.5\"\u003edeprecated in Ruff v0.9.5\u003c/a\u003e, has been removed. The Ruff VS Code extension now always uses the native language server; \u003ccode\u003eruff.nativeServer\u003c/code\u003e is deprecated and ignored. See the \u003ca href=\"https://docs.astral.sh/ruff/editors/migration/\"\u003emigration guide\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eStabilization\u003c/h3\u003e\n\u003cp\u003eThe following rules have been stabilized and are no longer in preview:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://docs.astral.sh/ruff/rules/lazy-import-mismatch\"\u003e\u003ccode\u003elazy-import-mismatch\u003c/code\u003e\u003c/a\u003e (\u003ccode\u003eTID254\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://docs.astral.sh/ruff/rules/lazy-import-immediately-resolved\"\u003e\u003ccode\u003elazy-import-immediately-resolved\u003c/code\u003e\u003c/a\u003e (\u003ccode\u003eTID255\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://docs.astral.sh/ruff/rules/os-path-commonprefix\"\u003e\u003ccode\u003eos-path-commonprefix\u003c/code\u003e\u003c/a\u003e (\u003ccode\u003eRUF071\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md\"\u003eruff's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e0.17.0\u003c/h2\u003e\n\u003cp\u003eReleased on 2026-10-09.\u003c/p\u003e\n\u003cp\u003eThe executables in our macOS and Windows release archives and \u003ccode\u003eruff\u003c/code\u003e wheels are now code-signed.\nmacOS executables are signed with an Apple Developer ID certificate and notarized by Apple. Windows\nexecutables have timestamped Authenticode signatures from Azure Artifact Signing. This enables\nverification of the release publisher and binary integrity, supports publisher-based allowlisting,\nand should reduce security warnings and antivirus false positives.\u003c/p\u003e\n\u003ch3\u003eBreaking changes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate the default and latest Python versions for 3.15 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28792\"\u003e#28792\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eRuff now defaults to Python 3.11 instead of 3.10 when no Python version is configured through\n\u003ca href=\"https://docs.astral.sh/ruff/settings/#target-version\"\u003e\u003ccode\u003etarget-version\u003c/code\u003e\u003c/a\u003e or\n\u003ca href=\"https://docs.astral.sh/ruff/configuration/#inferring-the-python-version\"\u003e\u003ccode\u003erequires-python\u003c/code\u003e\u003c/a\u003e. When\nchecking for syntax errors without a configured Python version, Ruff now defaults to Python 3.15\ninstead of 3.14.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate the default rule set (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28786\"\u003e#28786\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eSeveral of the \u003ccode\u003eflake8-datetimez\u003c/code\u003e rules\n(\u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-without-tzinfo/\"\u003e\u003ccode\u003eDTZ001\u003c/code\u003e\u003c/a\u003e,\n\u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-now-without-tzinfo/\"\u003e\u003ccode\u003eDTZ005\u003c/code\u003e\u003c/a\u003e,\n\u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-fromtimestamp/\"\u003e\u003ccode\u003eDTZ006\u003c/code\u003e\u003c/a\u003e,\n\u003ca href=\"https://docs.astral.sh/ruff/rules/call-datetime-strptime-without-zone/\"\u003e\u003ccode\u003eDTZ007\u003c/code\u003e\u003c/a\u003e,\n\u003ca href=\"https://docs.astral.sh/ruff/rules/call-date-today/\"\u003e\u003ccode\u003eDTZ011\u003c/code\u003e\u003c/a\u003e,\n\u003ca href=\"https://docs.astral.sh/ruff/rules/call-date-fromtimestamp/\"\u003e\u003ccode\u003eDTZ012\u003c/code\u003e\u003c/a\u003e, and\n\u003ca href=\"https://docs.astral.sh/ruff/rules/datetime-min-max/\"\u003e\u003ccode\u003eDTZ901\u003c/code\u003e\u003c/a\u003e) are no longer enabled by default,\nwhile \u003ca href=\"https://docs.astral.sh/ruff/rules/undefined-local-with-nested-import-star-usage/\"\u003e\u003ccode\u003eundefined-local-with-nested-import-star-usage\u003c/code\u003e\u003c/a\u003e\n(\u003ccode\u003eF406\u003c/code\u003e), which corresponds to a syntax error, is now enabled by default.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate Rust crate quick-junit to 0.8.0 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/27295\"\u003e#27295\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eJUnit output now uses a \u003ccode\u003eskipped\u003c/code\u003e attribute instead of \u003ccode\u003edisabled\u003c/code\u003e on \u003ccode\u003e\u0026lt;testsuite\u0026gt;\u003c/code\u003e elements and\nincludes a \u003ccode\u003eskipped\u003c/code\u003e attribute on the root \u003ccode\u003e\u0026lt;testsuites\u0026gt;\u003c/code\u003e element.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e[\u003ccode\u003eflake8-import-conventions\u003c/code\u003e] Add \u003ccode\u003edatetime as dt\u003c/code\u003e as a conventional alias (\u003ccode\u003eICN001\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28790\"\u003e#28790\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSupport Unicode dummy variable names (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28722\"\u003e#28722\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eThe default \u003ca href=\"https://docs.astral.sh/ruff/settings/#lint_dummy-variable-rgx\"\u003e\u003ccode\u003elint.dummy-variable-rgx\u003c/code\u003e\u003c/a\u003e\nnow recognizes underscore-prefixed Unicode names, such as \u003ccode\u003e_次\u003c/code\u003e, as dummy variables.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate to Unicode 17 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/21229\"\u003e#21229\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28784\"\u003e#28784\u003c/a\u003e)\u003c/p\u003e\n\u003cp\u003eRuff now uses Unicode 17 data for identifier normalization and named character escapes (\u003ccode\u003e\u0026quot;\\N{...}\u0026quot;\u003c/code\u003e).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAlways show unsafe and display-only fixes in the CLI (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/27810\"\u003e#27810\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/5b27c1ccfaa230fb195855f5cf3404a21e3379cd\"\u003e\u003ccode\u003e5b27c1c\u003c/code\u003e\u003c/a\u003e Bump version to 0.17.0 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/29259\"\u003e#29259\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/8f362bf4cb5dbad095ac416602496705d41fc843\"\u003e\u003ccode\u003e8f362bf\u003c/code\u003e\u003c/a\u003e Integrate vendored Unicode names into Ruff\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/88a50d695c1142294bb4c780fad47d3306173885\"\u003e\u003ccode\u003e88a50d6\u003c/code\u003e\u003c/a\u003e Revert upstream Unicode loose matching\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/276832aa91f2086a6ec880884fcdd987991cddf2\"\u003e\u003ccode\u003e276832a\u003c/code\u003e\u003c/a\u003e Revert upstream Unicode alias normalization\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/26911caa2800758779965510d2f222b438abbb38\"\u003e\u003ccode\u003e26911ca\u003c/code\u003e\u003c/a\u003e Vendor unicode_names2 from upstream\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/27e3797508d1a7ad69e4900d51e38d78785aaf73\"\u003e\u003ccode\u003e27e3797\u003c/code\u003e\u003c/a\u003e [\u003ccode\u003eruff\u003c/code\u003e] Stabilize \u003ccode\u003eos-path-commonprefix\u003c/code\u003e (\u003ccode\u003eRUF071\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/28764\"\u003e#28764\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/bbb52c1267cf39aba67e54c2b5800878d23073a9\"\u003e\u003ccode\u003ebbb52c1\u003c/code\u003e\u003c/a\u003e [\u003ccode\u003eflake8-tidy-imports\u003c/code\u003e] Stabilize \u003ccode\u003elazy-import-immediately-resolved\u003c/code\u003e (`TID255...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/5aa9cbd3a49d32b24ac21fa7797ca87a330792a2\"\u003e\u003ccode\u003e5aa9cbd\u003c/code\u003e\u003c/a\u003e [\u003ccode\u003eflake8-tidy-imports\u003c/code\u003e] Stabilize \u003ccode\u003elazy-import-mismatch\u003c/code\u003e (\u003ccode\u003eTID254\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/28760\"\u003e#28760\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/dba1bc893aedfeea2064c4e8e764135f0d44dc3f\"\u003e\u003ccode\u003edba1bc8\u003c/code\u003e\u003c/a\u003e [\u003ccode\u003eflake8-import-conventions\u003c/code\u003e] Add \u003ccode\u003edatetime as dt\u003c/code\u003e as a conventional alias (`...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/ef23c9c39eb3029bab0139c3ea7ae6d95c4131e0\"\u003e\u003ccode\u003eef23c9c\u003c/code\u003e\u003c/a\u003e Update default and latest Python versions for 3.15 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/28792\"\u003e#28792\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/astral-sh/ruff/compare/0.16.10...0.17.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `filelock` from 4.0.9 to 4.1.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/py-filelock/releases\"\u003efilelock's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e4.1.0\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eci: download coverage during tool setup by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/776\"\u003etox-dev/filelock#776\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(api): validate timeout and poll_interval bounds by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/781\"\u003etox-dev/filelock#781\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(read-write): accept inf and reject nan timeouts by \u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/779\"\u003etox-dev/filelock#779\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft-rw): ignore non-ASCII generation names by \u003ca href=\"https://github.com/dxbjavid\"\u003e\u003ccode\u003e@​dxbjavid\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/778\"\u003etox-dev/filelock#778\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): check start token in is_lock_held_by_us by \u003ca href=\"https://github.com/lprnmns\"\u003e\u003ccode\u003e@​lprnmns\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/774\"\u003etox-dev/filelock#774\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): clean up marker when rollback close fails by \u003ca href=\"https://github.com/harbinresearcher\"\u003e\u003ccode\u003e@​harbinresearcher\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/775\"\u003etox-dev/filelock#775\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(read-write): clamp waits to threading.TIMEOUT_MAX by \u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/780\"\u003etox-dev/filelock#780\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): treat truncated markers as malformed by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/782\"\u003etox-dev/filelock#782\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(acquire): keep every acquire wait within the timeout by \u003ca href=\"https://github.com/feiiiiii5\"\u003e\u003ccode\u003e@​feiiiiii5\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/777\"\u003etox-dev/filelock#777\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e📝 docs: fix hanging example and platform claims by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/783\"\u003etox-dev/filelock#783\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(unix): keep peer marker on ENOSYS fallback by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/785\"\u003etox-dev/filelock#785\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(async): clear the task hold after a canceled release by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/789\"\u003etox-dev/filelock#789\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e✨ feat(api): export lease types and has_fcntl by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/790\"\u003etox-dev/filelock#790\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(strict): age private records by the filesystem clock by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/792\"\u003etox-dev/filelock#792\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(async): surface executor shutdown as an error by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/793\"\u003etox-dev/filelock#793\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): expire leases on the contender's clock by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/796\"\u003etox-dev/filelock#796\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft-rw): stop an acquire that close() overtook by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/798\"\u003etox-dev/filelock#798\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(strict): record claims before linking them by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/787\"\u003etox-dev/filelock#787\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): restore a live marker a stale break moved aside by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/786\"\u003etox-dev/filelock#786\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(api): chain errors on 3.10 without exceptiongroup by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/788\"\u003etox-dev/filelock#788\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): release a dropped SoftFileLease by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/791\"\u003etox-dev/filelock#791\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(read-write): keep probe fds until the last connection closes by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/794\"\u003etox-dev/filelock#794\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e📦 build(sdist): ship docs and update SECURITY.md by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/812\"\u003etox-dev/filelock#812\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft-rw): survive a removed generation log by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/795\"\u003etox-dev/filelock#795\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): tell PID namespaces apart in the marker host by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/797\"\u003etox-dev/filelock#797\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(async): release from the finalizer and keep I/O off the loop by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/800\"\u003etox-dev/filelock#800\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(strict): name what blocks the lock path by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/804\"\u003etox-dev/filelock#804\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(read-write): reject WAL databases and link beside the db by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/805\"\u003etox-dev/filelock#805\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(read-write): track read depth per thread by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/806\"\u003etox-dev/filelock#806\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft): honour mode and tighten marker grammar by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/807\"\u003etox-dev/filelock#807\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🧪 test: drop timing races from two runner-load flakes by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/809\"\u003etox-dev/filelock#809\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(descriptor): reject poll intervals above TIMEOUT_MAX by \u003ca href=\"https://github.com/sricharanreddycheruku\"\u003e\u003ccode\u003e@​sricharanreddycheruku\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/802\"\u003etox-dev/filelock#802\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(api): validate lock options up front by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/803\"\u003etox-dev/filelock#803\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(soft-rw): publish the head through gen/HEAD by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/799\"\u003etox-dev/filelock#799\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(api): release thread holds, guard reentry by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/810\"\u003etox-dev/filelock#810\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🧪 test(lease): give the age-out test a real-time margin by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/814\"\u003etox-dev/filelock#814\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e📝 docs: point canonical and og:url at versioned pages by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/813\"\u003etox-dev/filelock#813\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(read-write): refuse a database moved mid-acquire by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/808\"\u003etox-dev/filelock#808\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix: close regressions since 4.0.12 by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/815\"\u003etox-dev/filelock#815\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/779\"\u003etox-dev/filelock#779\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/harbinresearcher\"\u003e\u003ccode\u003e@​harbinresearcher\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/775\"\u003etox-dev/filelock#775\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/sricharanreddycheruku\"\u003e\u003ccode\u003e@​sricharanreddycheruku\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/802\"\u003etox-dev/filelock#802\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/tox-dev/filelock/compare/4.0.12...4.1.0\"\u003ehttps://github.com/tox-dev/filelock/compare/4.0.12...4.1.0\u003c/a\u003e\u003c/p\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/filelock/blob/main/docs/changelog.rst\"\u003efilelock's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e###########\nChangelog\n###########\u003c/p\u003e\n\u003cp\u003e.. towncrier-draft-entries:: Unreleased\u003c/p\u003e\n\u003cp\u003e.. towncrier release notes start\u003c/p\u003e\n\u003chr /\u003e\n\u003cp\u003e4.1.1 (2026-10-11)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eBound the shared-lock contention test by worker progress so slow CI machines can finish the workload. :pr:\u003ccode\u003e819\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eAvoid the macOS \u003ccode\u003e/dev/fd\u003c/code\u003e lookup implicated in a kernel panic by opening SQLite through a validated hard link.\nThe database directory must be writable and support hard links; alias creation failure raises \u003ccode\u003eOSError\u003c/code\u003e. :pr:\u003ccode\u003e820\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eIgnore non-ASCII PID or start-time fields and out-of-range PIDs in \u003ccode\u003eReadWriteLock\u003c/code\u003e hard-link directory names so forged\nowners cannot abort acquisition. :pr:\u003ccode\u003e821\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eUse Python 3.15 for development and automation. :pr:\u003ccode\u003e816\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.1.0 (2026-10-09)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eImport :data:\u003ccode\u003e~filelock.OwnerMode\u003c/code\u003e, :data:\u003ccode\u003e~filelock.CompromiseReason\u003c/code\u003e and :data:\u003ccode\u003e~filelock.has_fcntl\u003c/code\u003e from\n\u003ccode\u003efilelock\u003c/code\u003e. :pr:\u003ccode\u003e790\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:class:\u003ccode\u003e~filelock.AcquireReturnProxy\u003c/code\u003e is generic in the lock type, so \u003ccode\u003ewith lock.acquire() as held:\u003c/code\u003e types \u003ccode\u003eheld\u003c/code\u003e as\nthe lock's own class. :pr:\u003ccode\u003e803\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eA :class:\u003ccode\u003e~filelock.Timeout\u003c/code\u003e from a soft lock names a holder on another host or in another PID namespace, which no\ncontender ever reclaims. :pr:\u003ccode\u003e815\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:attr:\u003ccode\u003e~filelock.SoftFileLock.is_lock_held_by_us\u003c/code\u003e and :attr:\u003ccode\u003e~filelock.MarkerSoftFileLock.is_lock_held_by_us\u003c/code\u003e return\n\u003ccode\u003eFalse\u003c/code\u003e for a marker an earlier process with the same PID left behind. :pr:\u003ccode\u003e774\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:class:\u003ccode\u003e~filelock.SoftFileLock\u003c/code\u003e removes its marker when writing it fails and closing the descriptor fails too, so the\nlock path no longer stays blocked. :pr:\u003ccode\u003e775\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:meth:\u003ccode\u003e~filelock.BaseFileLock.acquire\u003c/code\u003e and :meth:\u003ccode\u003e~filelock.BaseAsyncFileLock.acquire\u003c/code\u003e no longer wait past \u003ccode\u003etimeout\u003c/code\u003e\nwhen \u003ccode\u003epoll_interval\u003c/code\u003e is longer than the time left. :pr:\u003ccode\u003e777\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:class:\u003ccode\u003e~filelock.SoftReadWriteLock\u003c/code\u003e ignores a generation-log entry whose name is not 20 ASCII digits, which used to\nstop its heartbeat thread or delete real generations. :pr:\u003ccode\u003e778\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:class:\u003ccode\u003e~filelock.ReadWriteLock\u003c/code\u003e, :class:\u003ccode\u003e~filelock.SoftReadWriteLock\u003c/code\u003e and their async wrappers treat a\n:data:\u003ccode\u003emath.inf\u003c/code\u003e timeout like \u003ccode\u003e-1\u003c/code\u003e and raise :class:\u003ccode\u003eValueError\u003c/code\u003e for a blocking \u003ccode\u003enan\u003c/code\u003e one. :pr:\u003ccode\u003e779\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:class:\u003ccode\u003e~filelock.ReadWriteLock\u003c/code\u003e and :class:\u003ccode\u003e~filelock.SoftReadWriteLock\u003c/code\u003e accept a timeout above\n:data:\u003ccode\u003ethreading.TIMEOUT_MAX\u003c/code\u003e instead of raising :class:\u003ccode\u003eOverflowError\u003c/code\u003e. :pr:\u003ccode\u003e780\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:meth:\u003ccode\u003e~filelock.BaseFileLock.acquire\u003c/code\u003e raises :class:\u003ccode\u003eValueError\u003c/code\u003e for a blocking \u003ccode\u003enan\u003c/code\u003e timeout or a \u003ccode\u003epoll_interval\u003c/code\u003e\nabove :data:\u003ccode\u003ethreading.TIMEOUT_MAX\u003c/code\u003e, and treats a :data:\u003ccode\u003emath.inf\u003c/code\u003e timeout like \u003ccode\u003e-1\u003c/code\u003e. :pr:\u003ccode\u003e781\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:class:\u003ccode\u003e~filelock.SoftFileLock\u003c/code\u003e and :class:\u003ccode\u003e~filelock.MarkerSoftFileLock\u003c/code\u003e treat a marker cut before its final newline as\nmalformed, so a crash-truncated record self-heals and a read mid-write no longer breaks a live lock. :pr:\u003ccode\u003e782\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:class:\u003ccode\u003e~filelock.UnixFileLock\u003c/code\u003e no longer deletes another process's live marker when it falls back to a soft lock on\n\u003ccode\u003eENOSYS\u003c/code\u003e, and on macOS a lock path ending in a separator raises :class:\u003ccode\u003eFileNotFoundError\u003c/code\u003e instead of retrying. :pr:\u003ccode\u003e785\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:class:\u003ccode\u003e~filelock.SoftFileLock\u003c/code\u003e and :class:\u003ccode\u003e~filelock.SoftFileLease\u003c/code\u003e put back a live successor's marker that a racing\nstale break moved aside, so a third contender no longer acquires beside the successor. :pr:\u003ccode\u003e786\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:class:\u003ccode\u003e~filelock.StrictSoftFileLock\u003c/code\u003e removes every claim a failed acquire published, counts an \u003ccode\u003eEEXIST\u003c/code\u003e link that\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/6c0ecc28f898f08cd0438cd489c3eaabad79a4b7\"\u003e\u003ccode\u003e6c0ecc2\u003c/code\u003e\u003c/a\u003e Release 4.1.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/df06bbd640765ad3f1ed4a096cbe29e64b5592bb\"\u003e\u003ccode\u003edf06bbd\u003c/code\u003e\u003c/a\u003e 🐛 fix: close regressions since 4.0.12 (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/815\"\u003e#815\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/071204515d211b560d203cb68105ec06789eab46\"\u003e\u003ccode\u003e0712045\u003c/code\u003e\u003c/a\u003e 🐛 fix(read-write): refuse a database moved mid-acquire (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/808\"\u003e#808\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/73fefc1e907457dd9bc9793eeba52f183d7f9c40\"\u003e\u003ccode\u003e73fefc1\u003c/code\u003e\u003c/a\u003e 📝 docs: point canonical and og:url at versioned pages (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/813\"\u003e#813\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/181b36b90e6c994a3e5b36ce3f66ad4dc2d5358e\"\u003e\u003ccode\u003e181b36b\u003c/code\u003e\u003c/a\u003e 🧪 test(lease): give the age-out test a real-time margin (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/814\"\u003e#814\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/2c19af4fa6a3c4c41b95ec87424cc4fb6dc40411\"\u003e\u003ccode\u003e2c19af4\u003c/code\u003e\u003c/a\u003e 🐛 fix(api): release thread holds, guard reentry (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/810\"\u003e#810\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/367b1118fd4b366d33b1e57a6d55f8993962531c\"\u003e\u003ccode\u003e367b111\u003c/code\u003e\u003c/a\u003e 🐛 fix(soft-rw): publish the head through gen/HEAD (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/799\"\u003e#799\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/61582c5f8ee60e6ba9fd9546fb2c11f9d727f72f\"\u003e\u003ccode\u003e61582c5\u003c/code\u003e\u003c/a\u003e 🐛 fix(api): validate lock options up front (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/803\"\u003e#803\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/20c4b5ae1332f3ded65c44e42479f014669fc06b\"\u003e\u003ccode\u003e20c4b5a\u003c/code\u003e\u003c/a\u003e 🐛 fix(descriptor): reject poll intervals above TIMEOUT_MAX (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/802\"\u003e#802\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/cf092c7992d8348932835b563a3fcaf35cb88b5f\"\u003e\u003ccode\u003ecf092c7\u003c/code\u003e\u003c/a\u003e 🧪 test: drop timing races from two runner-load flakes (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/809\"\u003e#809\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/tox-dev/py-filelock/compare/4.0.9...4.1.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `iniconfig` from 2.3.0 to 2.3.1\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pytest-dev/iniconfig/releases\"\u003einiconfig's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003eVersion 2.3.1\u003c/h2\u003e\n\u003ch2\u003eFixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eParsing values with many continuation lines is now linear instead of quadratic in time (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/78\"\u003e#78\u003c/a\u003e, regarding \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/77\"\u003e#77\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003eA leading UTF-8 BOM is now stripped when reading INI files. Files saved by Windows editors used to fail with \u003ccode\u003eParseError\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/76\"\u003e#76\u003c/a\u003e, thanks \u003ca href=\"https://github.com/Pitchfork-and-Torch\"\u003e\u003ccode\u003e@​Pitchfork-and-Torch\u003c/code\u003e\u003c/a\u003e).\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eInternal\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003einiconfig._parse.ParsedLine.value\u003c/code\u003e is now a list of lines. This is private API.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eDocs\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eThe README example now uses \u003ccode\u003eIniConfig.parse()\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/79\"\u003e#79\u003c/a\u003e, thanks \u003ca href=\"https://github.com/MbappeWU\"\u003e\u003ccode\u003e@​MbappeWU\u003c/code\u003e\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003eFixed the issue tracker link (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/74\"\u003e#74\u003c/a\u003e, thanks \u003ca href=\"https://github.com/stefan6419846\"\u003e\u003ccode\u003e@​stefan6419846\u003c/code\u003e\u003c/a\u003e).\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull diff:\u003c/strong\u003e \u003ca href=\"https://github.com/pytest-dev/iniconfig/compare/v2.3.0...v2.3.1\"\u003ehttps://github.com/pytest-dev/iniconfig/compare/v2.3.0...v2.3.1\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e[pre-commit.ci] pre-commit autoupdate by \u003ca href=\"https://github.com/pre-commit-ci\"\u003e\u003ccode\u003e@​pre-commit-ci\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/71\"\u003epytest-dev/iniconfig#71\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[pre-commit.ci] pre-commit autoupdate by \u003ca href=\"https://github.com/pre-commit-ci\"\u003e\u003ccode\u003e@​pre-commit-ci\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/72\"\u003epytest-dev/iniconfig#72\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix link to issues by \u003ca href=\"https://github.com/stefan6419846\"\u003e\u003ccode\u003e@​stefan6419846\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/74\"\u003epytest-dev/iniconfig#74\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eparse_lines: keep values as list of lines, join once by \u003ca href=\"https://github.com/RonnyPfannschmidt\"\u003e\u003ccode\u003e@​RonnyPfannschmidt\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/78\"\u003epytest-dev/iniconfig#78\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[pre-commit.ci] pre-commit autoupdate by \u003ca href=\"https://github.com/pre-commit-ci\"\u003e\u003ccode\u003e@​pre-commit-ci\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/73\"\u003epytest-dev/iniconfig#73\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003etest: expect sorted \u003cstrong\u003eall\u003c/strong\u003e after ruff autofix by \u003ca href=\"https://github.com/RonnyPfannschmidt\"\u003e\u003ccode\u003e@​RonnyPfannschmidt\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/80\"\u003epytest-dev/iniconfig#80\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003edocs: use parse API in the README example by \u003ca href=\"https://github.com/MbappeWU\"\u003e\u003ccode\u003e@​MbappeWU\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/79\"\u003epytest-dev/iniconfig#79\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eStrip leading UTF-8 BOM when reading INI files by \u003ca href=\"https://github.com/Pitchfork-and-Torch\"\u003e\u003ccode\u003e@​Pitchfork-and-Torch\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/76\"\u003epytest-dev/iniconfig#76\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echangelog: add BOM stripping (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/76\"\u003e#76\u003c/a\u003e) to 2.3.1 by \u003ca href=\"https://github.com/RonnyPfannschmidt\"\u003e\u003ccode\u003e@​RonnyPfannschmidt\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/81\"\u003epytest-dev/iniconfig#81\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/stefan6419846\"\u003e\u003ccode\u003e@​stefan6419846\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/74\"\u003epytest-dev/iniconfig#74\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/MbappeWU\"\u003e\u003ccode\u003e@​MbappeWU\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/79\"\u003epytest-dev/iniconfig#79\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/Pitchfork-and-Torch\"\u003e\u003ccode\u003e@​Pitchfork-and-Torch\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/pull/76\"\u003epytest-dev/iniconfig#76\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pytest-dev/iniconfig/compare/v2.3.0...v2.3.1\"\u003ehttps://github.com/pytest-dev/iniconfig/compare/v2.3.0...v2.3.1\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pytest-dev/iniconfig/blob/main/CHANGELOG\"\u003einiconfig's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e2.3.1\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003efix quadratic parse time for values with many continuation lines (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/78\"\u003e#78\u003c/a\u003e, regarding \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/77\"\u003e#77\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003estrip a leading UTF-8 BOM when reading INI files, which previously raised \u003ccode\u003eParseError\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/76\"\u003e#76\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003einternal: \u003ccode\u003einiconfig._parse.ParsedLine.value\u003c/code\u003e is now a list of lines\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/316fbfaf2752d89326e1e75b45cd070f5b5ace9a\"\u003e\u003ccode\u003e316fbfa\u003c/code\u003e\u003c/a\u003e changelog: add BOM stripping (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/76\"\u003e#76\u003c/a\u003e) to 2.3.1 (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/81\"\u003e#81\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/d2dcb7289291e7e7019c183659814d42f7264b2d\"\u003e\u003ccode\u003ed2dcb72\u003c/code\u003e\u003c/a\u003e Strip leading UTF-8 BOM when reading INI files (\u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/76\"\u003e#76\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/40d8c03a1553953350d787e45f1cb768e2c14e6a\"\u003e\u003ccode\u003e40d8c03\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/79\"\u003e#79\u003c/a\u003e from MbappeWU/codex/docs-parse-inline-comments\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/48359c3a7c2c8648a134ea8469e802b5aa8d5030\"\u003e\u003ccode\u003e48359c3\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/80\"\u003e#80\u003c/a\u003e from pytest-dev/claude/fix-iniconfig-test-eukh2n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/b153213a011fa92f4370c83cef614cf73c987f57\"\u003e\u003ccode\u003eb153213\u003c/code\u003e\u003c/a\u003e test: expect sorted \u003cstrong\u003eall\u003c/strong\u003e after ruff RUF022 autofix\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/4fddfabc850afee28178931c62535ba1c2b30c72\"\u003e\u003ccode\u003e4fddfab\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/73\"\u003e#73\u003c/a\u003e from pytest-dev/pre-commit-ci-update-config\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/15852c2d1f9178ff960bf6c39a6f0f1495f1009e\"\u003e\u003ccode\u003e15852c2\u003c/code\u003e\u003c/a\u003e [pre-commit.ci] auto fixes from pre-commit.com hooks\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/2e68639c3f41ea5b693f89807172cf304c94fb9e\"\u003e\u003ccode\u003e2e68639\u003c/code\u003e\u003c/a\u003e [pre-commit.ci] pre-commit autoupdate\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/23c9e088a909f16d0d8dc03b5090c66964c428b0\"\u003e\u003ccode\u003e23c9e08\u003c/code\u003e\u003c/a\u003e docs: use parse API in the README example\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytest-dev/iniconfig/commit/e038536fbee6b5e76b180fce6694fd54661ced12\"\u003e\u003ccode\u003ee038536\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/pytest-dev/iniconfig/issues/78\"\u003e#78\u003c/a\u003e from RonnyPfannschmidt/claude/dazzling-einstein-h8zq7m\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/pytest-dev/iniconfig/compare/v2.3.0...v2.3.1\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `markupsafe` from 3.0.3 to 3.0.4\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pallets/markupsafe/releases\"\u003emarkupsafe's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e3.0.4\u003c/h2\u003e\n\u003cp\u003eThis is the MarkupSafe 3.0.4 fix release, which fixes bugs but does not otherwise change behavior and should not result in breaking changes compared to the latest feature release.\u003c/p\u003e\n\u003cp\u003ePyPI: \u003ca href=\"https://pypi.org/project/MarkupSafe/3.0.4/\"\u003ehttps://pypi.org/project/MarkupSafe/3.0.4/\u003c/a\u003e\nChanges: \u003ca href=\"https://markupsafe.palletsprojects.com/page/changes/#version-3-0-4\"\u003ehttps://markupsafe.palletsprojects.com/page/changes/#version-3-0-4\u003c/a\u003e\nMilestone: \u003ca href=\"https://github.com/pallets/markupsafe/milestone/17?closed=1\"\u003ehttps://github.com/pallets/markupsafe/milestone/17?closed=1\u003c/a\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eBuild Python 3.15, armv7l, ppc64le, Android, and iOS wheels.\u003c/li\u003e\n\u003cli\u003eImprove performance of \u003ccode\u003estriptags\u003c/code\u003e. \u003ca href=\"https://redirect.github.com/pallets/markupsafe/issues/521\"\u003e#521\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pallets/markupsafe/blob/main/CHANGES.rst\"\u003emarkupsafe's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003eVersion 3.0.4\u003c/h2\u003e\n\u003cp\u003eReleased 2026-10-02\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eBuild Python 3.15, armv7l, ppc64le, Android, and iOS wheels.\u003c/li\u003e\n\u003cli\u003eImprove performance of \u003ccode\u003estriptags\u003c/code\u003e. :issue:\u003ccode\u003e521\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pallets/markupsafe/commit/ece26078ec168ebac69f02877238e68d4b376c91\"\u003e\u003ccode\u003eece2607\u003c/code\u003e\u003c/a\u003e release version 3.0.4\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pallets/markupsafe/commit/620bc809d748de3a7848bdf7e27b1c2a2903aaf5\"\u003e\u003ccode\u003e620bc80\u003c/code\u003e\u003c/a\u003e split archs\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pallets/markupsafe/commit/73c3be1596906daf3e642e51852af5a019c5e1ea\"\u003e\u003ccode\u003e73c3be1\u003c/code\u003e\u003c/a\u003e fix wheel builds (\u003ca href=\"https://redirect.github.com/pallets/markupsafe/issues/536\"\u003e#536\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pallets/markupsafe/commit/d8ae19e6e45b5512472b74fe5c60b7f6aa18d70f\"\u003e\u003ccode\u003ed8ae19e\u003c/code\u003e\u003c/a\u003e fix wheel builds\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pallets/markupsafe/commit/ff1eaff921f92db57327752bbc37472d37fb9b21\"\u003e\u003ccode\u003eff1eaff\u003c/code\u003e\u003c/a\u003e Build Android and iOS wheels (\u003ca href=\"https://redirect.github.com/pallets/markupsafe/issues/516\"\u003e#516\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pallets/markupsafe/commit/87e64f9628c574bf91898f8642a21356cccaa58c\"\u003e\u003ccode\u003e87e64f9\u003c/code\u003e\u003c/a\u003e build Android and iOS wheels\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pallets/markupsafe/commit/bc33c55cb3078ba9f9b0950babb32f8d842f1267\"\u003e\u003ccode\u003ebc33c55\u003c/code\u003e\u003c/a\u003e Build ppc64le wheels (\u003ca href=\"https://redirect.github.com/pallets/markupsafe/issues/518\"\u003e#518\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pallets/markupsafe/commit/0ddd6eac9b20df52c75fae9181c0e73e195fa8d1\"\u003e\u003ccode\u003e0ddd6ea\u003c/code\u003e\u003c/a\u003e build ppc64le wheels\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pallets/markupsafe/commit/3e0775809b92150b10d1671ce1821ea6eb56be0c\"\u003e\u003ccode\u003e3e07758\u003c/code\u003e\u003c/a\u003e Build armv7l wheels (\u003ca href=\"https://redirect.github.com/pallets/markupsafe/issues/514\"\u003e#514\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pallets/markupsafe/commit/39b9aae5f1e70edc33f380b47d1bef0e281746b5\"\u003e\u003ccode\u003e39b9aae\u003c/code\u003e\u003c/a\u003e build armv7l wheels\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/pallets/markupsafe/compare/3.0.3...3.0.4\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `platformdirs` from 4.12.2 to 4.12.4\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/platformdirs/releases\"\u003eplatformdirs's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e4.12.4\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eci: download coverage during tool setup by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/609\"\u003etox-dev/platformdirs#609\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(api): keep root's site dir readable in place_*_file by \u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/610\"\u003etox-dev/platformdirs#610\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix: fall back from unreachable runtime directory with ensure_exists by \u003ca href=\"https://github.com/harbinresearcher\"\u003e\u003ccode\u003e@​harbinresearcher\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/611\"\u003etox-dev/platformdirs#611\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/harbinresearcher\"\u003e\u003ccode\u003e@​harbinresearcher\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/611\"\u003etox-dev/platformdirs#611\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/tox-dev/platformdirs/compare/4.12.3...4.12.4\"\u003ehttps://github.com/tox-dev/platformdirs/compare/4.12.3...4.12.4\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e4.12.3\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003ePlace root config and data files in the first site directory by \u003ca href=\"https://github.com/PDGGK\"\u003e\u003ccode\u003e@​PDGGK\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/607\"\u003etox-dev/platformdirs#607\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/PDGGK\"\u003e\u003ccode\u003e@​PDGGK\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/607\"\u003etox-dev/platformdirs#607\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/tox-dev/platformdirs/compare/4.12.2...4.12.3\"\u003ehttps://github.com/tox-dev/platformdirs/compare/4.12.2...4.12.3\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/platformdirs/blob/main/docs/changelog.rst\"\u003eplatformdirs's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e###########\nChangelog\n###########\u003c/p\u003e\n\u003cp\u003e.. towncrier-draft-entries:: Unreleased\u003c/p\u003e\n\u003cp\u003e.. towncrier release notes start\u003c/p\u003e\n\u003chr /\u003e\n\u003cp\u003e4.13.0 (2026-10-10)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eDetect Homebrew Python for the :class:\u003ccode\u003e~platformdirs.macos.MacOS\u003c/code\u003e site directories under :option:\u003ccode\u003epython:-S\u003c/code\u003e, which\nleaves :data:\u003ccode\u003esys.base_prefix\u003c/code\u003e on the \u003ccode\u003eCellar\u003c/code\u003e keg, and for the \u003ccode\u003epython-freethreading\u003c/code\u003e formula - by\n:user:\u003ccode\u003esricharanreddycheruku\u003c/code\u003e. :pr:\u003ccode\u003e612\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eUse Python 3.15 for development and automation. :pr:\u003ccode\u003e613\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.12.4 (2026-10-07)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eKeep site directories readable by other users when root calls\n:meth:\u003ccode\u003e~platformdirs.api.PlatformDirsABC.place_config_file\u003c/code\u003e or another \u003ccode\u003eplace_*_file\u003c/code\u003e method with\n:attr:\u003ccode\u003e~platformdirs.api.PlatformDirsABC.use_site_for_root\u003c/code\u003e - by :user:\u003ccode\u003edarrenhuai\u003c/code\u003e. :pr:\u003ccode\u003e610\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eMake :func:\u003ccode\u003e~platformdirs.user_runtime_dir\u003c/code\u003e warn and fall back from an unreachable \u003ccode\u003eXDG_RUNTIME_DIR\u003c/code\u003e under\n:attr:\u003ccode\u003e~platformdirs.api.PlatformDirsABC.ensure_exists\u003c/code\u003e instead of raising. :pr:\u003ccode\u003e611\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.12.3 (2026-10-03)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003ePlace files from \u003ccode\u003eplace_config_file\u003c/code\u003e and \u003ccode\u003eplace_data_file\u003c/code\u003e in the first site directory for root on Unix with\n\u003ccode\u003euse_site_for_root=True\u003c/code\u003e and \u003ccode\u003emultipath=True\u003c/code\u003e, where \u003ccode\u003efind_config_file\u003c/code\u003e and \u003ccode\u003efind_data_file\u003c/code\u003e look for them.\n:pr:\u003ccode\u003e607\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.12.2 (2026-09-29)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eKeep \u003ccode\u003eos.pathsep\u003c/code\u003e in \u003ccode\u003esite_applications_path\u003c/code\u003e under \u003ccode\u003emultipath=True\u003c/code\u003e on platforms with one applications\ndirectory. :pr:\u003ccode\u003e604\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.12.1 (2026-09-28)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eAvoid \u003ccode\u003ePytestAssertRewriteWarning\u003c/code\u003e when importing \u003ccode\u003eplatformdirs\u003c/code\u003e before invoking pytest. :pr:\u003ccode\u003e601\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.12.0 (2026-09-26)\u003c/p\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/19338a4fdfc0cdd6b5342ec137efd9e5613d67d2\"\u003e\u003ccode\u003e19338a4\u003c/code\u003e\u003c/a\u003e Release 4.12.4\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/f2a4fa944f3637c8e7aa1fe8e95c9adfefe8ed2c\"\u003e\u003ccode\u003ef2a4fa9\u003c/code\u003e\u003c/a\u003e fix: fall back from unreachable runtime directory with ensure_exists (\u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/issues/611\"\u003e#611\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/16429e2135fa70b314ef69fa7da4d5e746eb75c9\"\u003e\u003ccode\u003e16429e2\u003c/code\u003e\u003c/a\u003e 🐛 fix(api): keep root's site dir readable in place_*_file (\u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/issues/610\"\u003e#610\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/b9735d3c9f4a0b5ca4dafc15b53541fe3973f453\"\u003e\u003ccode\u003eb9735d3\u003c/code\u003e\u003c/a\u003e ci: download coverage during tool setup (\u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/issues/609\"\u003e#609\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/344f2497bce1fba7838ef112f2bd91e9d5f23b58\"\u003e\u003ccode\u003e344f249\u003c/code\u003e\u003c/a\u003e [pre-commit.ci] pre-commit autoupdate (\u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/issues/608\"\u003e#608\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/960ff632eb575deb6f0d5bf49519d5a2ee2098b6\"\u003e\u003ccode\u003e960ff63\u003c/code\u003e\u003c/a\u003e Release 4.12.3\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/8047ad5bf0e5fd3db9c8ce9f250f73c3d961fe19\"\u003e\u003ccode\u003e8047ad5\u003c/code\u003e\u003c/a\u003e Place root config and data files in the first site directory (\u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/issues/607\"\u003e#607\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/tox-dev/platformdirs/compare/4.12.2...4.12.4\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `pycparser` from 3.0 to 3.11\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/eliben/pycparser/releases\"\u003epycparser's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003erelease_v3.11\u003c/h2\u003e\n\u003cp\u003eEnhanced C11 support\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/eliben/pycparser/compare/release_v3.01...release_v3.11\"\u003ehttps://github.com/eliben/pycparser/compare/release_v3.01...release_v3.11\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003erelease_v3.01\u003c/h2\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eDrop an unneeded direct build depndency on wheel by \u003ca href=\"https://github.com/hroncok\"\u003e\u003ccode\u003e@​hroncok\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/eliben/pycparser/pull/597\"\u003eeliben/pycparser#597\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix: handle integer suffix in #line directive without crashing by \u003ca href=\"https://github.com/SAY-5\"\u003e\u003ccode\u003e@​SAY-5\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/eliben/pycparser/pull/601\"\u003eeliben/pycparser#601\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUpdate default branch to main by \u003ca href=\"https://github.com/myd7349\"\u003e\u003ccode\u003e@​myd7349\u003c/code\u003e\u003c/a\u003e in \u003ca ...\n\n_Description has been truncated_","html_url":"https://github.com/ay-mich/nopii/pull/87","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/ay-mich%2Fnopii/issues/87","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/87/packages"}},{"old_version":"21.14.2","new_version":"21.14.6","update_type":"patch","path":null,"pr_created_at":"2026-10-12T12:33:14.000Z","version_change":"21.14.2 → 21.14.6","issue":{"uuid":"5813791750","node_id":"PR_kwDOTNo6ls8AAAABH9u_JQ","number":71,"state":"closed","title":"Bump the patch-and-minor group across 1 directory with 11 updates","user":"dependabot[bot]","labels":[],"assignees":[],"locked":false,"comments_count":2,"pull_request":true,"closed_at":"2026-10-17T19:58:44.000Z","author_association":null,"state_reason":null,"created_at":"2026-10-12T12:33:14.000Z","updated_at":"2026-10-17T19:58:46.000Z","time_to_close":458730,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"Bump","group_name":"patch-and-minor","update_count":11,"packages":[{"name":"django","old_version":"5.2.17","new_version":"5.2.18","repository_url":"https://github.com/django/django"},{"name":"djangorestframework","old_version":"3.18.1","new_version":"3.18.3","repository_url":"https://github.com/encode/django-rest-framework"},{"name":"ruff","old_version":"0.16.8","new_version":"0.16.10","repository_url":"https://github.com/astral-sh/ruff"},{"name":"sentry-sdk","old_version":"2.69.2","new_version":"2.71.0","repository_url":"https://github.com/getsentry/sentry-python"},{"name":"django-otp","old_version":"1.7.3","new_version":"1.7.4","repository_url":"https://github.com/django-otp/django-otp"},{"name":"cryptography","old_version":"50.0.1","new_version":"50.0.2","repository_url":"https://github.com/pyca/cryptography"},{"name":"pypdf","old_version":"6.19.0","new_version":"6.20.0","repository_url":"https://github.com/py-pdf/pypdf"},{"name":"black","old_version":"26.5.1","new_version":"26.10.0","repository_url":"https://github.com/psf/black"},{"name":"virtualenv","old_version":"21.14.2","new_version":"21.14.6","repository_url":"https://github.com/pypa/virtualenv"},{"name":"mypy","old_version":"2.3.1","new_version":"2.4.0","repository_url":"https://github.com/python/mypy"},{"name":"django-stubs","old_version":"6.1.1","new_version":"6.1.2","repository_url":"https://github.com/typeddjango/django-stubs"}],"path":null,"ecosystem":"pip"},"body":"Bumps the patch-and-minor group with 11 updates in the /jasmin-core/django-core directory:\n\n| Package | From | To |\n| --- | --- | --- |\n| [django](https://github.com/django/django) | `5.2.17` | `5.2.18` |\n| [djangorestframework](https://github.com/encode/django-rest-framework) | `3.18.1` | `3.18.3` |\n| [ruff](https://github.com/astral-sh/ruff) | `0.16.8` | `0.16.10` |\n| [sentry-sdk](https://github.com/getsentry/sentry-python) | `2.69.2` | `2.71.0` |\n| [django-otp](https://github.com/django-otp/django-otp) | `1.7.3` | `1.7.4` |\n| [cryptography](https://github.com/pyca/cryptography) | `50.0.1` | `50.0.2` |\n| [pypdf](https://github.com/py-pdf/pypdf) | `6.19.0` | `6.20.0` |\n| [black](https://github.com/psf/black) | `26.5.1` | `26.10.0` |\n| [virtualenv](https://github.com/pypa/virtualenv) | `21.14.2` | `21.14.6` |\n| [mypy](https://github.com/python/mypy) | `2.3.1` | `2.4.0` |\n| [django-stubs](https://github.com/typeddjango/django-stubs) | `6.1.1` | `6.1.2` |\n\n\nUpdates `django` from 5.2.17 to 5.2.18\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/django/django/commit/3ae618c745df5b87053ad91588c72a4c8e646853\"\u003e\u003ccode\u003e3ae618c\u003c/code\u003e\u003c/a\u003e [5.2.x] Bumped version for 5.2.18 release.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/django/django/commit/1eafa1a80f1363283f89208ba4499ed54e35f085\"\u003e\u003ccode\u003e1eafa1a\u003c/code\u003e\u003c/a\u003e [5.2.x] Refs CVE-2026-15830 -- Fixed WKB geometry collection limit bypasses.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/django/django/commit/ff27883ca055aa9ab23015b50674a5b10dfe5a41\"\u003e\u003ccode\u003eff27883\u003c/code\u003e\u003c/a\u003e [5.2.x] Fixed CVE-2026-87975 -- Prevented forging actions in model formsets w...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/django/django/commit/dd0558d1617619e0d66163675ef02135d0f54e5f\"\u003e\u003ccode\u003edd0558d\u003c/code\u003e\u003c/a\u003e [5.2.x] Fixed CVE-2026-87890 -- Blocked bytes in spatial lookups.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/django/django/commit/6ecd66e09a383be004a78a3a738ea9727ff07b0e\"\u003e\u003ccode\u003e6ecd66e\u003c/code\u003e\u003c/a\u003e [5.2.x] Fixed CVE-2026-84429 -- Simplified parse_header_parameters by leverag...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/django/django/commit/02a69e3791e3df23d45ea4ea7e7fc489f0eef2be\"\u003e\u003ccode\u003e02a69e3\u003c/code\u003e\u003c/a\u003e [5.2.x] Fixed CVE-2026-77050 -- Prevented memory exhaustion in get_supported_...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/django/django/commit/f59aef2ee9b5c988fd4179d8f2835030bd76297c\"\u003e\u003ccode\u003ef59aef2\u003c/code\u003e\u003c/a\u003e [5.2.x] Confirmed release date for 5.2.18.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/django/django/commit/a3d71038401b9340f550f2fdf1caaad66465ba88\"\u003e\u003ccode\u003ea3d7103\u003c/code\u003e\u003c/a\u003e [5.2.x] Fixed \u003ca href=\"https://redirect.github.com/django/django/issues/37289\"\u003e#37289\u003c/a\u003e -- Avoided deleting network rasters.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/django/django/commit/4ea267661b260ea0d0c87e9dcb99d70037c6f2fc\"\u003e\u003ccode\u003e4ea2676\u003c/code\u003e\u003c/a\u003e [5.2.x] Refs \u003ca href=\"https://redirect.github.com/django/django/issues/36862\"\u003e#36862\u003c/a\u003e -- Clarified security note for RemoteUserMiddleware.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/django/django/commit/7def346c005a0b8eaffd6de9d68d621b398323dd\"\u003e\u003ccode\u003e7def346\u003c/code\u003e\u003c/a\u003e [5.2.x] Refs \u003ca href=\"https://redirect.github.com/django/django/issues/36862\"\u003e#36862\u003c/a\u003e -- Reiterated security note on both variants of RemoteUse...\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/django/django/compare/5.2.17...5.2.18\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `djangorestframework` from 3.18.1 to 3.18.3\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/encode/django-rest-framework/releases\"\u003edjangorestframework's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e3.18.3\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003ch3\u003eBug fixes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eRestore \u003ccode\u003eorder_by_precedence\u003c/code\u003e from 3.18.1 to fix broken return value by \u003ca href=\"https://github.com/browniebroke\"\u003e\u003ccode\u003e@​browniebroke\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/encode/django-rest-framework/pull/10066\"\u003eencode/django-rest-framework#10066\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/encode/django-rest-framework/compare/3.18.2...3.18.3\"\u003ehttps://github.com/encode/django-rest-framework/compare/3.18.2...3.18.3\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e3.18.2\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003ch3\u003eSecurity\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eGHSA-33wh-fxxf-88vv: Harden content negotiation against large \u003ccode\u003eAccept\u003c/code\u003e headers by \u003ca href=\"https://github.com/jisung-02\"\u003e\u003ccode\u003e@​jisung-02\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://github.com/encode/django-rest-framework/commit/148ab65\"\u003e148ab65\u003c/a\u003e. Thanks \u003ca href=\"https://github.com/jisung-02\"\u003e\u003ccode\u003e@​jisung-02\u003c/code\u003e\u003c/a\u003e for the report.\u003c/li\u003e\n\u003cli\u003eGHSA-3547-9m27-7rxg: Refuse non-text encoding charsets by \u003ca href=\"https://github.com/syrull\"\u003e\u003ccode\u003e@​syrull\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://github.com/encode/django-rest-framework/commit/3c26345\"\u003e3c26345\u003c/a\u003e. Thanks \u003ca href=\"https://github.com/syrull\"\u003e\u003ccode\u003e@​syrull\u003c/code\u003e\u003c/a\u003e and \u003ca href=\"https://github.com/jisung-02\"\u003e\u003ccode\u003e@​jisung-02\u003c/code\u003e\u003c/a\u003e who both reported the problem.\u003c/li\u003e\n\u003cli\u003eGHSA-xw6w-gcfp-cf8m: Make \u003ccode\u003eTokenProxy\u003c/code\u003e deletion actually delete the token by \u003ca href=\"https://github.com/syrull\"\u003e\u003ccode\u003e@​syrull\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://github.com/encode/django-rest-framework/commit/af3fabf\"\u003eaf3fabf\u003c/a\u003e. Thanks \u003ca href=\"https://github.com/syrull\"\u003e\u003ccode\u003e@​syrull\u003c/code\u003e\u003c/a\u003e for the report.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eFeatures\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAdd support for Python 3.15 by \u003ca href=\"https://github.com/p-r-a-v-i-n\"\u003e\u003ccode\u003e@​p-r-a-v-i-n\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/encode/django-rest-framework/pull/10025\"\u003eencode/django-rest-framework#10025\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eBug fixes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eFix \u003ccode\u003eblank=True\u003c/code\u003e fields in unique constraints being treated as required by \u003ca href=\"https://github.com/MehrazRumman\"\u003e\u003ccode\u003e@​MehrazRumman\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/encode/django-rest-framework/pull/10039\"\u003eencode/django-rest-framework#10039\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix \u003ccode\u003eUniqueConstraint\u003c/code\u003e validation with conditional fields by \u003ca href=\"https://github.com/majidkhazaei\"\u003e\u003ccode\u003e@​majidkhazaei\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/encode/django-rest-framework/pull/10021\"\u003eencode/django-rest-framework#10021\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/olitreadwell\"\u003e\u003ccode\u003e@​olitreadwell\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/encode/django-rest-framework/pull/10038\"\u003eencode/django-rest-framework#10038\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/majidkhazaei\"\u003e\u003ccode\u003e@​majidkhazaei\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/encode/django-rest-framework/pull/10021\"\u003eencode/django-rest-framework#10021\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/rblotsky\"\u003e\u003ccode\u003e@​rblotsky\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/encode/django-rest-framework/pull/10045\"\u003eencode/django-rest-framework#10045\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mrchatam\"\u003e\u003ccode\u003e@​mrchatam\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/encode/django-rest-framework/pull/10042\"\u003eencode/django-rest-framework#10042\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/haimingZZ\"\u003e\u003ccode\u003e@​haimingZZ\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/encode/django-rest-framework/pull/10052\"\u003eencode/django-rest-framework#10052\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jisung-02\"\u003e\u003ccode\u003e@​jisung-02\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://github.com/encode/django-rest-framework/commit/148ab65\"\u003e148ab65\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/syrull\"\u003e\u003ccode\u003e@​syrull\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://github.com/encode/django-rest-framework/commit/3c26345\"\u003e3c26345\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/encode/django-rest-framework/compare/3.18.1...3.18.2\"\u003ehttps://github.com/encode/django-rest-framework/compare/3.18.1...3.18.2\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/encode/django-rest-framework/commit/1af5b55758ac514c492ed3a5fc1a6fb244cdb257\"\u003e\u003ccode\u003e1af5b55\u003c/code\u003e\u003c/a\u003e Prepare release 3.18.3 (\u003ca href=\"https://redirect.github.com/encode/django-rest-framework/issues/10067\"\u003e#10067\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/encode/django-rest-framework/commit/e140de794d11149a09c04a3ee7cc4815946148f8\"\u003e\u003ccode\u003ee140de7\u003c/code\u003e\u003c/a\u003e Restore order_by_precedence from 3.18.1 (\u003ca href=\"https://redirect.github.com/encode/django-rest-framework/issues/10066\"\u003e#10066\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/encode/django-rest-framework/commit/7195f7e4c51527054623ea55fc4491786acc91f8\"\u003e\u003ccode\u003e7195f7e\u003c/code\u003e\u003c/a\u003e Bump the pre-commit group across 1 directory with 2 updates (\u003ca href=\"https://redirect.github.com/encode/django-rest-framework/issues/10063\"\u003e#10063\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/encode/django-rest-framework/commit/69694a17d0b6ac14b4ea4d77916b73c68dc5a3e8\"\u003e\u003ccode\u003e69694a1\u003c/code\u003e\u003c/a\u003e Prepare release 3.18.2 (\u003ca href=\"https://redirect.github.com/encode/django-rest-framework/issues/10065\"\u003e#10065\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/encode/django-rest-framework/commit/af3fabfd517307fbc5d500fba1ab8f6e25f220b0\"\u003e\u003ccode\u003eaf3fabf\u003c/code\u003e\u003c/a\u003e Merge commit from fork\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/encode/django-rest-framework/commit/3c2634599b26a9f789b03045118dbc276117611a\"\u003e\u003ccode\u003e3c26345\u003c/code\u003e\u003c/a\u003e Merge commit from fork\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/encode/django-rest-framework/commit/148ab6523922d5a0c110f76615935e5220b63029\"\u003e\u003ccode\u003e148ab65\u003c/code\u003e\u003c/a\u003e Merge commit from fork\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/encode/django-rest-framework/commit/3d18900ead34e9491f94597617a12fdd47161e97\"\u003e\u003ccode\u003e3d18900\u003c/code\u003e\u003c/a\u003e Fix CI that broke due to latest Django bugfix (\u003ca href=\"https://redirect.github.com/encode/django-rest-framework/issues/10064\"\u003e#10064\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/encode/django-rest-framework/commit/d6c45646edc9c6644ea159f7f786da598bc1ab66\"\u003e\u003ccode\u003ed6c4564\u003c/code\u003e\u003c/a\u003e Improve teardown of test modifying INSTALLED_APPS (\u003ca href=\"https://redirect.github.com/encode/django-rest-framework/issues/10056\"\u003e#10056\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/encode/django-rest-framework/commit/41764f1f8cfb6d40b77b58c97cf9aeaab57c6b5c\"\u003e\u003ccode\u003e41764f1\u003c/code\u003e\u003c/a\u003e Bump codecov/codecov-action in the github-actions group (\u003ca href=\"https://redirect.github.com/encode/django-rest-framework/issues/10058\"\u003e#10058\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/encode/django-rest-framework/compare/3.18.1...3.18.3\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `ruff` from 0.16.8 to 0.16.10\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/astral-sh/ruff/releases\"\u003eruff's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e0.16.10\u003c/h2\u003e\n\u003ch2\u003eRelease Notes\u003c/h2\u003e\n\u003cp\u003eReleased on 2026-10-01.\u003c/p\u003e\n\u003ch3\u003ePreview features\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAdd a migration guide for categories (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28087\"\u003e#28087\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e[\u003ccode\u003epyupgrade\u003c/code\u003e] Add rule for context manager iterator annotations (\u003ccode\u003eUP052\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29000\"\u003e#29000\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003ePerformance\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eReduce memory used by diagnostics (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28951\"\u003e#28951\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eServer\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAvoid running \u003ccode\u003euv format\u003c/code\u003e in untrusted workspaces (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28873\"\u003e#28873\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eDocumentation\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eFix links to moved changelog sections and renamed mdtests (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28941\"\u003e#28941\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd Python 3.15 as a supported version (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28907\"\u003e#28907\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd ty as a type checker example (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28906\"\u003e#28906\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eOther changes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eUpdate Rust toolchain to 1.99 and MSRV to 1.97 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29047\"\u003e#29047\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eContributors\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/ntBre\"\u003e\u003ccode\u003e@​ntBre\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/spaceone\"\u003e\u003ccode\u003e@​spaceone\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HardMax71\"\u003e\u003ccode\u003e@​HardMax71\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/charliermarsh\"\u003e\u003ccode\u003e@​charliermarsh\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eInstall ruff 0.16.10\u003c/h2\u003e\n\u003ch3\u003eInstall prebuilt binaries via shell script\u003c/h3\u003e\n\u003cpre lang=\"sh\"\u003e\u003ccode\u003ecurl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/ruff/releases/download/0.16.10/ruff-installer.sh | sh\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch3\u003eInstall prebuilt binaries via powershell script\u003c/h3\u003e\n\u003cpre lang=\"sh\"\u003e\u003ccode\u003epowershell -ExecutionPolicy Bypass -c \u0026quot;irm https://releases.astral.sh/github/ruff/releases/download/0.16.10/ruff-installer.ps1 | iex\u0026quot;\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2\u003eDownload ruff 0.16.10\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/astral-sh/ruff/blob/0.16.10/CHANGELOG.md\"\u003eruff's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e0.16.10\u003c/h2\u003e\n\u003cp\u003eReleased on 2026-10-01.\u003c/p\u003e\n\u003ch3\u003ePreview features\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAdd a migration guide for categories (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28087\"\u003e#28087\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e[\u003ccode\u003epyupgrade\u003c/code\u003e] Add rule for context manager iterator annotations (\u003ccode\u003eUP052\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29000\"\u003e#29000\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003ePerformance\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eReduce memory used by diagnostics (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28951\"\u003e#28951\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eServer\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAvoid running \u003ccode\u003euv format\u003c/code\u003e in untrusted workspaces (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28873\"\u003e#28873\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eDocumentation\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eFix links to moved changelog sections and renamed mdtests (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28941\"\u003e#28941\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd Python 3.15 as a supported version (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28907\"\u003e#28907\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd ty as a type checker example (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28906\"\u003e#28906\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eOther changes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eUpdate Rust toolchain to 1.99 and MSRV to 1.97 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29047\"\u003e#29047\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eContributors\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/ntBre\"\u003e\u003ccode\u003e@​ntBre\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/spaceone\"\u003e\u003ccode\u003e@​spaceone\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HardMax71\"\u003e\u003ccode\u003e@​HardMax71\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/charliermarsh\"\u003e\u003ccode\u003e@​charliermarsh\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e0.16.9\u003c/h2\u003e\n\u003cp\u003eReleased on 2026-09-24.\u003c/p\u003e\n\u003ch3\u003ePreview features\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e[\u003ccode\u003eruff\u003c/code\u003e] Avoid false positives for overloaded division (\u003ccode\u003eRUF069\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28309\"\u003e#28309\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eBug fixes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e[\u003ccode\u003eflake8-bugbear\u003c/code\u003e] Avoid false positives for calls with keyword arguments (\u003ccode\u003eB009\u003c/code\u003e, \u003ccode\u003eB010\u003c/code\u003e, \u003ccode\u003eB043\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28776\"\u003e#28776\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e[\u003ccode\u003eflake8-tidy-imports\u003c/code\u003e] Allow lazy imports to be used in deferred annotations (\u003ccode\u003eTID255\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28767\"\u003e#28767\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eRule changes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eUpdate LibCST-based fixes for Python 3.15 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28616\"\u003e#28616\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/3265ed1f944c98bb4c04d632fbefb1257cdb583d\"\u003e\u003ccode\u003e3265ed1\u003c/code\u003e\u003c/a\u003e Bump version to 0.16.10 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/29055\"\u003e#29055\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/e786964450e75d904c288a1e59ae2b196d0b9c47\"\u003e\u003ccode\u003ee786964\u003c/code\u003e\u003c/a\u003e Authorize shared PR security-review workflow to publish findings (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/29052\"\u003e#29052\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/a81291e9db2f67039d159e7490b988e6c25c7a0f\"\u003e\u003ccode\u003ea81291e\u003c/code\u003e\u003c/a\u003e [ty] Defer uv workspace discovery until after project configuration (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/28525\"\u003e#28525\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/b6a74d26cbe6b45b3eb2992041714461bd4ceb5b\"\u003e\u003ccode\u003eb6a74d2\u003c/code\u003e\u003c/a\u003e [ty] Refresh uv project metadata when uv files change (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/28529\"\u003e#28529\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/41d30df6fdbe215390b3acb46e8cd4017f65580d\"\u003e\u003ccode\u003e41d30df\u003c/code\u003e\u003c/a\u003e Update Rust toolchain to 1.99 and MSRV to 1.97 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/29047\"\u003e#29047\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/317e0a3ab75878eba6e3b78c57f73d47108e2a8e\"\u003e\u003ccode\u003e317e0a3\u003c/code\u003e\u003c/a\u003e [ty] Bound nested callable signature display (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/29049\"\u003e#29049\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/8546752d9d5dac8da78c8abba380600cfe573874\"\u003e\u003ccode\u003e8546752\u003c/code\u003e\u003c/a\u003e [ty] Fix member lookup on union-bounded type variables (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/29018\"\u003e#29018\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/56180bcf800d6e45fb1c4b4113e97501b8f128c5\"\u003e\u003ccode\u003e56180bc\u003c/code\u003e\u003c/a\u003e [ty] Specialize instance members once (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/29043\"\u003e#29043\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/aa9a1ff88aa83b3f01360ef5b3cb04b2be187206\"\u003e\u003ccode\u003eaa9a1ff\u003c/code\u003e\u003c/a\u003e [ty] Avoid stale I/O diagnostics when closing deleted files (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/28988\"\u003e#28988\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/2d253467b5153f82d26c51d49eb8d4156f1768bf\"\u003e\u003ccode\u003e2d25346\u003c/code\u003e\u003c/a\u003e [ty] Improve \u003ccode\u003eunresolved-import\u003c/code\u003e documentation (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/29039\"\u003e#29039\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/astral-sh/ruff/compare/0.16.8...0.16.10\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `sentry-sdk` from 2.69.2 to 2.71.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/getsentry/sentry-python/releases\"\u003esentry-sdk's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e2.71.0\u003c/h2\u003e\n\u003ch3\u003eNew Features ✨\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eNew integration:\u003c/strong\u003e TypeSafe (\u003ca href=\"https://redirect.github.com/getsentry/sentry-python/issues/4733\"\u003e#4733\u003c/a\u003e) by \u003ca href=\"https://github.com/alexander-alderman-webb\"\u003e\u003ccode\u003e@​alexander-alderman-webb\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eAdd the TypeSafe integration to your \u003ccode\u003esentry_sdk.init\u003c/code\u003e call:\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre lang=\"python\"\u003e\u003ccode\u003eimport sentry_sdk\nfrom sentry_sdk.integrations.typesafe import TypeSafeIntegration\n\u003cp\u003esentry_sdk.init(\u003cbr /\u003e\ndsn=\u0026quot;...\u0026quot;,\u003cbr /\u003e\ntraces_sample_rate=1.0,\u003cbr /\u003e\nintegrations=[\u003cbr /\u003e\nTypeSafeIntegration(),\u003cbr /\u003e\n]\u003cbr /\u003e\n)\u003cbr /\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\n\u003ch4\u003eTypesafe\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eRecord \u003ccode\u003egen_ai.output.messages\u003c/code\u003e by \u003ca href=\"https://github.com/alexander-alderman-webb\"\u003e\u003ccode\u003e@​alexander-alderman-webb\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7720\"\u003e#7720\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eSet token usage attributes by \u003ca href=\"https://github.com/alexander-alderman-webb\"\u003e\u003ccode\u003e@​alexander-alderman-webb\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7719\"\u003e#7719\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRecord \u003ccode\u003egen_ai.input.messages\u003c/code\u003e by \u003ca href=\"https://github.com/alexander-alderman-webb\"\u003e\u003ccode\u003e@​alexander-alderman-webb\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7718\"\u003e#7718\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRecord \u003ccode\u003egen_ai.response.model\u003c/code\u003e by \u003ca href=\"https://github.com/alexander-alderman-webb\"\u003e\u003ccode\u003e@​alexander-alderman-webb\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7717\"\u003e#7717\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdd integration with \u003ccode\u003esystem_one()\u003c/code\u003e patches by \u003ca href=\"https://github.com/alexander-alderman-webb\"\u003e\u003ccode\u003e@​alexander-alderman-webb\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7716\"\u003e#7716\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eBug Fixes 🐛\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eKeep event if processor raises by \u003ca href=\"https://github.com/sentrivana\"\u003e\u003ccode\u003e@​sentrivana\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7701\"\u003e#7701\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eIsolate user callbacks, emit client reports by \u003ca href=\"https://github.com/sentrivana\"\u003e\u003ccode\u003e@​sentrivana\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7692\"\u003e#7692\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eDocumentation 📚\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003ePromote \u003ccode\u003edata_collection\u003c/code\u003e in changelog by \u003ca href=\"https://github.com/sentrivana\"\u003e\u003ccode\u003e@​sentrivana\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7565\"\u003e#7565\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eInternal Changes 🔧\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e(aws-lambda) Add \u003ccode\u003e.gitignore\u003c/code\u003e to lambda handlers by \u003ca href=\"https://github.com/pabloDeputter\"\u003e\u003ccode\u003e@​pabloDeputter\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7638\"\u003e#7638\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e(litellm) Set \u003ccode\u003eLITELLM_LOCAL_MODEL_COST_MAP=true\u003c/code\u003e by \u003ca href=\"https://github.com/alexander-alderman-webb\"\u003e\u003ccode\u003e@​alexander-alderman-webb\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7630\"\u003e#7630\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e(otlp) Adjust to \u003ccode\u003eOTLPSpanExporter._headers\u003c/code\u003e removal by \u003ca href=\"https://github.com/alexander-alderman-webb\"\u003e\u003ccode\u003e@​alexander-alderman-webb\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7722\"\u003e#7722\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUse top-level flush API in tests by \u003ca href=\"https://github.com/sentrivana\"\u003e\u003ccode\u003e@​sentrivana\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7725\"\u003e#7725\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUnsample on sampler exception by \u003ca href=\"https://github.com/sentrivana\"\u003e\u003ccode\u003e@​sentrivana\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7723\"\u003e#7723\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUse \u003ccode\u003esentry_init\u003c/code\u003e fixture by \u003ca href=\"https://github.com/sentrivana\"\u003e\u003ccode\u003e@​sentrivana\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7577\"\u003e#7577\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e2.70.0\u003c/h2\u003e\n\u003ch3\u003eNew Features ✨\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eNew integration:\u003c/strong\u003e Mistral AI (\u003ca href=\"https://redirect.github.com/getsentry/sentry-python/issues/4733\"\u003e#4733\u003c/a\u003e) by \u003ca href=\"https://github.com/alexander-alderman-webb\"\u003e\u003ccode\u003e@​alexander-alderman-webb\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/getsentry/sentry-python/blob/master/CHANGELOG.md\"\u003esentry-sdk's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e2.71.0\u003c/h2\u003e\n\u003ch3\u003eNew Features ✨\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eNew integration:\u003c/strong\u003e TypeSafe (\u003ca href=\"https://redirect.github.com/getsentry/sentry-python/issues/4733\"\u003e#4733\u003c/a\u003e) by \u003ca href=\"https://github.com/alexander-alderman-webb\"\u003e\u003ccode\u003e@​alexander-alderman-webb\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eAdd the TypeSafe integration to your \u003ccode\u003esentry_sdk.init\u003c/code\u003e call:\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre lang=\"python\"\u003e\u003ccode\u003eimport sentry_sdk\nfrom sentry_sdk.integrations.typesafe import TypeSafeIntegration\n\u003cp\u003esentry_sdk.init(\u003cbr /\u003e\ndsn=\u0026quot;...\u0026quot;,\u003cbr /\u003e\ntraces_sample_rate=1.0,\u003cbr /\u003e\nintegrations=[\u003cbr /\u003e\nTypeSafeIntegration(),\u003cbr /\u003e\n]\u003cbr /\u003e\n)\u003cbr /\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\n\u003ch4\u003eTypesafe\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eRecord \u003ccode\u003egen_ai.output.messages\u003c/code\u003e by \u003ca href=\"https://github.com/alexander-alderman-webb\"\u003e\u003ccode\u003e@​alexander-alderman-webb\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7720\"\u003e#7720\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eSet token usage attributes by \u003ca href=\"https://github.com/alexander-alderman-webb\"\u003e\u003ccode\u003e@​alexander-alderman-webb\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7719\"\u003e#7719\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRecord \u003ccode\u003egen_ai.input.messages\u003c/code\u003e by \u003ca href=\"https://github.com/alexander-alderman-webb\"\u003e\u003ccode\u003e@​alexander-alderman-webb\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7718\"\u003e#7718\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRecord \u003ccode\u003egen_ai.response.model\u003c/code\u003e by \u003ca href=\"https://github.com/alexander-alderman-webb\"\u003e\u003ccode\u003e@​alexander-alderman-webb\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7717\"\u003e#7717\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdd integration with \u003ccode\u003esystem_one()\u003c/code\u003e patches by \u003ca href=\"https://github.com/alexander-alderman-webb\"\u003e\u003ccode\u003e@​alexander-alderman-webb\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7716\"\u003e#7716\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eBug Fixes 🐛\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eKeep event if processor raises by \u003ca href=\"https://github.com/sentrivana\"\u003e\u003ccode\u003e@​sentrivana\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7701\"\u003e#7701\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eIsolate user callbacks, emit client reports by \u003ca href=\"https://github.com/sentrivana\"\u003e\u003ccode\u003e@​sentrivana\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7692\"\u003e#7692\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eDocumentation 📚\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003ePromote \u003ccode\u003edata_collection\u003c/code\u003e in changelog by \u003ca href=\"https://github.com/sentrivana\"\u003e\u003ccode\u003e@​sentrivana\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7565\"\u003e#7565\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eInternal Changes 🔧\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e(aws-lambda) Add \u003ccode\u003e.gitignore\u003c/code\u003e to lambda handlers by \u003ca href=\"https://github.com/pabloDeputter\"\u003e\u003ccode\u003e@​pabloDeputter\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7638\"\u003e#7638\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e(litellm) Set \u003ccode\u003eLITELLM_LOCAL_MODEL_COST_MAP=true\u003c/code\u003e by \u003ca href=\"https://github.com/alexander-alderman-webb\"\u003e\u003ccode\u003e@​alexander-alderman-webb\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7630\"\u003e#7630\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e(otlp) Adjust to \u003ccode\u003eOTLPSpanExporter._headers\u003c/code\u003e removal by \u003ca href=\"https://github.com/alexander-alderman-webb\"\u003e\u003ccode\u003e@​alexander-alderman-webb\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7722\"\u003e#7722\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUse top-level flush API in tests by \u003ca href=\"https://github.com/sentrivana\"\u003e\u003ccode\u003e@​sentrivana\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7725\"\u003e#7725\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUnsample on sampler exception by \u003ca href=\"https://github.com/sentrivana\"\u003e\u003ccode\u003e@​sentrivana\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7723\"\u003e#7723\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUse \u003ccode\u003esentry_init\u003c/code\u003e fixture by \u003ca href=\"https://github.com/sentrivana\"\u003e\u003ccode\u003e@​sentrivana\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/getsentry/sentry-python/pull/7577\"\u003e#7577\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e2.70.0\u003c/h2\u003e\n\u003ch3\u003eNew Features ✨\u003c/h3\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/getsentry/sentry-python/commit/7d0255842d0cc41fcb5a80ef172ab164719fbb8b\"\u003e\u003ccode\u003e7d02558\u003c/code\u003e\u003c/a\u003e Update CHANGELOG.md\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/getsentry/sentry-python/commit/e69596f8e1a37add1c54312522562099e182d88b\"\u003e\u003ccode\u003ee69596f\u003c/code\u003e\u003c/a\u003e release: 2.71.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/getsentry/sentry-python/commit/dfc004a02b509525b944b3c1935711c54ca2efa5\"\u003e\u003ccode\u003edfc004a\u003c/code\u003e\u003c/a\u003e feat(typesafe): Record \u003ccode\u003egen_ai.output.messages\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/getsentry/sentry-python/issues/7720\"\u003e#7720\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/getsentry/sentry-python/commit/d36887ba62915c0993bdc13fb7b2077a2983a42d\"\u003e\u003ccode\u003ed36887b\u003c/code\u003e\u003c/a\u003e feat(typesafe): Record token usage (\u003ca href=\"https://redirect.github.com/getsentry/sentry-python/issues/7719\"\u003e#7719\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/getsentry/sentry-python/commit/166b85aa1ed5afb1ab99ba3981f612063f75e2cf\"\u003e\u003ccode\u003e166b85a\u003c/code\u003e\u003c/a\u003e feat(typesafe): Record \u003ccode\u003egen_ai.input.messages\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/getsentry/sentry-python/issues/7718\"\u003e#7718\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/getsentry/sentry-python/commit/1bef56530f0b9ae452238d1535041433d30b162a\"\u003e\u003ccode\u003e1bef565\u003c/code\u003e\u003c/a\u003e chore: Use top-level flush API in tests (\u003ca href=\"https://redirect.github.com/getsentry/sentry-python/issues/7725\"\u003e#7725\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/getsentry/sentry-python/commit/38a946b6420832df313a9ddd7eff38987164915c\"\u003e\u003ccode\u003e38a946b\u003c/code\u003e\u003c/a\u003e feat(typesafe): Record \u003ccode\u003egen_ai.response.model\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/getsentry/sentry-python/issues/7717\"\u003e#7717\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/getsentry/sentry-python/commit/cd3866dfb8cf94423a8bb5477acfe34afa854231\"\u003e\u003ccode\u003ecd3866d\u003c/code\u003e\u003c/a\u003e feat(typesafe): Add integration with \u003ccode\u003esystem_one()\u003c/code\u003e patches (\u003ca href=\"https://redirect.github.com/getsentry/sentry-python/issues/7716\"\u003e#7716\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/getsentry/sentry-python/commit/bd08efd4a5d50d27b0354fb96e6a369cacc2d5b8\"\u003e\u003ccode\u003ebd08efd\u003c/code\u003e\u003c/a\u003e ref: Unsample on sampler exception (\u003ca href=\"https://redirect.github.com/getsentry/sentry-python/issues/7723\"\u003e#7723\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/getsentry/sentry-python/commit/ff7d0b26664d1ae39b5428afd5cd05fbfab4a2a1\"\u003e\u003ccode\u003eff7d0b2\u003c/code\u003e\u003c/a\u003e test(otlp): Adjust to \u003ccode\u003eOTLPSpanExporter._headers\u003c/code\u003e removal (\u003ca href=\"https://redirect.github.com/getsentry/sentry-python/issues/7722\"\u003e#7722\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/getsentry/sentry-python/compare/2.69.2...2.71.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `django-otp` from 1.7.3 to 1.7.4\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/django-otp/django-otp/blob/master/CHANGES.rst\"\u003edjango-otp's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev1.7.4 - October 08, 2026 - Form improvement\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e[#194](https://github.com/django-otp/django-otp/issues/194)\u003c/code\u003e_: Fix otp_device select silently defaulting to a device instead of\nrequiring an explicit choice (Varun Juneja)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e.. _\u003ca href=\"https://redirect.github.com/django-otp/django-otp/issues/194\"\u003e#194\u003c/a\u003e: \u003ca href=\"https://redirect.github.com/django-otp/django-otp/pull/194\"\u003edjango-otp/django-otp#194\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/django-otp/django-otp/commit/fe33c51bcc3828f954431cc3bb5b6d746918fac0\"\u003e\u003ccode\u003efe33c51\u003c/code\u003e\u003c/a\u003e Version 1.7.4\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/django-otp/django-otp/commit/8cd450040058d34df6d7913a5d82abe7ef3aa3b4\"\u003e\u003ccode\u003e8cd4500\u003c/code\u003e\u003c/a\u003e Fix \u003ca href=\"https://redirect.github.com/django-otp/django-otp/issues/193\"\u003e#193\u003c/a\u003e: give the otp_device select a blank default so it can't silently pic...\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/django-otp/django-otp/compare/v1.7.3...v1.7.4\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `cryptography` from 50.0.1 to 50.0.2\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst\"\u003ecryptography's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e50.0.2 - 2026-09-30\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e\n* Updated Windows, macOS, and Linux wheels to be compiled with OpenSSL 4.0.3.\n* Added ``abi3.abi3t`` wheels for free-threaded CPython 3.15 and later.\n* Updated to PyO3 0.29.2, which fixes building ``cryptography`` on Cygwin and\n  MSYS2.\n\u003cp\u003e.. _v50-0-1:\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pyca/cryptography/commit/4dda5c7fe4ae71b8925f2551910a0ef959df9c7a\"\u003e\u003ccode\u003e4dda5c7\u003c/code\u003e\u003c/a\u003e [50.0.x] Bump for 50.0.2 release + changelog (\u003ca href=\"https://redirect.github.com/pyca/cryptography/issues/15733\"\u003e#15733\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pyca/cryptography/commit/70c881cd7ea97d38df09f57c1117470cd1a5a2f7\"\u003e\u003ccode\u003e70c881c\u003c/code\u003e\u003c/a\u003e [50.0.x] Bump pyo3 to 0.29.2 (\u003ca href=\"https://redirect.github.com/pyca/cryptography/issues/15731\"\u003e#15731\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pyca/cryptography/commit/a8c45c449b8d29908a14561afd45fee8bf27d044\"\u003e\u003ccode\u003ea8c45c4\u003c/code\u003e\u003c/a\u003e [50.0.x] Build abi3.abi3t wheels for CPython 3.15+ (\u003ca href=\"https://redirect.github.com/pyca/cryptography/issues/15496\"\u003e#15496\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/pyca/cryptography/issues/15732\"\u003e#15732\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/pyca/cryptography/compare/50.0.1...50.0.2\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `pypdf` from 6.19.0 to 6.20.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/py-pdf/pypdf/releases\"\u003epypdf's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003eVersion 6.20.0, 2026-10-09\u003c/h2\u003e\n\u003ch2\u003eWhat's new\u003c/h2\u003e\n\u003ch3\u003eSecurity (SEC)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eLimit work per stream (filter count, accumulated decoding work) (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4173\"\u003e#4173\u003c/a\u003e) by \u003ca href=\"https://github.com/stefan6419846\"\u003e\u003ccode\u003e@​stefan6419846\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eNew Features (ENH)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAdd support for BrotliDecode filter (PDF 2.0) (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4168\"\u003e#4168\u003c/a\u003e) by \u003ca href=\"https://github.com/stefan6419846\"\u003e\u003ccode\u003e@​stefan6419846\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003ePerformance Improvements (PI)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eParse an embedded CFF font program once per stream (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4164\"\u003e#4164\u003c/a\u003e) by \u003ca href=\"https://github.com/marshalltech81\"\u003e\u003ccode\u003e@​marshalltech81\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eParse numbers, indirect references, names and nulls faster (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4148\"\u003e#4148\u003c/a\u003e) by \u003ca href=\"https://github.com/MartinThoma\"\u003e\u003ccode\u003e@​MartinThoma\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eDo not inherit PdfObject from a Protocol (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4149\"\u003e#4149\u003c/a\u003e) by \u003ca href=\"https://github.com/MartinThoma\"\u003e\u003ccode\u003e@​MartinThoma\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eSpeed up cloning direct objects (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4152\"\u003e#4152\u003c/a\u003e) by \u003ca href=\"https://github.com/MartinThoma\"\u003e\u003ccode\u003e@​MartinThoma\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eBug Fixes (BUG)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eReport the correct page number for identical pages (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4154\"\u003e#4154\u003c/a\u003e) by \u003ca href=\"https://github.com/pasmud\"\u003e\u003ccode\u003e@​pasmud\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eDecrypt the XMP metadata stream unless /EncryptMetadata is false (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4151\"\u003e#4151\u003c/a\u003e) by \u003ca href=\"https://github.com/metsw24-max\"\u003e\u003ccode\u003e@​metsw24-max\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eRobustness (ROB)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eMultiple changes by \u003ca href=\"https://github.com/RavSinghChandan\"\u003e\u003ccode\u003e@​RavSinghChandan\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAccept an %%EOF marker that is not at the start of a line (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4136\"\u003e#4136\u003c/a\u003e) by \u003ca href=\"https://github.com/Dmao233\"\u003e\u003ccode\u003e@​Dmao233\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFont / _cmapy.py: More robust guards around fontTools (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4157\"\u003e#4157\u003c/a\u003e) by \u003ca href=\"https://github.com/PJBrs\"\u003e\u003ccode\u003e@​PJBrs\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFlatten the page tree iteratively (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4107\"\u003e#4107\u003c/a\u003e) by \u003ca href=\"https://github.com/MartinThoma\"\u003e\u003ccode\u003e@​MartinThoma\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eIgnore invalid character codes for TrueType and Type1 font widths (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4117\"\u003e#4117\u003c/a\u003e) by \u003ca href=\"https://github.com/stefan6419846\"\u003e\u003ccode\u003e@​stefan6419846\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRestrict values to allowed range in CCITTFaxDecode (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4115\"\u003e#4115\u003c/a\u003e) by \u003ca href=\"https://github.com/stefan6419846\"\u003e\u003ccode\u003e@​stefan6419846\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eDrop a /Kids entry resolving to null instead of raising a cycle error (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4108\"\u003e#4108\u003c/a\u003e) by \u003ca href=\"https://github.com/MartinThoma\"\u003e\u003ccode\u003e@​MartinThoma\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eDeveloper Experience (DEV)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eDeclare official support for Python 3.15 by \u003ca href=\"https://github.com/stefan6419846\"\u003e\u003ccode\u003e@​stefan6419846\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eDeclare protocol data members on PdfReader and PdfWriter (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4106\"\u003e#4106\u003c/a\u003e) by \u003ca href=\"https://github.com/ihsandeniz\"\u003e\u003ccode\u003e@​ihsandeniz\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/py-pdf/pypdf/compare/6.19.0...6.20.0\"\u003eFull Changelog\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/py-pdf/pypdf/blob/main/CHANGELOG.md\"\u003epypdf's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003eVersion 6.20.0, 2026-10-09\u003c/h2\u003e\n\u003ch3\u003eSecurity (SEC)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eLimit work per stream (filter count, accumulated decoding work) (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4173\"\u003e#4173\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eNew Features (ENH)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAdd support for BrotliDecode filter (PDF 2.0) (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4168\"\u003e#4168\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003ePerformance Improvements (PI)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eParse an embedded CFF font program once per stream (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4164\"\u003e#4164\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eParse numbers, indirect references, names and nulls faster (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4148\"\u003e#4148\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eDo not inherit PdfObject from a Protocol (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4149\"\u003e#4149\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSpeed up cloning direct objects (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4152\"\u003e#4152\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eBug Fixes (BUG)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eReport the correct page number for identical pages (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4154\"\u003e#4154\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eDecrypt the XMP metadata stream unless /EncryptMetadata is false (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4151\"\u003e#4151\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eRobustness (ROB)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAccept an %%EOF marker that is not at the start of a line (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4136\"\u003e#4136\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFont / _cmapy.py: More robust guards around fontTools (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4157\"\u003e#4157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFlatten the page tree iteratively (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4107\"\u003e#4107\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eIgnore invalid character codes for TrueType and Type1 font widths (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4117\"\u003e#4117\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eRestrict values to allowed range in CCITTFaxDecode (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4115\"\u003e#4115\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eDrop a /Kids entry resolving to null instead of raising a cycle error (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4108\"\u003e#4108\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eDeveloper Experience (DEV)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eDeclare official support for Python 3.15\u003c/li\u003e\n\u003cli\u003eDeclare protocol data members on PdfReader and PdfWriter (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4106\"\u003e#4106\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/py-pdf/pypdf/compare/6.19.0...6.20.0\"\u003eFull Changelog\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/py-pdf/pypdf/commit/0309ab701a192fbd3228701a44dd009765a1629b\"\u003e\u003ccode\u003e0309ab7\u003c/code\u003e\u003c/a\u003e REL: 6.20.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/py-pdf/pypdf/commit/80a84d4be6022d910874ccb0d2365400f3f0e185\"\u003e\u003ccode\u003e80a84d4\u003c/code\u003e\u003c/a\u003e SEC: Limit work per stream (filter count, accumulated decoding work) (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4173\"\u003e#4173\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/py-pdf/pypdf/commit/4c20fa800a561c2776bf000d3c5d05dada2fac96\"\u003e\u003ccode\u003e4c20fa8\u003c/code\u003e\u003c/a\u003e DEV: Declare official support for Python 3.15\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/py-pdf/pypdf/commit/c64a4e4a73c8464fa24f7cd43e039aebfcc8cafb\"\u003e\u003ccode\u003ec64a4e4\u003c/code\u003e\u003c/a\u003e ROB: Skip a Tj operator whose operand is not a string (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4171\"\u003e#4171\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/py-pdf/pypdf/commit/4714175aabdad4a5956eb2a70902dc09b7f6b15e\"\u003e\u003ccode\u003e4714175\u003c/code\u003e\u003c/a\u003e MAINT: Fix A001 (Variable is shadowing a Python builtin) (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4167\"\u003e#4167\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/py-pdf/pypdf/commit/921d77833e58d2c52699a39ae38f7da4bb28491e\"\u003e\u003ccode\u003e921d778\u003c/code\u003e\u003c/a\u003e ROB: Accept an %%EOF marker that is not at the start of a line (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4136\"\u003e#4136\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/py-pdf/pypdf/commit/1a6b0502e26d2430b6370f8ebf7a647ba2623a4f\"\u003e\u003ccode\u003e1a6b050\u003c/code\u003e\u003c/a\u003e ROB: Skip a TJ operator whose operand is not an array (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4166\"\u003e#4166\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/py-pdf/pypdf/commit/5b6a77a3dae3dc0521ca265176cb9e1cd2097d2e\"\u003e\u003ccode\u003e5b6a77a\u003c/code\u003e\u003c/a\u003e PI: Parse an embedded CFF font program once per stream (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4164\"\u003e#4164\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/py-pdf/pypdf/commit/79423c1288cbbb4a16bf0601b3539797f6900bb3\"\u003e\u003ccode\u003e79423c1\u003c/code\u003e\u003c/a\u003e PI: Parse numbers, indirect references, names and nulls faster (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4148\"\u003e#4148\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/py-pdf/pypdf/commit/37e1cd681744bac38b159f7e1c614eee8d639c58\"\u003e\u003ccode\u003e37e1cd6\u003c/code\u003e\u003c/a\u003e ROB: Handle EOF when reading standard xref table (\u003ca href=\"https://redirect.github.com/py-pdf/pypdf/issues/4170\"\u003e#4170\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/py-pdf/pypdf/compare/6.19.0...6.20.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `black` from 26.5.1 to 26.10.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/psf/black/releases\"\u003eblack's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e26.10.0\u003c/h2\u003e\n\u003ch3\u003eStable style\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e--line-ranges\u003c/code\u003e no longer inserts an empty line after a docstring when the range\ncovers only the docstring itself (\u003ca href=\"https://redirect.github.com/psf/black/issues/5312\"\u003e#5312\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix \u003ccode\u003e# fmt: skip\u003c/code\u003e on a bracketed ternary turning the surrounding tuple into a call\n(\u003ca href=\"https://redirect.github.com/psf/black/issues/5464\"\u003e#5464\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix crash when \u003ccode\u003e# fmt: skip\u003c/code\u003e is placed on a one-line function or class with PEP 695\ntype parameters (\u003ca href=\"https://redirect.github.com/psf/black/issues/5429\"\u003e#5429\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix an inline comment after the closing bracket of optional parentheses being moved\ninside the parentheses when the parenthesized expression contains own-line comments\n(\u003ca href=\"https://redirect.github.com/psf/black/issues/5395\"\u003e#5395\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix unparseable output when \u003ccode\u003e# fmt: skip\u003c/code\u003e is placed on a bracket of an \u003ccode\u003eif\u003c/code\u003e, \u003ccode\u003ewhile\u003c/code\u003e,\n\u003ccode\u003efor\u003c/code\u003e, or \u003ccode\u003ewith\u003c/code\u003e header (\u003ca href=\"https://redirect.github.com/psf/black/issues/5401\"\u003e#5401\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/psf/black/issues/5405\"\u003e#5405\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix crash when formatting parenthesized expressions with multiple inline comments and\n\u003ccode\u003e# fmt: skip\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/psf/black/issues/5414\"\u003e#5414\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix parsing Jupyter notebook assignment magics when non-ASCII characters appear\nearlier on the line (\u003ca href=\"https://redirect.github.com/psf/black/issues/5381\"\u003e#5381\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ePreserve blank lines that come immediately before a \u003ccode\u003e# fmt: on\u003c/code\u003e comment (\u003ca href=\"https://redirect.github.com/psf/black/issues/5300\"\u003e#5300\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eKeep the parentheses around the target of an annotated assignment (e.g.\n\u003ccode\u003e(x): int = 5\u003c/code\u003e), which prevent CPython from including the name in \u003ccode\u003e__annotations__\u003c/code\u003e\n(\u003ca href=\"https://redirect.github.com/psf/black/issues/5321\"\u003e#5321\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eStop treating a t-string in docstring position as a docstring (e.g. \u003ccode\u003et\u0026quot;  spam  \u0026quot;\u003c/code\u003e as\nthe first statement of a module, class or function) (\u003ca href=\"https://redirect.github.com/psf/black/issues/5287\"\u003e#5287\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix unparseable output for a t-string whose replacement field contains a quote (e.g.\n\u003ccode\u003et'\\'{a[\u0026quot;b\u0026quot;]}\\''\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/psf/black/issues/5265\"\u003e#5265\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix unparseable output for a triple-quoted string whose body ends in an\nalready-escaped double quote (e.g. \u003ccode\u003e'''\\'''\\\u0026quot;'''\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/psf/black/issues/5262\"\u003e#5262\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix \u003ccode\u003e--skip-magic-trailing-comma\u003c/code\u003e dropping the trailing comma from a split\nsingle-element tuple used as a lambda parameter default (\u003ca href=\"https://redirect.github.com/psf/black/issues/5246\"\u003e#5246\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix unstable formatting when an inline comment sits on optional parentheses (e.g. a\nparenthesized assert message) (\u003ca href=\"https://redirect.github.com/psf/black/issues/5241\"\u003e#5241\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix \u003ccode\u003e--skip-magic-trailing-comma\u003c/code\u003e dropping the trailing comma of a one-element\nsubscript (\u003ccode\u003ea[x,]\u003c/code\u003e) when the line is long enough to be split and contains a power\noperator (\u003ca href=\"https://redirect.github.com/psf/black/issues/5272\"\u003e#5272\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix crash when a standalone comment sits between tokens of a comprehension or lambda\n(\u003ca href=\"https://redirect.github.com/psf/black/issues/5144\"\u003e#5144\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix inline comments on a bracket inside a comprehension being dropped (\u003ca href=\"https://redirect.github.com/psf/black/issues/5330\"\u003e#5330\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eRespect the magic trailing comma in a PEP 695 type parameter list containing a\n\u003ccode\u003e*TypeVarTuple\u003c/code\u003e or \u003ccode\u003e**ParamSpec\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/psf/black/issues/5244\"\u003e#5244\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix crash when a comment-only \u003ccode\u003e# fmt: off\u003c/code\u003e/\u003ccode\u003e# fmt: on\u003c/code\u003e block is followed by a \u003ccode\u003ewith\u003c/code\u003e\nstatement after another standalone comment (\u003ca href=\"https://redirect.github.com/psf/black/issues/5189\"\u003e#5189\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix a crash when splitting \u003ccode\u003ecase case if ...\u003c/code\u003e match patterns at very small line\nlengths (\u003ca href=\"https://redirect.github.com/psf/black/issues/5147\"\u003e#5147\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix multiline docstring indentation when leading tabs are used inside indented\ndocstrings (\u003ca href=\"https://redirect.github.com/psf/black/issues/5148\"\u003e#5148\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eRespect \u003ccode\u003e# fmt: skip\u003c/code\u003e on a line that opens a bracket (e.g.\n\u003ccode\u003efrom x import (  # fmt: skip\u003c/code\u003e) when a standalone comment is among the bracket's\ncontents (\u003ca href=\"https://redirect.github.com/psf/black/issues/5161\"\u003e#5161\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix an AST safety error when separate \u003ccode\u003e# type: ignore\u003c/code\u003e comments in a parenthesized\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/psf/black/blob/main/CHANGES.md\"\u003eblack's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003eVersion 26.10.0\u003c/h2\u003e\n\u003ch3\u003eStable style\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e--line-ranges\u003c/code\u003e no longer inserts an empty line after a docstring when the range\ncovers only the docstring itself (\u003ca href=\"https://redirect.github.com/psf/black/issues/5312\"\u003e#5312\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix \u003ccode\u003e# fmt: skip\u003c/code\u003e on a bracketed ternary turning the surrounding tuple into a call\n(\u003ca href=\"https://redirect.github.com/psf/black/issues/5464\"\u003e#5464\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix crash when \u003ccode\u003e# fmt: skip\u003c/code\u003e is placed on a one-line function or class with PEP 695\ntype parameters (\u003ca href=\"https://redirect.github.com/psf/black/issues/5429\"\u003e#5429\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix an inline comment after the closing bracket of optional parentheses being moved\ninside the parentheses when the parenthesized expression contains own-line comments\n(\u003ca href=\"https://redirect.github.com/psf/black/issues/5395\"\u003e#5395\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix unparseable output when \u003ccode\u003e# fmt: skip\u003c/code\u003e is placed on a bracket of an \u003ccode\u003eif\u003c/code\u003e, \u003ccode\u003ewhile\u003c/code\u003e,\n\u003ccode\u003efor\u003c/code\u003e, or \u003ccode\u003ewith\u003c/code\u003e header (\u003ca href=\"https://redirect.github.com/psf/black/issues/5401\"\u003e#5401\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/psf/black/issues/5405\"\u003e#5405\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix crash when formatting parenthesized expressions with multiple inline comments and\n\u003ccode\u003e# fmt: skip\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/psf/black/issues/5414\"\u003e#5414\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix parsing Jupyter notebook assignment magics when non-ASCII characters appear\nearlier on the line (\u003ca href=\"https://redirect.github.com/psf/black/issues/5381\"\u003e#5381\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ePreserve blank lines that come immediately before a \u003ccode\u003e# fmt: on\u003c/code\u003e comment (\u003ca href=\"https://redirect.github.com/psf/black/issues/5300\"\u003e#5300\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eKeep the parentheses around the target of an annotated assignment (e.g.\n\u003ccode\u003e(x): int = 5\u003c/code\u003e), which prevent CPython from including the name in \u003ccode\u003e__annotations__\u003c/code\u003e\n(\u003ca href=\"https://redirect.github.com/psf/black/issues/5321\"\u003e#5321\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eStop treating a t-string in docstring position as a docstring (e.g. \u003ccode\u003et\u0026quot;  spam  \u0026quot;\u003c/code\u003e as\nthe first statement of a module, class or function) (\u003ca href=\"https://redirect.github.com/psf/black/issues/5287\"\u003e#5287\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix unparseable output for a t-string whose replacement field contains a quote (e.g.\n\u003ccode\u003et'\\'{a[\u0026quot;b\u0026quot;]}\\''\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/psf/black/issues/5265\"\u003e#5265\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix unparseable output for a triple-quoted string whose body ends in an\nalready-escaped double quote (e.g. \u003ccode\u003e'''\\'''\\\u0026quot;'''\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/psf/black/issues/5262\"\u003e#5262\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix \u003ccode\u003e--skip-magic-trailing-comma\u003c/code\u003e dropping the trailing comma from a split\nsingle-element tuple used as a lambda parameter default (\u003ca href=\"https://redirect.github.com/psf/black/issues/5246\"\u003e#5246\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix unstable formatting when an inline comment sits on optional parentheses (e.g. a\nparenthesized assert message) (\u003ca href=\"https://redirect.github.com/psf/black/issues/5241\"\u003e#5241\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix \u003ccode\u003e--skip-magic-trailing-comma\u003c/code\u003e dropping the trailing comma of a one-element\nsubscript (\u003ccode\u003ea[x,]\u003c/code\u003e) when the line is long enough to be split and contains a power\noperator (\u003ca href=\"https://redirect.github.com/psf/black/issues/5272\"\u003e#5272\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix crash when a standalone comment sits between tokens of a comprehension or lambda\n(\u003ca href=\"https://redirect.github.com/psf/black/issues/5144\"\u003e#5144\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix inline comments on a bracket inside a comprehension being dropped (\u003ca href=\"https://redirect.github.com/psf/black/issues/5330\"\u003e#5330\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eRespect the magic trailing comma in a PEP 695 type parameter list containing a\n\u003ccode\u003e*TypeVarTuple\u003c/code\u003e or \u003ccode\u003e**ParamSpec\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/psf/black/issues/5244\"\u003e#5244\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix crash when a comment-only \u003ccode\u003e# fmt: off\u003c/code\u003e/\u003ccode\u003e# fmt: on\u003c/code\u003e block is followed by a \u003ccode\u003ewith\u003c/code\u003e\nstatement after another standalone comment (\u003ca href=\"https://redirect.github.com/psf/black/issues/5189\"\u003e#5189\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix a crash when splitting \u003ccode\u003ecase case if ...\u003c/code\u003e match patterns at very small line\nlengths (\u003ca href=\"https://redirect.github.com/psf/black/issues/5147\"\u003e#5147\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eFix multiline docstring indentation when leading tabs are used inside indented\ndocstrings (\u003ca href=\"https://redirect.github.com/psf/black/issues/5148\"\u003e#5148\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eRespect \u003ccode\u003e# fmt: skip\u003c/code\u003e on a line that opens a bracket (e.g.\n\u003ccode\u003efrom x import (  # fmt: skip\u003c/code\u003e) when a standalone comment is among the bracket's\ncontents (\u003ca href=\"https://redirect.github.com/psf/black/issues/5161\"\u003e#5161\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/psf/black/commit/4f1883b1f15305a0e83a7c87991f46292bf09f85\"\u003e\u003ccode\u003e4f1883b\u003c/code\u003e\u003c/a\u003e Prepare release 26.10.0 (\u003ca href=\"https://redirect.github.com/psf/black/issues/5478\"\u003e#5478\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/psf/black/commit/93e5c8204c0340403c925a3bf7b747bf7817aaab\"\u003e\u003ccode\u003e93e5c82\u003c/code\u003e\u003c/a\u003e Do not split a docstring on non-newline characters (\u003ca href=\"https://redirect.github.com/psf/black/issues/5461\"\u003e#5461\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/psf/black/commit/2f3f992a9827e7ed7c4e68c34c35a5a34b75f4c2\"\u003e\u003ccode\u003e2f3f992\u003c/code\u003e\u003c/a\u003e Fix superlinear runtime growth with the number of input files (\u003ca href=\"https://redirect.github.com/psf/black/issues/5450\"\u003e#5450\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/psf/black/commit/d078e8eee2824b01e1c4b841f0affc273e198d35\"\u003e\u003ccode\u003ed078e8e\u003c/code\u003e\u003c/a\u003e Refactor release process to be more automated and use immutable releases (\u003ca href=\"https://redirect.github.com/psf/black/issues/5296\"\u003e#5296\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/psf/black/commit/6408e696237222d2519238f0ae637e850fd5240a\"\u003e\u003ccode\u003e6408e69\u003c/code\u003e\u003c/a\u003e Preserve leaf line numbers in append_leaves to prevent pragma line collapse (...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/psf/black/commit/cf8560b1f43014986662ab4e717da29e98b8c651\"\u003e\u003ccode\u003ecf8560b\u003c/code\u003e\u003c/a\u003e Add is_formatted output to GitHub Action (\u003ca href=\"https://redirect.github.com/psf/black/issues/3526\"\u003e#3526\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/psf/black/issues/5408\"\u003e#5408\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/psf/black/commit/9b65aa3ab5688ef64ff6f1a2bafa6618df799953\"\u003e\u003ccode\u003e9b65aa3\u003c/code\u003e\u003c/a\u003e docs(contributing): fix two grammar typos in issue_triage.md (\u003ca href=\"https://redirect.github.com/psf/black/issues/5426\"\u003e#5426\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/psf/black/commit/e1c478359c087b76a6c4830a84c7e78ac93d8a6c\"\u003e\u003ccode\u003ee1c4783\u003c/code\u003e\u003c/a\u003e Fix --force-exclude for paths containing .. (\u003ca href=\"https://redirect.github.com/psf/black/issues/5471\"\u003e#5471\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/psf/black/commit/34bfc69e57d05c6429673a445b402826695e8be5\"\u003e\u003ccode\u003e34bfc69\u003c/code\u003e\u003c/a\u003e Fix duplicated comments when string_processing rewrites a line (\u003ca href=\"https://redirect.github.com/psf/black/issues/5449\"\u003e#5449\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/psf/black/commit/5fe7881e6e40ceeed3c9e3212cbc70a040adea28\"\u003e\u003ccode\u003e5fe7881\u003c/code\u003e\u003c/a\u003e Fix preview blank lines after a stub method (\u003ca href=\"https://redirect.github.com/psf/black/issues/5439\"\u003e#5439\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/psf/black/compare/26.5.1...26.10.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `virtualenv` from 21.14.2 to 21.14.6\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pypa/virtualenv/releases\"\u003evirtualenv's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e21.14.6\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e👷 ci: pin ubuntu-26.04, clear warnings, bump deps by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3378\"\u003epypa/virtualenv#3378\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(ci): defer upgrades blocked by release age by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3379\"\u003epypa/virtualenv#3379\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eci: overlap release transfers and verification by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3382\"\u003epypa/virtualenv#3382\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(seed): guard every embed update log read, not just one by \u003ca href=\"https://github.com/darrenhuai\"\u003e\u003ccode\u003e@​darrenhuai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3383\"\u003epypa/virtualenv#3383\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.14.5...21.14.6\"\u003ehttps://github.com/pypa/virtualenv/compare/21.14.5...21.14.6\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e21.14.5\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e🎨 style(test): mark prompt fixture locals Final by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3374\"\u003epypa/virtualenv#3374\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🎨 style: give every Final annotation its type by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3375\"\u003epypa/virtualenv#3375\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(ci): dump stacks from a thread that holds the GIL by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3377\"\u003epypa/virtualenv#3377\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eReset the embed update log when it cannot be read by \u003ca href=\"https://github.com/pasmud\"\u003e\u003ccode\u003e@​pasmud\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3376\"\u003epypa/virtualenv#3376\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.14.4...21.14.5\"\u003ehttps://github.com/pypa/virtualenv/compare/21.14.4...21.14.5\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e21.14.4\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eUpgrade embedded pip/setuptools/wheel and CI test tools by \u003ca href=\"https://github.com/github-actions\"\u003e\u003ccode\u003e@​github-actions\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3372\"\u003epypa/virtualenv#3372\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e📝 docs(changelog): note the zsh prompt fix by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3373\"\u003epypa/virtualenv#3373\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.14.3...21.14.4\"\u003ehttps://github.com/pypa/virtualenv/compare/21.14.3...21.14.4\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e21.14.3\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e✨ feat(security): add a private vulnerability report form by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3370\"\u003epypa/virtualenv#3370\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e📝 docs(changelog): link the 21.14.0 wheel-order fix to \u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3361\"\u003e#3361\u003c/a\u003e by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3371\"\u003epypa/virtualenv#3371\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eApply the whole Requires-Python specifier set in Wheel.support_py by \u003ca href=\"https://github.com/pasmud\"\u003e\u003ccode\u003e@​pasmud\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3369\"\u003epypa/virtualenv#3369\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUpgrade embedded pip/setuptools/wheel and CI test tools by \u003ca href=\"https://github.com/github-actions\"\u003e\u003ccode\u003e@​github-actions\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/pypa/virtualenv/pull/3368\"\u003epypa/virtualenv#3368\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.14.2...21.14.3\"\u003ehttps://github.com/pypa/virtualenv/compare/21.14.2...21.14.3\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pypa/virtualenv/blob/main/docs/changelog.rst\"\u003evirtualenv's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003eBugfixes - 21.14.6\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eFall back to the bundled seed wheel with periodic update on (the default) when the embed update log holds JSON of the\nwrong shape, instead of downloading the wheel or, offline, failing to create the environment - by :user:\u003ccode\u003edarrenhuai\u003c/code\u003e.\n(:issue:\u003ccode\u003e3383\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003ev21.14.5 (2026-10-02)\u003c/p\u003e\n\u003chr /\u003e\n\u003ch1\u003eBugfixes - 21.14.5\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eFall back to the bundled seed wheel and remove the embed update log when the log in the app data folder holds JSON of\nthe wrong shape, instead of failing to create the environment - by :user:\u003ccode\u003epasmud\u003c/code\u003e. (:issue:\u003ccode\u003e3376\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003ev21.14.4 (2026-10-02)\u003c/p\u003e\n\u003chr /\u003e\n\u003ch1\u003eBugfixes - 21.14.4\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eFix \u003ccode\u003eactivate\u003c/code\u003e running commands from a virtual environment name or \u003ccode\u003e--prompt\u003c/code\u003e that holds \u003ccode\u003e$(...)\u003c/code\u003e, backticks or\n\u003ccode\u003e${...}\u003c/code\u003e when zsh has \u003ccode\u003ePROMPT_SUBST\u003c/code\u003e set, and show a \u003ccode\u003e%\u003c/code\u003e in the name as typed under zsh (\u003ccode\u003eGHSA-5vjq-rrrf-7h2q \u0026lt;https://github.com/pypa/virtualenv/security/advisories/GHSA-5vjq-rrrf-7h2q\u0026gt;\u003c/code\u003e_); reported by :user:\u003ccode\u003ekemrec\u003c/code\u003e.\n(:issue:\u003ccode\u003e3373\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003ev21.14.3 (2026-10-01)\u003c/p\u003e\n\u003chr /\u003e\n\u003ch1\u003eBugfixes - 21.14.3\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eHonor \u003ccode\u003e~=\u003c/code\u003e and every clause of a seed wheel's \u003ccode\u003eRequires-Python\u003c/code\u003e when picking a wheel for the target Python, and\nskip a wheel whose \u003ccode\u003eRequires-Python\u003c/code\u003e is not a valid specifier instead of failing - by :user:\u003ccode\u003epasmud\u003c/code\u003e.\n(:issue:\u003ccode\u003e3369\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003ev21.14.2 (2026-10-01)\u003c/p\u003e\n\u003chr /\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/9e69ac725fd4dc83726536c084ab9ca4f099c5b6\"\u003e\u003ccode\u003e9e69ac7\u003c/code\u003e\u003c/a\u003e release 21.14.6\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/464c34b696c81190cd1ad6589158f6ce59467351\"\u003e\u003ccode\u003e464c34b\u003c/code\u003e\u003c/a\u003e 🐛 fix(seed): guard every embed update log read, not just one (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3383\"\u003e#3383\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/3f56d7f4b88884296249b83889d717c41ed6e668\"\u003e\u003ccode\u003e3f56d7f\u003c/code\u003e\u003c/a\u003e ci: overlap release transfers and verification (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3382\"\u003e#3382\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/7577efd46b0e62c5edbd803ded2788eb6d48f5ca\"\u003e\u003ccode\u003e7577efd\u003c/code\u003e\u003c/a\u003e chore(deps): bump the runtime-dependencies group with 10 updates (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3381\"\u003e#3381\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/f6d172367b48d5138fcab911ff8fdd86b4e8cdaf\"\u003e\u003ccode\u003ef6d1723\u003c/code\u003e\u003c/a\u003e [pre-commit.ci] pre-commit autoupdate (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3380\"\u003e#3380\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/7c56749d7b3065f6a99b21fd61089ba692e4aaec\"\u003e\u003ccode\u003e7c56749\u003c/code\u003e\u003c/a\u003e fix(ci): defer upgrades blocked by release age (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3379\"\u003e#3379\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/95d02526dc5f2c569767d8ee572f72f571b8a6ce\"\u003e\u003ccode\u003e95d0252\u003c/code\u003e\u003c/a\u003e 👷 ci: pin ubuntu-26.04, clear warnings, bump deps (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3378\"\u003e#3378\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/571bc2041dae5ecbd250d82ec7ef482cfd3c3b69\"\u003e\u003ccode\u003e571bc20\u003c/code\u003e\u003c/a\u003e release 21.14.5\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/5b9b7de4f2f850d94deec4d5a9764e7b879e8865\"\u003e\u003ccode\u003e5b9b7de\u003c/code\u003e\u003c/a\u003e Reset the embed update log when it cannot be read (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3376\"\u003e#3376\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pypa/virtualenv/commit/9fd48c89ad6986d37d20598fd3d8bb5eee94ecba\"\u003e\u003ccode\u003e9fd48c8\u003c/code\u003e\u003c/a\u003e 🐛 fix(ci): dump stacks from a thread that holds the GIL (\u003ca href=\"https://redirect.github.com/pypa/virtualenv/issues/3377\"\u003e#3377\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/pypa/virtualenv/compare/21.14.2...21.14.6\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `mypy` from 2.3.1 to 2.4.0\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/python/mypy/blob/master/CHANGELOG.md\"\u003emypy's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003eMypy Release Notes\u003c/h1\u003e\n\u003ch2\u003eNext Release\u003c/h2\u003e\n\u003ch2\u003eMypy 2.4\u003c/h2\u003e\n\u003cp\u003eWe've just uploaded mypy 2.4.0 to the Python Package Index (\u003ca href=\"https://pypi.org/project/mypy/\"\u003ePyPI\u003c/a\u003e).\nMypy is a static type checker for Python. This release includes new features, performance\nimprovements and bug fixes. You can install it as follows:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003epython3 -m pip install -U mypy\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eYou can read the full documentation for this release on \u003ca href=\"http://mypy.readthedocs.io\"\u003eRead the Docs\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003ePython 3.15 Support\u003c/h3\u003e\n\u003cp\u003eMypy 2.4 supports running on Python 3.15 and type checking most Python\n3.15 features. This includes the new builtin \u003ccode\u003esentinel\u003c/code\u003e type for\nsentinel values (PEP 661), which mypy now supports (see below for\ndetails). Lazy imports (PEP 810) and unpacking in comprehensions\n(PEP 798) are also supported. Closed TypedDicts (PEP 728) have been\nsupported since mypy 2.2, but the \u003ccode\u003eextra_items\u003c/code\u003e TypedDict argument,\nalso introduced in PEP 728, is still unsupported. Support for\n\u003ccode\u003eextra_items\u003c/code\u003e will be added in a future mypy release.\u003c/p\u003e\n\u003ch3\u003eNative Parser Enabled by Default\u003c/h3\u003e\n\u003cp\u003eMypy now uses the new native parser by default. It's based on the Ruff\nparser, and it's significantly faster than the legacy parser, which\nuses the stdlib \u003ccode\u003east\u003c/code\u003e module. The native parser also has other\nbenefits:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eYou can target newer Python versions and use recent Python syntax\neven when running mypy on an older Python version. For example, you\ncan use \u003cc...\n\n_Description has been truncated_","html_url":"https://github.com/birgit-seyr/jasmin/pull/71","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/birgit-seyr%2Fjasmin/issues/71","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/71/packages"}},{"old_version":"21.13.0","new_version":"21.14.5","update_type":"minor","path":null,"pr_created_at":"2026-10-12T10:12:33.000Z","version_change":"21.13.0 → 21.14.5","issue":{"uuid":"5812002709","node_id":"PR_kwDOEFFaps8AAAABH8Sipg","number":27,"state":"closed","title":"Bump the minor-and-patch group with 14 updates","user":"dependabot[bot]","labels":["dependencies","python:uv"],"assignees":[],"locked":false,"comments_count":1,"pull_request":true,"closed_at":"2026-10-19T04:06:26.000Z","author_association":null,"state_reason":null,"created_at":"2026-10-12T10:12:33.000Z","updated_at":"2026-10-19T04:06:29.000Z","time_to_close":582833,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"Bump","group_name":"minor-and-patch","update_count":14,"packages":[{"name":"torch","old_version":"2.14.0","new_version":"2.14.1","repository_url":"https://github.com/pytorch/pytorch"},{"name":"huggingface-hub","old_version":"2.0.0","new_version":"2.1.1","repository_url":"https://github.com/huggingface/huggingface_hub"},{"name":"ruff","old_version":"0.16.9","new_version":"0.16.10","repository_url":"https://github.com/astral-sh/ruff"},{"name":"pydoclint","old_version":"0.10.0","new_version":"0.11.0","repository_url":"https://github.com/jsh9/pydoclint"},{"name":"sphinx-autodoc-typehints","old_version":"3.13.7","new_version":"3.13.8","repository_url":"https://github.com/tox-dev/sphinx-autodoc-typehints"},{"name":"charset-normalizer","old_version":"3.5.1","new_version":"3.5.2","repository_url":"https://github.com/jawah/charset_normalizer"},{"name":"cuda-pathfinder","old_version":"1.8.2","new_version":"1.8.3","repository_url":"https://github.com/NVIDIA/cuda-python"},{"name":"fastapi","old_version":"0.141.1","new_version":"0.142.2","repository_url":"https://github.com/fastapi/fastapi"},{"name":"filelock","old_version":"4.0.4","new_version":"4.0.11","repository_url":"https://github.com/tox-dev/py-filelock"},{"name":"markupsafe","old_version":"3.0.3","new_version":"3.0.4","repository_url":"https://github.com/pallets/markupsafe"},{"name":"platformdirs","old_version":"4.12.0","new_version":"4.12.3","repository_url":"https://github.com/tox-dev/platformdirs"},{"name":"pytz","old_version":"2026.4","new_version":"2026.5","repository_url":"https://github.com/stub42/pytz"},{"name":"tzdata","old_version":"2026.4","new_version":"2026.5","repository_url":"https://github.com/python/tzdata"},{"name":"virtualenv","old_version":"21.13.0","new_version":"21.14.5","repository_url":"https://github.com/pypa/virtualenv"}],"path":null,"ecosystem":"pip"},"body":"Bumps the minor-and-patch group with 14 updates:\n\n| Package | From | To |\n| --- | --- | --- |\n| [torch](https://github.com/pytorch/pytorch) | `2.14.0` | `2.14.1` |\n| [huggingface-hub](https://github.com/huggingface/huggingface_hub) | `2.0.0` | `2.1.1` |\n| [ruff](https://github.com/astral-sh/ruff) | `0.16.9` | `0.16.10` |\n| [pydoclint](https://github.com/jsh9/pydoclint) | `0.10.0` | `0.11.0` |\n| [sphinx-autodoc-typehints](https://github.com/tox-dev/sphinx-autodoc-typehints) | `3.13.7` | `3.13.8` |\n| [charset-normalizer](https://github.com/jawah/charset_normalizer) | `3.5.1` | `3.5.2` |\n| [cuda-pathfinder](https://github.com/NVIDIA/cuda-python) | `1.8.2` | `1.8.3` |\n| [fastapi](https://github.com/fastapi/fastapi) | `0.141.1` | `0.142.2` |\n| [filelock](https://github.com/tox-dev/py-filelock) | `4.0.4` | `4.0.11` |\n| [markupsafe](https://github.com/pallets/markupsafe) | `3.0.3` | `3.0.4` |\n| [platformdirs](https://github.com/tox-dev/platformdirs) | `4.12.0` | `4.12.3` |\n| [pytz](https://github.com/stub42/pytz) | `2026.4` | `2026.5` |\n| [tzdata](https://github.com/python/tzdata) | `2026.4` | `2026.5` |\n| [virtualenv](https://github.com/pypa/virtualenv) | `21.13.0` | `21.14.5` |\n\nUpdates `torch` from 2.14.0 to 2.14.1\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pytorch/pytorch/releases\"\u003etorch's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ePyTorch 2.14.1 Release\u003c/h2\u003e\n\u003cp\u003eThis release is meant to fix the following regressions and silent correctness issues:\u003c/p\u003e\n\u003ch2\u003eSilent correctness fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eFix incorrect \u003ccode\u003etorch.linalg.lstsq\u003c/code\u003e solutions on MPS for complex batched underdetermined systems (\u003ca href=\"https://redirect.github.com/pytorch/pytorch/issues/196113\"\u003e#196113\u003c/a\u003e), fixed by \u003ca href=\"https://redirect.github.com/pytorch/pytorch/pull/196128\"\u003e#196128\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix non-orthogonal \u003ccode\u003eU\u003c/code\u003e and inaccurate small singular values from \u003ccode\u003etorch.linalg.svd\u003c/code\u003e on MPS for rank-deficient and ill-conditioned inputs (\u003ca href=\"https://redirect.github.com/pytorch/pytorch/issues/196112\"\u003e#196112\u003c/a\u003e), fixed by \u003ca href=\"https://redirect.github.com/pytorch/pytorch/pull/196139\"\u003e#196139\u003c/a\u003e and \u003ca href=\"https://redirect.github.com/pytorch/pytorch/pull/199063\"\u003e#199063\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUpdate the CUDA 13.2 Linux binaries to CUDA 13.2.2 (\u003ca href=\"https://redirect.github.com/pytorch/pytorch/pull/196351\"\u003e#196351\u003c/a\u003e). This NVIDIA update resolves two critical issues that could produce incorrect results (\u003ca href=\"https://docs.nvidia.com/cuda/archive/13.2.2/cuda-toolkit-release-notes/index.html#overview\"\u003eCUDA 13.2.2 release notes\u003c/a\u003e):\n\u003cul\u003e\n\u003cli\u003ecuBLAS: \u003ccode\u003ecublasLtMatmul()\u003c/code\u003e could ignore tensor-wide scaling for NVFP4 matrix multiplications (introduced in CUDA 13.2 Update 1)\u003c/li\u003e\n\u003cli\u003eCompiler: failed thread reconvergence could leave stale or corrupted register values in kernels with nested thread divergence (present since CUDA 12.8)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eRegression fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eFix \u003ccode\u003etorch.linalg.svd\u003c/code\u003e, \u003ccode\u003etorch.linalg.svdvals\u003c/code\u003e and \u003ccode\u003etorch.linalg.lstsq\u003c/code\u003e failing on MPS with a Metal pipeline-state error for inputs above 8192 elements (\u003ca href=\"https://redirect.github.com/pytorch/pytorch/issues/195937\"\u003e#195937\u003c/a\u003e), fixed by \u003ca href=\"https://redirect.github.com/pytorch/pytorch/pull/195949\"\u003e#195949\u003c/a\u003e and \u003ca href=\"https://redirect.github.com/pytorch/pytorch/pull/195950\"\u003e#195950\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix internal assert in \u003ccode\u003etorch.svd(out=)\u003c/code\u003e on MPS for complex inputs (\u003ca href=\"https://redirect.github.com/pytorch/pytorch/issues/195822\"\u003e#195822\u003c/a\u003e), fixed by \u003ca href=\"https://redirect.github.com/pytorch/pytorch/pull/195872\"\u003e#195872\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytorch/pytorch/commit/5c4886908584029761b579af026dcfb627c84070\"\u003e\u003ccode\u003e5c48869\u003c/code\u003e\u003c/a\u003e [MPS] Fix Jacobi SVD convergence for small columns (\u003ca href=\"https://redirect.github.com/pytorch/pytorch/issues/199086\"\u003e#199086\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytorch/pytorch/commit/35223a275e49a6154269e19ac34b7fdd9709d031\"\u003e\u003ccode\u003e35223a2\u003c/code\u003e\u003c/a\u003e [release/2.14] Run the release runner-group reconcile in pytorch/pytorch (\u003ca href=\"https://redirect.github.com/pytorch/pytorch/issues/19\"\u003e#19\u003c/a\u003e...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytorch/pytorch/commit/41ffbc4a994e058af9fe00ed5caba73fc1033359\"\u003e\u003ccode\u003e41ffbc4\u003c/code\u003e\u003c/a\u003e [release-only] Update version to 2.14.1 (\u003ca href=\"https://redirect.github.com/pytorch/pytorch/issues/198661\"\u003e#198661\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytorch/pytorch/commit/e8f0c016eefa7870720d625f4e71bb6265d6c5c0\"\u003e\u003ccode\u003ee8f0c01\u003c/code\u003e\u003c/a\u003e [release/2.14] [CD] Update to CUDA 13.2.2 for Linux binaries (\u003ca href=\"https://redirect.github.com/pytorch/pytorch/issues/198644\"\u003e#198644\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pytorch/pytorch/commit/911665dcb02655bac5948e5ced8d8232372d9941\"\u003e\u003ccode\u003e911665d\u003c/code\u003e\u003c/a\u003e [MPS] Cherry-pick native SVD fixes into release/2.14 (\u003ca href=\"https://redirect.github.com/pytorch/pytorch/issues/198394\"\u003e#198394\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/pytorch/pytorch/compare/v2.14.0...v2.14.1\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `huggingface-hub` from 2.0.0 to 2.1.1\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/huggingface/huggingface_hub/releases\"\u003ehuggingface-hub's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev2.1.1\u003c/h2\u003e\n\u003cp\u003e[CLI] Rename 'hf spaces zero-gpu-quota' to 'hf spaces zero-gpu quota'- \u003ca href=\"https://redirect.github.com/huggingface/huggingface_hub/issues/5055\"\u003e#5055\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/huggingface/huggingface_hub/compare/v2.1.0...v2.1.1\"\u003ehttps://github.com/huggingface/huggingface_hub/compare/v2.1.0...v2.1.1\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e[v2.1.0] Better Jobs tooling, ZeroGPU quota tracking, and revamped Model Catalog\u003c/h2\u003e\n\u003ch2\u003e📊 Jobs: retries, rescheduling, and port exposure\u003c/h2\u003e\n\u003cp\u003eHugging Face Jobs get a batch of quality-of-life improvements this release. Jobs can now retry automatically on failure with the new \u003ccode\u003eattempts\u003c/code\u003e parameter, and you can start a fresh Job from an existing Job's saved spec (including secrets and hardware settings) with \u003ccode\u003ererun_job\u003c/code\u003e / \u003ccode\u003ehf jobs rerun\u003c/code\u003e. Scheduled Jobs can be rescheduled — change the cron expression or preset without recreating the Job — via \u003ccode\u003eupdate_scheduled_job_schedule\u003c/code\u003e / \u003ccode\u003ehf jobs scheduled reschedule\u003c/code\u003e. Finally, you can now expose ports on Jobs: use \u003ccode\u003eexpose\u003c/code\u003e for token-protected access and \u003ccode\u003eexpose_public\u003c/code\u003e for unauthenticated access, both at creation time and on a running Job with \u003ccode\u003eupdate_job_expose\u003c/code\u003e / \u003ccode\u003ehf jobs expose\u003c/code\u003e.\u003c/p\u003e\n\u003cpre lang=\"bash\"\u003e\u003ccode\u003e# Retry a job up to 2 times on failure, and rerun it later from its saved spec\r\n\u0026gt;\u0026gt;\u0026gt; hf jobs run --attempts 3 --detach python:3.12 python train.py\r\n\u0026gt;\u0026gt;\u0026gt; hf jobs rerun \u0026lt;job_id\u0026gt;\r\n\u003ch1\u003eReschedule a scheduled job to run every day at 9:00\u003c/h1\u003e\n\u003cp\u003e\u0026gt;\u0026gt;\u0026gt; hf jobs scheduled reschedule \u0026lt;scheduled_job_id\u0026gt; \u0026quot;0 9 * * 1\u0026quot;\u003c/p\u003e\n\u003ch1\u003eExpose ports on a running Job (8000 token-protected, 9000 public)\u003c/h1\u003e\n\u003cp\u003e\u0026gt;\u0026gt;\u0026gt; hf jobs expose \u0026lt;job_id\u0026gt; 8000 --public 9000\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e[Jobs] Add rerun and retry attempts by \u003ca href=\"https://github.com/Wauplin\"\u003e\u003ccode\u003e@​Wauplin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/huggingface/huggingface_hub/issues/5025\"\u003e#5025\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[Jobs] Allow rescheduling scheduled jobs by \u003ca href=\"https://github.com/Wauplin\"\u003e\u003ccode\u003e@​Wauplin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/huggingface/huggingface_hub/issues/5026\"\u003e#5026\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[Jobs] Manage public and private exposed ports by \u003ca href=\"https://github.com/Wauplin\"\u003e\u003ccode\u003e@​Wauplin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/huggingface/huggingface_hub/issues/5027\"\u003e#5027\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e📚 \u003cstrong\u003eDocumentation:\u003c/strong\u003e \u003ca href=\"https://huggingface.co/docs/huggingface_hub/main/en/guides/jobs\"\u003eJobs guide\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e🤗 Track your ZeroGPU quota\u003c/h2\u003e\n\u003cp\u003eThe Hub now exposes a ZeroGPU quota endpoint, and \u003ccode\u003ehuggingface_hub\u003c/code\u003e wraps it with a new \u003ccode\u003eHfApi.get_zero_gpu_quota()\u003c/code\u003e method returning a \u003ccode\u003eZeroGpuQuota\u003c/code\u003e dataclass (values in GPU-seconds). This is particularly useful for apps, MCP servers and agents built on top of ZeroGPU Spaces: check how much quota is left and when it resets, and warn your users before they hit the daily limit. The same information is available from the CLI with \u003ccode\u003ehf spaces zero-gpu-quota\u003c/code\u003e, which also prints a hint to purchase credits when the quota is running low.\u003c/p\u003e\n\u003cpre lang=\"python\"\u003e\u003ccode\u003e\u0026gt;\u0026gt;\u0026gt; from huggingface_hub import get_zero_gpu_quota\r\n\u0026gt;\u0026gt;\u0026gt; quota = get_zero_gpu_quota()\r\nZeroGpuQuota(base=2400, remaining=1810, resets_at=datetime.datetime(2026, 9, 30, 9, 12, 3, tzinfo=datetime.timezone.utc), overquota_used=0)\r\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre lang=\"bash\"\u003e\u003ccode\u003e\u0026gt;\u0026gt;\u0026gt; hf spaces zero-gpu quota\r\n✓ ZeroGPU quota (in GPU-seconds)\r\n  remaining: 1810\r\n  base: 2400\r\n  resets_at: 2026-09-30T18:12:03+00:00\r\n  overquota_used: 0\r\n\u003c/code\u003e\u003c/pre\u003e\n\u003cul\u003e\n\u003cli\u003e[Spaces] Add get_zero_gpu_quota and hf spaces zero-gpu-quota by \u003ca href=\"https://github.com/Wauplin\"\u003e\u003ccode\u003e@​Wauplin\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/huggingface/huggingface_hub/issues/5040\"\u003e#5040\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[CLI] Rename 'hf spaces zero-gpu-quota' to 'hf spaces zero-gpu quota'- \u003ca href=\"https://redirect.github.com/huggingface/huggingface_hub/issues/5055\"\u003e#5055\u003c/a\u003e \u003cstrong\u003e[Shipped as part of v2.1.1]\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/huggingface/huggingface_hub/commit/bd4a76030582d118e28dc9ad6c7a5911ea76176b\"\u003e\u003ccode\u003ebd4a760\u003c/code\u003e\u003c/a\u003e Release: v2.1.1\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/huggingface/huggingface_hub/commit/cb1755f353eec5d1048e6be112f5b3502492bcde\"\u003e\u003ccode\u003ecb1755f\u003c/code\u003e\u003c/a\u003e [CLI] Rename 'hf spaces zero-gpu-quota' to 'hf spaces zero-gpu quota' (\u003ca href=\"https://redirect.github.com/huggingface/huggingface_hub/issues/5055\"\u003e#5055\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/huggingface/huggingface_hub/commit/43372b60841b5b9ee2724e1c9c19c3fede6d54b6\"\u003e\u003ccode\u003e43372b6\u003c/code\u003e\u003c/a\u003e Release: v2.1.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/huggingface/huggingface_hub/commit/efa122c2cf1376230846da3a563254930828c424\"\u003e\u003ccode\u003eefa122c\u003c/code\u003e\u003c/a\u003e Release: v2.1.0.rc0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/huggingface/huggingface_hub/commit/0b26b50b61e01b5bcf69dd6ef6d9c3c847075b36\"\u003e\u003ccode\u003e0b26b50\u003c/code\u003e\u003c/a\u003e [Spaces] Add get_zero_gpu_quota and hf spaces zero-gpu-quota (\u003ca href=\"https://redirect.github.com/huggingface/huggingface_hub/issues/5040\"\u003e#5040\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/huggingface/huggingface_hub/commit/604252e46e9eb59ca4b88b71f511dc6ba944350f\"\u003e\u003ccode\u003e604252e\u003c/code\u003e\u003c/a\u003e [HfApi] Add visibility to create_bucket (\u003ca href=\"https://redirect.github.com/huggingface/huggingface_hub/issues/5053\"\u003e#5053\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/huggingface/huggingface_hub/commit/4c88ea6e0f322bb866c6735abd350631bcc4e8cf\"\u003e\u003ccode\u003e4c88ea6\u003c/code\u003e\u003c/a\u003e [Repos] Warn when duplicated repo files are still being copied (\u003ca href=\"https://redirect.github.com/huggingface/huggingface_hub/issues/5041\"\u003e#5041\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/huggingface/huggingface_hub/commit/3bb08e20a3df06a9c3b2b93fe716c2f7dd8b8b2d\"\u003e\u003ccode\u003e3bb08e2\u003c/code\u003e\u003c/a\u003e [Endpoints] Migrate catalog to the new /api/v1 API (\u003ca href=\"https://redirect.github.com/huggingface/huggingface_hub/issues/4928\"\u003e#4928\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/huggingface/huggingface_hub/commit/b5e3a129cea92b2d129c580f38526d95ec4e0d0b\"\u003e\u003ccode\u003eb5e3a12\u003c/code\u003e\u003c/a\u003e [HfApi] Support resource_group_id in duplicate_repo (\u003ca href=\"https://redirect.github.com/huggingface/huggingface_hub/issues/5038\"\u003e#5038\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/huggingface/huggingface_hub/commit/60fdb08c559dbda4a9087dfc56765f6ecd4895a1\"\u003e\u003ccode\u003e60fdb08\u003c/code\u003e\u003c/a\u003e [Docs] Fix duplicated words in docstring and comments (\u003ca href=\"https://redirect.github.com/huggingface/huggingface_hub/issues/5052\"\u003e#5052\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/huggingface/huggingface_hub/compare/v2.0.0...v2.1.1\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `ruff` from 0.16.9 to 0.16.10\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/astral-sh/ruff/releases\"\u003eruff's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e0.16.10\u003c/h2\u003e\n\u003ch2\u003eRelease Notes\u003c/h2\u003e\n\u003cp\u003eReleased on 2026-10-01.\u003c/p\u003e\n\u003ch3\u003ePreview features\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAdd a migration guide for categories (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28087\"\u003e#28087\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e[\u003ccode\u003epyupgrade\u003c/code\u003e] Add rule for context manager iterator annotations (\u003ccode\u003eUP052\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29000\"\u003e#29000\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003ePerformance\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eReduce memory used by diagnostics (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28951\"\u003e#28951\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eServer\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAvoid running \u003ccode\u003euv format\u003c/code\u003e in untrusted workspaces (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28873\"\u003e#28873\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eDocumentation\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eFix links to moved changelog sections and renamed mdtests (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28941\"\u003e#28941\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd Python 3.15 as a supported version (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28907\"\u003e#28907\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd ty as a type checker example (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28906\"\u003e#28906\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eOther changes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eUpdate Rust toolchain to 1.99 and MSRV to 1.97 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29047\"\u003e#29047\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eContributors\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/ntBre\"\u003e\u003ccode\u003e@​ntBre\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/spaceone\"\u003e\u003ccode\u003e@​spaceone\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HardMax71\"\u003e\u003ccode\u003e@​HardMax71\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/charliermarsh\"\u003e\u003ccode\u003e@​charliermarsh\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eInstall ruff 0.16.10\u003c/h2\u003e\n\u003ch3\u003eInstall prebuilt binaries via shell script\u003c/h3\u003e\n\u003cpre lang=\"sh\"\u003e\u003ccode\u003ecurl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/ruff/releases/download/0.16.10/ruff-installer.sh | sh\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch3\u003eInstall prebuilt binaries via powershell script\u003c/h3\u003e\n\u003cpre lang=\"sh\"\u003e\u003ccode\u003epowershell -ExecutionPolicy Bypass -c \u0026quot;irm https://releases.astral.sh/github/ruff/releases/download/0.16.10/ruff-installer.ps1 | iex\u0026quot;\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch2\u003eDownload ruff 0.16.10\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/astral-sh/ruff/blob/0.16.10/CHANGELOG.md\"\u003eruff's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e0.16.10\u003c/h2\u003e\n\u003cp\u003eReleased on 2026-10-01.\u003c/p\u003e\n\u003ch3\u003ePreview features\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAdd a migration guide for categories (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28087\"\u003e#28087\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e[\u003ccode\u003epyupgrade\u003c/code\u003e] Add rule for context manager iterator annotations (\u003ccode\u003eUP052\u003c/code\u003e) (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29000\"\u003e#29000\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003ePerformance\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eReduce memory used by diagnostics (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28951\"\u003e#28951\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eServer\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAvoid running \u003ccode\u003euv format\u003c/code\u003e in untrusted workspaces (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28873\"\u003e#28873\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eDocumentation\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eFix links to moved changelog sections and renamed mdtests (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28941\"\u003e#28941\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd Python 3.15 as a supported version (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28907\"\u003e#28907\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd ty as a type checker example (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/28906\"\u003e#28906\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eOther changes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eUpdate Rust toolchain to 1.99 and MSRV to 1.97 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/pull/29047\"\u003e#29047\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eContributors\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/ntBre\"\u003e\u003ccode\u003e@​ntBre\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/spaceone\"\u003e\u003ccode\u003e@​spaceone\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/HardMax71\"\u003e\u003ccode\u003e@​HardMax71\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/charliermarsh\"\u003e\u003ccode\u003e@​charliermarsh\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/3265ed1f944c98bb4c04d632fbefb1257cdb583d\"\u003e\u003ccode\u003e3265ed1\u003c/code\u003e\u003c/a\u003e Bump version to 0.16.10 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/29055\"\u003e#29055\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/e786964450e75d904c288a1e59ae2b196d0b9c47\"\u003e\u003ccode\u003ee786964\u003c/code\u003e\u003c/a\u003e Authorize shared PR security-review workflow to publish findings (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/29052\"\u003e#29052\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/a81291e9db2f67039d159e7490b988e6c25c7a0f\"\u003e\u003ccode\u003ea81291e\u003c/code\u003e\u003c/a\u003e [ty] Defer uv workspace discovery until after project configuration (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/28525\"\u003e#28525\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/b6a74d26cbe6b45b3eb2992041714461bd4ceb5b\"\u003e\u003ccode\u003eb6a74d2\u003c/code\u003e\u003c/a\u003e [ty] Refresh uv project metadata when uv files change (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/28529\"\u003e#28529\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/41d30df6fdbe215390b3acb46e8cd4017f65580d\"\u003e\u003ccode\u003e41d30df\u003c/code\u003e\u003c/a\u003e Update Rust toolchain to 1.99 and MSRV to 1.97 (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/29047\"\u003e#29047\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/317e0a3ab75878eba6e3b78c57f73d47108e2a8e\"\u003e\u003ccode\u003e317e0a3\u003c/code\u003e\u003c/a\u003e [ty] Bound nested callable signature display (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/29049\"\u003e#29049\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/8546752d9d5dac8da78c8abba380600cfe573874\"\u003e\u003ccode\u003e8546752\u003c/code\u003e\u003c/a\u003e [ty] Fix member lookup on union-bounded type variables (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/29018\"\u003e#29018\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/56180bcf800d6e45fb1c4b4113e97501b8f128c5\"\u003e\u003ccode\u003e56180bc\u003c/code\u003e\u003c/a\u003e [ty] Specialize instance members once (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/29043\"\u003e#29043\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/aa9a1ff88aa83b3f01360ef5b3cb04b2be187206\"\u003e\u003ccode\u003eaa9a1ff\u003c/code\u003e\u003c/a\u003e [ty] Avoid stale I/O diagnostics when closing deleted files (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/28988\"\u003e#28988\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/astral-sh/ruff/commit/2d253467b5153f82d26c51d49eb8d4156f1768bf\"\u003e\u003ccode\u003e2d25346\u003c/code\u003e\u003c/a\u003e [ty] Improve \u003ccode\u003eunresolved-import\u003c/code\u003e documentation (\u003ca href=\"https://redirect.github.com/astral-sh/ruff/issues/29039\"\u003e#29039\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/astral-sh/ruff/compare/0.16.9...0.16.10\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `pydoclint` from 0.10.0 to 0.11.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/jsh9/pydoclint/releases\"\u003epydoclint's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e0.11.0\u003c/h2\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eSupport checking stub (.pyi) files by \u003ca href=\"https://github.com/jsh9\"\u003e\u003ccode\u003e@​jsh9\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/jsh9/pydoclint/pull/310\"\u003ejsh9/pydoclint#310\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/jsh9/pydoclint/compare/0.10.1...0.11.0\"\u003ehttps://github.com/jsh9/pydoclint/compare/0.10.1...0.11.0\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e0.10.1\u003c/h2\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eRewrite README and restructure docs by \u003ca href=\"https://github.com/jsh9\"\u003e\u003ccode\u003e@​jsh9\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/jsh9/pydoclint/pull/307\"\u003ejsh9/pydoclint#307\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUse stacked pytest parametrize instead of itertools.product in tests by \u003ca href=\"https://github.com/jsh9\"\u003e\u003ccode\u003e@​jsh9\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/jsh9/pydoclint/pull/308\"\u003ejsh9/pydoclint#308\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/jsh9/pydoclint/compare/0.10.0...0.10.1\"\u003ehttps://github.com/jsh9/pydoclint/compare/0.10.0...0.10.1\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/jsh9/pydoclint/blob/main/CHANGELOG.md\"\u003epydoclint's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e[0.11.0] - 2026-10-02\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eAdded\n\u003cul\u003e\n\u003cli\u003eA new config option \u003ccode\u003e--include-stub-files\u003c/code\u003e (shortform: \u003ccode\u003e-isf\u003c/code\u003e, default:\n\u003ccode\u003eFalse\u003c/code\u003e), so that scanning a folder also checks stub (\u003ccode\u003e.pyi\u003c/code\u003e) files (\u003ca href=\"https://redirect.github.com/jsh9/pydoclint/issues/303\"\u003e#303\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eFixed\n\u003cul\u003e\n\u003cli\u003eFalse-positive \u003ccode\u003eDOC403\u003c/code\u003e and \u003ccode\u003eDOC502\u003c/code\u003e violations in stub (\u003ccode\u003e.pyi\u003c/code\u003e) files,\nwhose function bodies are placeholders, in both the native mode and\n\u003cem\u003eflake8\u003c/em\u003e (\u003ca href=\"https://redirect.github.com/jsh9/pydoclint/issues/303\"\u003e#303\u003c/a\u003e). \u003ccode\u003eDOC403\u003c/code\u003e is still reported in stub files when the return\nannotation isn't a Generator/Iterator/Iterable (or is missing), because\nthen the function can't yield anything\u003c/li\u003e\n\u003cli\u003eFalse-positive \u003ccode\u003eDOC105\u003c/code\u003e and \u003ccode\u003eDOC605\u003c/code\u003e violations in stub files when\n\u003ccode\u003e--check-arg-defaults\u003c/code\u003e is \u003ccode\u003eTrue\u003c/code\u003e: an argument or class attribute whose\ndefault is the \u003ccode\u003e...\u003c/code\u003e placeholder can now be documented with any default\nvalue or none\u003c/li\u003e\n\u003cli\u003eFalse-positive \u003ccode\u003eDOC201\u003c/code\u003e violations for abstract methods and stub functions\nannotated with \u003ccode\u003eIterator[...]\u003c/code\u003e or \u003ccode\u003eIterable[...]\u003c/code\u003e whose docstrings have a\n\u0026quot;Yields\u0026quot; section (and no \u0026quot;return\u0026quot; statements in the body). Their bodies are\nplaceholders, so the \u0026quot;Yields\u0026quot; section is what shows that they yield, and\nthey don't need a \u0026quot;Returns\u0026quot; section\u003c/li\u003e\n\u003cli\u003eFalse-positive \u003ccode\u003eDOC203\u003c/code\u003e violations for abstract methods and stub functions\nannotated with \u003ccode\u003eGenerator[YieldType, SendType, ReturnType]\u003c/code\u003e whose \u0026quot;Returns\u0026quot;\nsection documents \u003ccode\u003eReturnType\u003c/code\u003e, as for a generator that both yields and\nreturns\u003c/li\u003e\n\u003cli\u003eFalse-positive \u003ccode\u003eDOC202\u003c/code\u003e violations for abstract methods and stub functions\nthat have a \u0026quot;Returns\u0026quot; section but no return annotation. (\u003ccode\u003eDOC203\u003c/code\u003e still\nreports the missing annotation when return types are checked.)\u003c/li\u003e\n\u003cli\u003eA crash (\u003ccode\u003eIndexError\u003c/code\u003e) when \u003ccode\u003e--check-arg-defaults\u003c/code\u003e is \u003ccode\u003eTrue\u003c/code\u003e and\npositional-only arguments (the ones before \u003ccode\u003e/\u003c/code\u003e) have default values. When\nit didn't crash, the defaults of positional-only arguments were ignored\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eFull diff\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jsh9/pydoclint/compare/0.10.1...0.11.0\"\u003ehttps://github.com/jsh9/pydoclint/compare/0.10.1...0.11.0\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e[0.10.1] - 2026-09-27\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eChanged\n\u003cul\u003e\n\u003cli\u003eRewrote the README and restructured the docs\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eFixed\n\u003cul\u003e\n\u003cli\u003eStale docs content and the broken \u003ccode\u003eDOC103\u003c/code\u003e/\u003ccode\u003eDOC603\u003c/code\u003e docs link\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eAdded\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003edocs/llms.txt\u003c/code\u003e and a pre-commit check for orphan docs and broken links\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eMaintenance\n\u003cul\u003e\n\u003cli\u003eReplaced \u003ccode\u003eitertools.product\u003c/code\u003e with stacked \u003ccode\u003e@pytest.mark.parametrize\u003c/code\u003e\ndecorators in \u003ccode\u003etests/test_main.py\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eFull diff\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jsh9/pydoclint/compare/0.10.0...0.10.1\"\u003ehttps://github.com/jsh9/pydoclint/compare/0.10.0...0.10.1\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jsh9/pydoclint/commit/24412c5f73ad438a08146132ea86a9a72c8bd5ad\"\u003e\u003ccode\u003e24412c5\u003c/code\u003e\u003c/a\u003e Support checking stub (.pyi) files (\u003ca href=\"https://redirect.github.com/jsh9/pydoclint/issues/310\"\u003e#310\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jsh9/pydoclint/commit/e0aeee36ac994cefd38eefca3d073fcb2154bc76\"\u003e\u003ccode\u003ee0aeee3\u003c/code\u003e\u003c/a\u003e Use stacked pytest parametrize instead of itertools.product in tests (\u003ca href=\"https://redirect.github.com/jsh9/pydoclint/issues/308\"\u003e#308\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jsh9/pydoclint/commit/f87ba10fa90523310352dd2ccf153690b2271e8d\"\u003e\u003ccode\u003ef87ba10\u003c/code\u003e\u003c/a\u003e Rewrite README and restructure docs (\u003ca href=\"https://redirect.github.com/jsh9/pydoclint/issues/307\"\u003e#307\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/jsh9/pydoclint/compare/0.10.0...0.11.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `sphinx-autodoc-typehints` from 3.13.7 to 3.13.8\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/sphinx-autodoc-typehints/releases\"\u003esphinx-autodoc-typehints's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e3.13.8\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e🐛 fix(resolver): resolve guarded class imports by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/sphinx-autodoc-typehints/pull/775\"\u003etox-dev/sphinx-autodoc-typehints#775\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/tox-dev/sphinx-autodoc-typehints/compare/3.13.7...3.13.8\"\u003ehttps://github.com/tox-dev/sphinx-autodoc-typehints/compare/3.13.7...3.13.8\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/sphinx-autodoc-typehints/commit/0a96a6c93ff7a407f991b29741b24f4a62de28a5\"\u003e\u003ccode\u003e0a96a6c\u003c/code\u003e\u003c/a\u003e 🐛 fix(resolver): resolve guarded class imports (\u003ca href=\"https://redirect.github.com/tox-dev/sphinx-autodoc-typehints/issues/775\"\u003e#775\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/sphinx-autodoc-typehints/commit/d794732b9b70111eb3e927d6543b9496ec17b7a3\"\u003e\u003ccode\u003ed794732\u003c/code\u003e\u003c/a\u003e build(deps): bump astral-sh/setup-uv from 10.1.0 to 10.2.0 in the github-acti...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/sphinx-autodoc-typehints/commit/6dc6c4ed83e761f4cf197f3fdf1b0a86f0e1ea0e\"\u003e\u003ccode\u003e6dc6c4e\u003c/code\u003e\u003c/a\u003e [pre-commit.ci] pre-commit autoupdate (\u003ca href=\"https://redirect.github.com/tox-dev/sphinx-autodoc-typehints/issues/773\"\u003e#773\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/sphinx-autodoc-typehints/commit/9627932044b7b755111f96e98e1b6f2028e1ef47\"\u003e\u003ccode\u003e9627932\u003c/code\u003e\u003c/a\u003e build(deps): bump astral-sh/setup-uv from 10.0.1 to 10.1.0 in the github-acti...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/sphinx-autodoc-typehints/commit/bd0036699d2ecba4e00f5c49b327fd4626cf779f\"\u003e\u003ccode\u003ebd00366\u003c/code\u003e\u003c/a\u003e [pre-commit.ci] pre-commit autoupdate (\u003ca href=\"https://redirect.github.com/tox-dev/sphinx-autodoc-typehints/issues/771\"\u003e#771\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/tox-dev/sphinx-autodoc-typehints/compare/3.13.7...3.13.8\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `charset-normalizer` from 3.5.1 to 3.5.2\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/jawah/charset_normalizer/releases\"\u003echarset-normalizer's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003eVersion 3.5.2\u003c/h2\u003e\n\u003ch2\u003e\u003ca href=\"https://github.com/Ousret/charset_normalizer/compare/3.5.1...3.5.2\"\u003e3.5.2\u003c/a\u003e (2026-09-29)\u003c/h2\u003e\n\u003ch3\u003eChanged\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eRaised the Cython upper bound to \u003ccode\u003e\u0026lt;3.4\u003c/code\u003e for native builds. The bound remains \u003ccode\u003e\u0026lt;3.3\u003c/code\u003e for\n\u003ccode\u003eabi3\u003c/code\u003e builds to preserve compatibility with the Python 3.7 Limited API.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eFixed\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eValid UTF-8 Chinese JSON incorrectly detected as PTCP154 due to excessive noise penalties\nfor uncommon CJK characters. (\u003ca href=\"https://redirect.github.com/jawah/charset_normalizer/issues/796\"\u003e#796\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupported encodings without aliases failing name resolution or being ignored in charset\ndeclarations. (\u003ca href=\"https://redirect.github.com/jawah/charset_normalizer/issues/800\"\u003e#800\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/jawah/charset_normalizer/blob/master/CHANGELOG.md\"\u003echarset-normalizer's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e\u003ca href=\"https://github.com/Ousret/charset_normalizer/compare/3.5.1...3.5.2\"\u003e3.5.2\u003c/a\u003e (2026-09-29)\u003c/h2\u003e\n\u003ch3\u003eChanged\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eRaised the Cython upper bound to \u003ccode\u003e\u0026lt;3.4\u003c/code\u003e for native builds. The bound remains \u003ccode\u003e\u0026lt;3.3\u003c/code\u003e for\n\u003ccode\u003eabi3\u003c/code\u003e builds to preserve compatibility with the Python 3.7 Limited API.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eFixed\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eValid UTF-8 Chinese JSON incorrectly detected as PTCP154 due to excessive noise penalties\nfor uncommon CJK characters. (\u003ca href=\"https://redirect.github.com/jawah/charset_normalizer/issues/796\"\u003e#796\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupported encodings without aliases failing name resolution or being ignored in charset\ndeclarations. (\u003ca href=\"https://redirect.github.com/jawah/charset_normalizer/issues/800\"\u003e#800\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jawah/charset_normalizer/commit/935c29ad2d0d6e62fcf3a6e0617c55dc6e85db8f\"\u003e\u003ccode\u003e935c29a\u003c/code\u003e\u003c/a\u003e Release 3.5.2 (\u003ca href=\"https://redirect.github.com/jawah/charset_normalizer/issues/805\"\u003e#805\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jawah/charset_normalizer/commit/9d3238a7ae9676e05ee1da5da826297b374f2282\"\u003e\u003ccode\u003e9d3238a\u003c/code\u003e\u003c/a\u003e test: disable traefik in downstream niquests\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jawah/charset_normalizer/commit/b4c0368fdc9183b8e77e39d865328a4a40103750\"\u003e\u003ccode\u003eb4c0368\u003c/code\u003e\u003c/a\u003e docs: write changelog entry for 3.5.2\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jawah/charset_normalizer/commit/717da3108bf90d979c1485ae55c0b11f2eab650b\"\u003e\u003ccode\u003e717da31\u003c/code\u003e\u003c/a\u003e chore: bump version to 3.5.2\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jawah/charset_normalizer/commit/264895d4e9313b088c9698f5394278a3c7ab58a7\"\u003e\u003ccode\u003e264895d\u003c/code\u003e\u003c/a\u003e chore: update pypa/cibuildwheel and pypa/gh-action-pypi-publish\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jawah/charset_normalizer/commit/41e28b6cb19d7ec85560f869cbc2a599c8fc855b\"\u003e\u003ccode\u003e41e28b6\u003c/code\u003e\u003c/a\u003e chore: raise Cython upper bound to 3.3\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jawah/charset_normalizer/commit/b130b7dae36658c7ba67381fe06a62c7c7c03894\"\u003e\u003ccode\u003eb130b7d\u003c/code\u003e\u003c/a\u003e Fix valid UTF-8 Chinese JSON misdetected as PTCP154 (\u003ca href=\"https://redirect.github.com/jawah/charset_normalizer/issues/796\"\u003e#796\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jawah/charset_normalizer/commit/f6afd31c54fe20524f96be00de3bcb0e81727526\"\u003e\u003ccode\u003ef6afd31\u003c/code\u003e\u003c/a\u003e Make the IANA_NO_ALIASES encodings resolvable by name (\u003ca href=\"https://redirect.github.com/jawah/charset_normalizer/issues/800\"\u003e#800\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/jawah/charset_normalizer/compare/3.5.1...3.5.2\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `cuda-pathfinder` from 1.8.2 to 1.8.3\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/NVIDIA/cuda-python/releases\"\u003ecuda-pathfinder's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ecuda-pathfinder v1.8.3\u003c/h2\u003e\n\u003ch2\u003eRelease notes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://nvidia.github.io/cuda-python/cuda-pathfinder/latest/release/1.8.3-notes.html\"\u003ehttps://nvidia.github.io/cuda-python/cuda-pathfinder/latest/release/1.8.3-notes.html\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eDocumentation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://nvidia.github.io/cuda-python/cuda-pathfinder/1.8.3/\"\u003ehttps://nvidia.github.io/cuda-python/cuda-pathfinder/1.8.3/\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ePyPI\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://pypi.org/project/cuda-pathfinder/1.8.3/\"\u003ehttps://pypi.org/project/cuda-pathfinder/1.8.3/\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eConda\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://anaconda.org/conda-forge/cuda-pathfinder/files?version=1.8.3\"\u003ehttps://anaconda.org/conda-forge/cuda-pathfinder/files?version=1.8.3\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003econda install conda-forge::cuda-pathfinder=1.8.3\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/NVIDIA/cuda-python/commit/308e4e17991fa9cc8fd5d9ac76619317f948b3e6\"\u003e\u003ccode\u003e308e4e1\u003c/code\u003e\u003c/a\u003e docs(pathfinder): add 1.8.3 release notes (\u003ca href=\"https://redirect.github.com/NVIDIA/cuda-python/issues/2991\"\u003e#2991\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/NVIDIA/cuda-python/commit/61690ff8c3e8b96d1bf1421b346489f9af49dbd2\"\u003e\u003ccode\u003e61690ff\u003c/code\u003e\u003c/a\u003e test: drop heavy test dependency (matplotlib) (\u003ca href=\"https://redirect.github.com/NVIDIA/cuda-python/issues/2990\"\u003e#2990\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/NVIDIA/cuda-python/commit/45a4cedbe589ec6a17d3efb40317f028efaff68e\"\u003e\u003ccode\u003e45a4ced\u003c/code\u003e\u003c/a\u003e cuda.core: require a cuda-bindings floor and call the driver through its reso...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/NVIDIA/cuda-python/commit/2e976bf75ae48d025077d28fcbdfeffcfa067f6b\"\u003e\u003ccode\u003e2e976bf\u003c/code\u003e\u003c/a\u003e ci: generate ci pipeline diagram from Mermaid (\u003ca href=\"https://redirect.github.com/NVIDIA/cuda-python/issues/2957\"\u003e#2957\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/NVIDIA/cuda-python/commit/5fbfc6d04d1a26200e34c33e9dd3c8fbfe4d61fe\"\u003e\u003ccode\u003e5fbfc6d\u003c/code\u003e\u003c/a\u003e build(deps): bump the actions-monthly group with 5 updates (\u003ca href=\"https://redirect.github.com/NVIDIA/cuda-python/issues/2983\"\u003e#2983\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/NVIDIA/cuda-python/commit/48f55a33132e6278da323b90688910c0975ea6ff\"\u003e\u003ccode\u003e48f55a3\u003c/code\u003e\u003c/a\u003e Add cusparseLt_13.dll (\u003ca href=\"https://redirect.github.com/NVIDIA/cuda-python/issues/2982\"\u003e#2982\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/NVIDIA/cuda-python/commit/52e162bbc6c83e31abc88abd1eab4261e71c6ec9\"\u003e\u003ccode\u003e52e162b\u003c/code\u003e\u003c/a\u003e Closes \u003ca href=\"https://redirect.github.com/NVIDIA/cuda-python/issues/2975\"\u003e#2975\u003c/a\u003e (\u003ca href=\"https://redirect.github.com/NVIDIA/cuda-python/issues/2976\"\u003e#2976\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/NVIDIA/cuda-python/commit/f58b50799d9d8a77973d1340da84d27c39484d40\"\u003e\u003ccode\u003ef58b507\u003c/code\u003e\u003c/a\u003e [doc-only] Add release notes about removed \u003ccode\u003ereserved\u003c/code\u003e members (\u003ca href=\"https://redirect.github.com/NVIDIA/cuda-python/issues/2972\"\u003e#2972\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/NVIDIA/cuda-python/commit/cdaa23aff3a8e4e059f3568ec511077aec0adb7d\"\u003e\u003ccode\u003ecdaa23a\u003c/code\u003e\u003c/a\u003e [doc-only] Update Cython layer and ABI stability information (\u003ca href=\"https://redirect.github.com/NVIDIA/cuda-python/issues/2977\"\u003e#2977\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/NVIDIA/cuda-python/commit/254fa4a96d99c27eca0c951026b03a4bb977802c\"\u003e\u003ccode\u003e254fa4a\u003c/code\u003e\u003c/a\u003e Refresh CUDA 13.4 bindings (cybind !561, !574, !580) (\u003ca href=\"https://redirect.github.com/NVIDIA/cuda-python/issues/2953\"\u003e#2953\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/NVIDIA/cuda-python/compare/cuda-pathfinder-v1.8.2...cuda-pathfinder-v1.8.3\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `fastapi` from 0.141.1 to 0.142.2\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/fastapi/fastapi/releases\"\u003efastapi's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e0.142.2\u003c/h2\u003e\n\u003ch3\u003eFixes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e🐛 Allow startup when automatic OpenTelemetry configuration fails. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16418\"\u003e#16418\u003c/a\u003e by \u003ca href=\"https://github.com/tiangolo\"\u003e\u003ccode\u003e@​tiangolo\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e0.142.1\u003c/h2\u003e\n\u003ch3\u003eFixes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e🐛 Fix repeated endpoint wrapping in included routers. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16414\"\u003e#16414\u003c/a\u003e by \u003ca href=\"https://github.com/tiangolo\"\u003e\u003ccode\u003e@​tiangolo\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e0.142.0\u003c/h2\u003e\n\u003ch3\u003eFeatures\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e✨ Add native OpenTelemetry support. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16403\"\u003e#16403\u003c/a\u003e by \u003ca href=\"https://github.com/tiangolo\"\u003e\u003ccode\u003e@​tiangolo\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eRefactors\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e📱 Improve mobile responsiveness of conference rail. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16196\"\u003e#16196\u003c/a\u003e by \u003ca href=\"https://github.com/alejsdev\"\u003e\u003ccode\u003e@​alejsdev\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e♻️ Remove conf section and add event banner. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16193\"\u003e#16193\u003c/a\u003e by \u003ca href=\"https://github.com/alejsdev\"\u003e\u003ccode\u003e@​alejsdev\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eDocs\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e🔥 Remove unused image. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16195\"\u003e#16195\u003c/a\u003e by \u003ca href=\"https://github.com/alejsdev\"\u003e\u003ccode\u003e@​alejsdev\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🐛 Use buttons for Termynal controls. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16132\"\u003e#16132\u003c/a\u003e by \u003ca href=\"https://github.com/tiangolo\"\u003e\u003ccode\u003e@​tiangolo\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eTranslations\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e🌐 Update translations for hi (update-outdated). PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16212\"\u003e#16212\u003c/a\u003e by \u003ca href=\"https://github.com/apps/pr-submit\"\u003e\u003ccode\u003e@​pr-submit[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🌐 Update translations for ru (update-outdated). PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16210\"\u003e#16210\u003c/a\u003e by \u003ca href=\"https://github.com/apps/pr-submit\"\u003e\u003ccode\u003e@​pr-submit[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🌐 Update translations for zh-hant (update-outdated). PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16211\"\u003e#16211\u003c/a\u003e by \u003ca href=\"https://github.com/apps/pr-submit\"\u003e\u003ccode\u003e@​pr-submit[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🌐 Update translations for uk (update-outdated). PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16208\"\u003e#16208\u003c/a\u003e by \u003ca href=\"https://github.com/apps/pr-submit\"\u003e\u003ccode\u003e@​pr-submit[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🌐 Update translations for de (update-outdated). PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16209\"\u003e#16209\u003c/a\u003e by \u003ca href=\"https://github.com/apps/pr-submit\"\u003e\u003ccode\u003e@​pr-submit[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🌐 Update translations for tr (update-outdated). PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16207\"\u003e#16207\u003c/a\u003e by \u003ca href=\"https://github.com/apps/pr-submit\"\u003e\u003ccode\u003e@​pr-submit[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🌐 Update translations for ja (update-outdated). PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16206\"\u003e#16206\u003c/a\u003e by \u003ca href=\"https://github.com/apps/pr-submit\"\u003e\u003ccode\u003e@​pr-submit[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🌐 Update translations for fr (update-outdated). PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16205\"\u003e#16205\u003c/a\u003e by \u003ca href=\"https://github.com/apps/pr-submit\"\u003e\u003ccode\u003e@​pr-submit[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🌐 Update translations for zh (update-outdated). PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16204\"\u003e#16204\u003c/a\u003e by \u003ca href=\"https://github.com/apps/pr-submit\"\u003e\u003ccode\u003e@​pr-submit[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🌐 Update translations for es (update-outdated). PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16203\"\u003e#16203\u003c/a\u003e by \u003ca href=\"https://github.com/apps/pr-submit\"\u003e\u003ccode\u003e@​pr-submit[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🌐 Update translations for pt (update-outdated). PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16202\"\u003e#16202\u003c/a\u003e by \u003ca href=\"https://github.com/apps/pr-submit\"\u003e\u003ccode\u003e@​pr-submit[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🌐 Update translations for ko (update-outdated). PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16201\"\u003e#16201\u003c/a\u003e by \u003ca href=\"https://github.com/apps/pr-submit\"\u003e\u003ccode\u003e@​pr-submit[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🌐 Update translations for ko (update-outdated). PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16171\"\u003e#16171\u003c/a\u003e by \u003ca href=\"https://github.com/apps/pr-submit\"\u003e\u003ccode\u003e@​pr-submit[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eInternal\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e✅ Fix frontend test timeout with Starlette Git. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16408\"\u003e#16408\u003c/a\u003e by \u003ca href=\"https://github.com/YuriiMotov\"\u003e\u003ccode\u003e@​YuriiMotov\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e🔧 Update sponsors: remove Permit.io. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16406\"\u003e#16406\u003c/a\u003e by \u003ca href=\"https://github.com/tiangolo\"\u003e\u003ccode\u003e@​tiangolo\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e⬆ Bump anyio from 4.12.1 to 4.14.2. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16375\"\u003e#16375\u003c/a\u003e by \u003ca href=\"https://github.com/apps/dependabot\"\u003e\u003ccode\u003e@​dependabot[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e⬆ Bump the python-packages group across 1 directory with 15 updates. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16285\"\u003e#16285\u003c/a\u003e by \u003ca href=\"https://github.com/apps/dependabot\"\u003e\u003ccode\u003e@​dependabot[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e⬆ Bump starlette from 1.3.1 to 1.6.0. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16289\"\u003e#16289\u003c/a\u003e by \u003ca href=\"https://github.com/apps/dependabot\"\u003e\u003ccode\u003e@​dependabot[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e⬆ Bump annotated-doc from 0.0.4 to 0.0.5. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16288\"\u003e#16288\u003c/a\u003e by \u003ca href=\"https://github.com/apps/dependabot\"\u003e\u003ccode\u003e@​dependabot[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e⬆ Bump typing-inspection from 0.4.2 to 0.4.4. PR \u003ca href=\"https://redirect.github.com/fastapi/fastapi/pull/16286\"\u003e#16286\u003c/a\u003e by \u003ca href=\"https://github.com/apps/dependabot\"\u003e\u003ccode\u003e@​dependabot[bot]\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fastapi/fastapi/commit/78c4324f0c56bc5282a459978779a9e532d19709\"\u003e\u003ccode\u003e78c4324\u003c/code\u003e\u003c/a\u003e 🔖 Release version 0.142.2 (\u003ca href=\"https://redirect.github.com/fastapi/fastapi/issues/16419\"\u003e#16419\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fastapi/fastapi/commit/2579ed0d9e73205326463025cc756650f642f511\"\u003e\u003ccode\u003e2579ed0\u003c/code\u003e\u003c/a\u003e 📝 Update release notes\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fastapi/fastapi/commit/1d4953d2e528b58cfb09bbc28fb25dcda227c6ea\"\u003e\u003ccode\u003e1d4953d\u003c/code\u003e\u003c/a\u003e 🐛 Allow startup when automatic OpenTelemetry configuration fails (\u003ca href=\"https://redirect.github.com/fastapi/fastapi/issues/16418\"\u003e#16418\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fastapi/fastapi/commit/3e33a03bdaa3a89f27d5e0c390c4ba9032f14b5e\"\u003e\u003ccode\u003e3e33a03\u003c/code\u003e\u003c/a\u003e 🔖 Release version 0.142.1 (\u003ca href=\"https://redirect.github.com/fastapi/fastapi/issues/16415\"\u003e#16415\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fastapi/fastapi/commit/12ea7f5a5e76c5ba3495c2803f57ed92ac67731b\"\u003e\u003ccode\u003e12ea7f5\u003c/code\u003e\u003c/a\u003e 📝 Update release notes\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fastapi/fastapi/commit/ac88f563db5f4d3300d43355eca728c93ed9ffe2\"\u003e\u003ccode\u003eac88f56\u003c/code\u003e\u003c/a\u003e 🐛 Fix repeated endpoint wrapping in included routers (\u003ca href=\"https://redirect.github.com/fastapi/fastapi/issues/16414\"\u003e#16414\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fastapi/fastapi/commit/bd41128123fd08d693f5541e27c550eebe20f8b0\"\u003e\u003ccode\u003ebd41128\u003c/code\u003e\u003c/a\u003e 🔖 Release version 0.142.0 (\u003ca href=\"https://redirect.github.com/fastapi/fastapi/issues/16411\"\u003e#16411\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fastapi/fastapi/commit/7aa21e53c859ce52b17196b35909efca6f2fa11f\"\u003e\u003ccode\u003e7aa21e5\u003c/code\u003e\u003c/a\u003e 📝 Update release notes\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fastapi/fastapi/commit/4b3949cd9e5932f76217131fceabc74145c3db24\"\u003e\u003ccode\u003e4b3949c\u003c/code\u003e\u003c/a\u003e ✨ Add native OpenTelemetry support (\u003ca href=\"https://redirect.github.com/fastapi/fastapi/issues/16403\"\u003e#16403\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/fastapi/fastapi/commit/c30032a1b68fb36c03fffe1856369d3824607c7c\"\u003e\u003ccode\u003ec30032a\u003c/code\u003e\u003c/a\u003e 📝 Update release notes\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/fastapi/fastapi/compare/0.141.1...0.142.2\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `filelock` from 4.0.4 to 4.0.11\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/py-filelock/releases\"\u003efilelock's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e4.0.11\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003edocs: select an existing tox environment in contributing guide by \u003ca href=\"https://github.com/raghav-sharma-ai\"\u003e\u003ccode\u003e@​raghav-sharma-ai\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/767\"\u003etox-dev/filelock#767\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(read-write): handle NetBSD fd limits by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/768\"\u003etox-dev/filelock#768\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/raghav-sharma-ai\"\u003e\u003ccode\u003e@​raghav-sharma-ai\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/767\"\u003etox-dev/filelock#767\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/tox-dev/filelock/compare/4.0.10...4.0.11\"\u003ehttps://github.com/tox-dev/filelock/compare/4.0.10...4.0.11\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e4.0.10\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e♻️ refactor(util): test helpers via public locks by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/764\"\u003etox-dev/filelock#764\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(singleton): reject conflicting async and lease options by \u003ca href=\"https://github.com/kokotatan\"\u003e\u003ccode\u003e@​kokotatan\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/765\"\u003etox-dev/filelock#765\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/kokotatan\"\u003e\u003ccode\u003e@​kokotatan\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/765\"\u003etox-dev/filelock#765\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/tox-dev/filelock/compare/4.0.9...4.0.10\"\u003ehttps://github.com/tox-dev/filelock/compare/4.0.9...4.0.10\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e4.0.9\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e📝 docs(util): correct write and break guarantees by \u003ca href=\"https://github.com/pralav-25\"\u003e\u003ccode\u003e@​pralav-25\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/762\"\u003etox-dev/filelock#762\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e🐛 fix(read-write): close db fd after connect by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/763\"\u003etox-dev/filelock#763\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pralav-25\"\u003e\u003ccode\u003e@​pralav-25\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/762\"\u003etox-dev/filelock#762\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/tox-dev/filelock/compare/4.0.8...4.0.9\"\u003ehttps://github.com/tox-dev/filelock/compare/4.0.8...4.0.9\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e4.0.8\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e🐛 fix(read-write): refuse cross-thread write release by \u003ca href=\"https://github.com/feiiiiii5\"\u003e\u003ccode\u003e@​feiiiiii5\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/761\"\u003etox-dev/filelock#761\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/tox-dev/filelock/compare/4.0.7...4.0.8\"\u003ehttps://github.com/tox-dev/filelock/compare/4.0.7...4.0.8\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e4.0.7\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e🐛 fix(mode): require owner read and write by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/filelock/pull/760\"\u003etox-dev/filelock#760\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/filelock/blob/main/docs/changelog.rst\"\u003efilelock's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e###########\nChangelog\n###########\u003c/p\u003e\n\u003cp\u003e.. towncrier-draft-entries:: Unreleased\u003c/p\u003e\n\u003cp\u003e.. towncrier release notes start\u003c/p\u003e\n\u003chr /\u003e\n\u003cp\u003e4.1.1 (2026-10-11)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eBound the shared-lock contention test by worker progress so slow CI machines can finish the workload. :pr:\u003ccode\u003e819\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eAvoid the macOS \u003ccode\u003e/dev/fd\u003c/code\u003e lookup implicated in a kernel panic by opening SQLite through a validated hard link.\nThe database directory must be writable and support hard links; alias creation failure raises \u003ccode\u003eOSError\u003c/code\u003e. :pr:\u003ccode\u003e820\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eIgnore non-ASCII PID or start-time fields and out-of-range PIDs in \u003ccode\u003eReadWriteLock\u003c/code\u003e hard-link directory names so forged\nowners cannot abort acquisition. :pr:\u003ccode\u003e821\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eUse Python 3.15 for development and automation. :pr:\u003ccode\u003e816\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.1.0 (2026-10-09)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eImport :data:\u003ccode\u003e~filelock.OwnerMode\u003c/code\u003e, :data:\u003ccode\u003e~filelock.CompromiseReason\u003c/code\u003e and :data:\u003ccode\u003e~filelock.has_fcntl\u003c/code\u003e from\n\u003ccode\u003efilelock\u003c/code\u003e. :pr:\u003ccode\u003e790\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:class:\u003ccode\u003e~filelock.AcquireReturnProxy\u003c/code\u003e is generic in the lock type, so \u003ccode\u003ewith lock.acquire() as held:\u003c/code\u003e types \u003ccode\u003eheld\u003c/code\u003e as\nthe lock's own class. :pr:\u003ccode\u003e803\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eA :class:\u003ccode\u003e~filelock.Timeout\u003c/code\u003e from a soft lock names a holder on another host or in another PID namespace, which no\ncontender ever reclaims. :pr:\u003ccode\u003e815\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:attr:\u003ccode\u003e~filelock.SoftFileLock.is_lock_held_by_us\u003c/code\u003e and :attr:\u003ccode\u003e~filelock.MarkerSoftFileLock.is_lock_held_by_us\u003c/code\u003e return\n\u003ccode\u003eFalse\u003c/code\u003e for a marker an earlier process with the same PID left behind. :pr:\u003ccode\u003e774\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:class:\u003ccode\u003e~filelock.SoftFileLock\u003c/code\u003e removes its marker when writing it fails and closing the descriptor fails too, so the\nlock path no longer stays blocked. :pr:\u003ccode\u003e775\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:meth:\u003ccode\u003e~filelock.BaseFileLock.acquire\u003c/code\u003e and :meth:\u003ccode\u003e~filelock.BaseAsyncFileLock.acquire\u003c/code\u003e no longer wait past \u003ccode\u003etimeout\u003c/code\u003e\nwhen \u003ccode\u003epoll_interval\u003c/code\u003e is longer than the time left. :pr:\u003ccode\u003e777\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:class:\u003ccode\u003e~filelock.SoftReadWriteLock\u003c/code\u003e ignores a generation-log entry whose name is not 20 ASCII digits, which used to\nstop its heartbeat thread or delete real generations. :pr:\u003ccode\u003e778\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:class:\u003ccode\u003e~filelock.ReadWriteLock\u003c/code\u003e, :class:\u003ccode\u003e~filelock.SoftReadWriteLock\u003c/code\u003e and their async wrappers treat a\n:data:\u003ccode\u003emath.inf\u003c/code\u003e timeout like \u003ccode\u003e-1\u003c/code\u003e and raise :class:\u003ccode\u003eValueError\u003c/code\u003e for a blocking \u003ccode\u003enan\u003c/code\u003e one. :pr:\u003ccode\u003e779\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:class:\u003ccode\u003e~filelock.ReadWriteLock\u003c/code\u003e and :class:\u003ccode\u003e~filelock.SoftReadWriteLock\u003c/code\u003e accept a timeout above\n:data:\u003ccode\u003ethreading.TIMEOUT_MAX\u003c/code\u003e instead of raising :class:\u003ccode\u003eOverflowError\u003c/code\u003e. :pr:\u003ccode\u003e780\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:meth:\u003ccode\u003e~filelock.BaseFileLock.acquire\u003c/code\u003e raises :class:\u003ccode\u003eValueError\u003c/code\u003e for a blocking \u003ccode\u003enan\u003c/code\u003e timeout or a \u003ccode\u003epoll_interval\u003c/code\u003e\nabove :data:\u003ccode\u003ethreading.TIMEOUT_MAX\u003c/code\u003e, and treats a :data:\u003ccode\u003emath.inf\u003c/code\u003e timeout like \u003ccode\u003e-1\u003c/code\u003e. :pr:\u003ccode\u003e781\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:class:\u003ccode\u003e~filelock.SoftFileLock\u003c/code\u003e and :class:\u003ccode\u003e~filelock.MarkerSoftFileLock\u003c/code\u003e treat a marker cut before its final newline as\nmalformed, so a crash-truncated record self-heals and a read mid-write no longer breaks a live lock. :pr:\u003ccode\u003e782\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:class:\u003ccode\u003e~filelock.UnixFileLock\u003c/code\u003e no longer deletes another process's live marker when it falls back to a soft lock on\n\u003ccode\u003eENOSYS\u003c/code\u003e, and on macOS a lock path ending in a separator raises :class:\u003ccode\u003eFileNotFoundError\u003c/code\u003e instead of retrying. :pr:\u003ccode\u003e785\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:class:\u003ccode\u003e~filelock.SoftFileLock\u003c/code\u003e and :class:\u003ccode\u003e~filelock.SoftFileLease\u003c/code\u003e put back a live successor's marker that a racing\nstale break moved aside, so a third contender no longer acquires beside the successor. :pr:\u003ccode\u003e786\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e:class:\u003ccode\u003e~filelock.StrictSoftFileLock\u003c/code\u003e removes every claim a failed acquire published, counts an \u003ccode\u003eEEXIST\u003c/code\u003e link that\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/822d32b54d70027311e2190a86cb7f3c58439be4\"\u003e\u003ccode\u003e822d32b\u003c/code\u003e\u003c/a\u003e Release 4.0.11\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/47f036daea8f54e7b9b54b067e3122a05c4f5662\"\u003e\u003ccode\u003e47f036d\u003c/code\u003e\u003c/a\u003e fix(read-write): handle NetBSD fd limits\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/2e0abe5b915fbadbb1b21bc094800feb7e2b8e09\"\u003e\u003ccode\u003e2e0abe5\u003c/code\u003e\u003c/a\u003e docs: select an existing tox environment in contributing guide (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/767\"\u003e#767\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/1f0632b6bc047cf3481bbe740475be813013208e\"\u003e\u003ccode\u003e1f0632b\u003c/code\u003e\u003c/a\u003e Release 4.0.10\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/c9c65abadf1832d22e5901d6cd0e7010bd00db5c\"\u003e\u003ccode\u003ec9c65ab\u003c/code\u003e\u003c/a\u003e 🐛 fix(singleton): reject conflicting async and lease options (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/765\"\u003e#765\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/bc2405b882657b649fff86fe86ddd7883510393f\"\u003e\u003ccode\u003ebc2405b\u003c/code\u003e\u003c/a\u003e ♻️ refactor(util): test helpers via public locks (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/764\"\u003e#764\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/7b00bb81d41039f05173fb67876db196b9d8b007\"\u003e\u003ccode\u003e7b00bb8\u003c/code\u003e\u003c/a\u003e Release 4.0.9\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/49446241829b40fa2d156cae58a8433fec57f791\"\u003e\u003ccode\u003e4944624\u003c/code\u003e\u003c/a\u003e 🐛 fix(read-write): close db fd after connect (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/763\"\u003e#763\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/162060edb291d059c93c5ba41e5eb90829bf8796\"\u003e\u003ccode\u003e162060e\u003c/code\u003e\u003c/a\u003e 📝 docs(util): correct write and break guarantees (\u003ca href=\"https://redirect.github.com/tox-dev/py-filelock/issues/762\"\u003e#762\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/filelock/commit/4d45e83caf7e31f9a12fb44526bdc07f70114f04\"\u003e\u003ccode\u003e4d45e83\u003c/code\u003e\u003c/a\u003e Merge commit from fork\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/tox-dev/py-filelock/compare/4.0.4...4.0.11\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `markupsafe` from 3.0.3 to 3.0.4\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pallets/markupsafe/releases\"\u003emarkupsafe's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e3.0.4\u003c/h2\u003e\n\u003cp\u003eThis is the MarkupSafe 3.0.4 fix release, which fixes bugs but does not otherwise change behavior and should not result in breaking changes compared to the latest feature release.\u003c/p\u003e\n\u003cp\u003ePyPI: \u003ca href=\"https://pypi.org/project/MarkupSafe/3.0.4/\"\u003ehttps://pypi.org/project/MarkupSafe/3.0.4/\u003c/a\u003e\nChanges: \u003ca href=\"https://markupsafe.palletsprojects.com/page/changes/#version-3-0-4\"\u003ehttps://markupsafe.palletsprojects.com/page/changes/#version-3-0-4\u003c/a\u003e\nMilestone: \u003ca href=\"https://github.com/pallets/markupsafe/milestone/17?closed=1\"\u003ehttps://github.com/pallets/markupsafe/milestone/17?closed=1\u003c/a\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eBuild Python 3.15, armv7l, ppc64le, Android, and iOS wheels.\u003c/li\u003e\n\u003cli\u003eImprove performance of \u003ccode\u003estriptags\u003c/code\u003e. \u003ca href=\"https://redirect.github.com/pallets/markupsafe/issues/521\"\u003e#521\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pallets/markupsafe/blob/main/CHANGES.rst\"\u003emarkupsafe's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003eVersion 3.0.4\u003c/h2\u003e\n\u003cp\u003eReleased 2026-10-02\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eBuild Python 3.15, armv7l, ppc64le, Android, and iOS wheels.\u003c/li\u003e\n\u003cli\u003eImprove performance of \u003ccode\u003estriptags\u003c/code\u003e. :issue:\u003ccode\u003e521\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pallets/markupsafe/commit/ece26078ec168ebac69f02877238e68d4b376c91\"\u003e\u003ccode\u003eece2607\u003c/code\u003e\u003c/a\u003e release version 3.0.4\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pallets/markupsafe/commit/620bc809d748de3a7848bdf7e27b1c2a2903aaf5\"\u003e\u003ccode\u003e620bc80\u003c/code\u003e\u003c/a\u003e split archs\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pallets/markupsafe/commit/73c3be1596906daf3e642e51852af5a019c5e1ea\"\u003e\u003ccode\u003e73c3be1\u003c/code\u003e\u003c/a\u003e fix wheel builds (\u003ca href=\"https://redirect.github.com/pallets/markupsafe/issues/536\"\u003e#536\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pallets/markupsafe/commit/d8ae19e6e45b5512472b74fe5c60b7f6aa18d70f\"\u003e\u003ccode\u003ed8ae19e\u003c/code\u003e\u003c/a\u003e fix wheel builds\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pallets/markupsafe/commit/ff1eaff921f92db57327752bbc37472d37fb9b21\"\u003e\u003ccode\u003eff1eaff\u003c/code\u003e\u003c/a\u003e Build Android and iOS wheels (\u003ca href=\"https://redirect.github.com/pallets/markupsafe/issues/516\"\u003e#516\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pallets/markupsafe/commit/87e64f9628c574bf91898f8642a21356cccaa58c\"\u003e\u003ccode\u003e87e64f9\u003c/code\u003e\u003c/a\u003e build Android and iOS wheels\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pallets/markupsafe/commit/bc33c55cb3078ba9f9b0950babb32f8d842f1267\"\u003e\u003ccode\u003ebc33c55\u003c/code\u003e\u003c/a\u003e Build ppc64le wheels (\u003ca href=\"https://redirect.github.com/pallets/markupsafe/issues/518\"\u003e#518\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pallets/markupsafe/commit/0ddd6eac9b20df52c75fae9181c0e73e195fa8d1\"\u003e\u003ccode\u003e0ddd6ea\u003c/code\u003e\u003c/a\u003e build ppc64le wheels\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pallets/markupsafe/commit/3e0775809b92150b10d1671ce1821ea6eb56be0c\"\u003e\u003ccode\u003e3e07758\u003c/code\u003e\u003c/a\u003e Build armv7l wheels (\u003ca href=\"https://redirect.github.com/pallets/markupsafe/issues/514\"\u003e#514\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pallets/markupsafe/commit/39b9aae5f1e70edc33f380b47d1bef0e281746b5\"\u003e\u003ccode\u003e39b9aae\u003c/code\u003e\u003c/a\u003e build armv7l wheels\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/pallets/markupsafe/compare/3.0.3...3.0.4\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `platformdirs` from 4.12.0 to 4.12.3\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/platformdirs/releases\"\u003eplatformdirs's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e4.12.3\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003ePlace root config and data files in the first site directory by \u003ca href=\"https://github.com/PDGGK\"\u003e\u003ccode\u003e@​PDGGK\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/607\"\u003etox-dev/platformdirs#607\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/PDGGK\"\u003e\u003ccode\u003e@​PDGGK\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/607\"\u003etox-dev/platformdirs#607\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/tox-dev/platformdirs/compare/4.12.2...4.12.3\"\u003ehttps://github.com/tox-dev/platformdirs/compare/4.12.2...4.12.3\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e4.12.2\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e🐛 fix(api): build site paths from site lists by \u003ca href=\"https://github.com/9Kun\"\u003e\u003ccode\u003e@​9Kun\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/604\"\u003etox-dev/platformdirs#604\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e♻️ refactor(api): share use_site iteration by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/606\"\u003etox-dev/platformdirs#606\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/9Kun\"\u003e\u003ccode\u003e@​9Kun\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/604\"\u003etox-dev/platformdirs#604\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/tox-dev/platformdirs/compare/4.12.1...4.12.2\"\u003ehttps://github.com/tox-dev/platformdirs/compare/4.12.1...4.12.2\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e4.12.1\u003c/h2\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003efix(pytest): allow import before pytest startup by \u003ca href=\"https://github.com/gaborbernat\"\u003e\u003ccode\u003e@​gaborbernat\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/pull/602\"\u003etox-dev/platformdirs#602\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/tox-dev/platformdirs/compare/4.12.0...4.12.1\"\u003ehttps://github.com/tox-dev/platformdirs/compare/4.12.0...4.12.1\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/tox-dev/platformdirs/blob/main/docs/changelog.rst\"\u003eplatformdirs's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e###########\nChangelog\n###########\u003c/p\u003e\n\u003cp\u003e.. towncrier-draft-entries:: Unreleased\u003c/p\u003e\n\u003cp\u003e.. towncrier release notes start\u003c/p\u003e\n\u003chr /\u003e\n\u003cp\u003e4.13.0 (2026-10-10)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eDetect Homebrew Python for the :class:\u003ccode\u003e~platformdirs.macos.MacOS\u003c/code\u003e site directories under :option:\u003ccode\u003epython:-S\u003c/code\u003e, which\nleaves :data:\u003ccode\u003esys.base_prefix\u003c/code\u003e on the \u003ccode\u003eCellar\u003c/code\u003e keg, and for the \u003ccode\u003epython-freethreading\u003c/code\u003e formula - by\n:user:\u003ccode\u003esricharanreddycheruku\u003c/code\u003e. :pr:\u003ccode\u003e612\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eUse Python 3.15 for development and automation. :pr:\u003ccode\u003e613\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.12.4 (2026-10-07)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eKeep site directories readable by other users when root calls\n:meth:\u003ccode\u003e~platformdirs.api.PlatformDirsABC.place_config_file\u003c/code\u003e or another \u003ccode\u003eplace_*_file\u003c/code\u003e method with\n:attr:\u003ccode\u003e~platformdirs.api.PlatformDirsABC.use_site_for_root\u003c/code\u003e - by :user:\u003ccode\u003edarrenhuai\u003c/code\u003e. :pr:\u003ccode\u003e610\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eMake :func:\u003ccode\u003e~platformdirs.user_runtime_dir\u003c/code\u003e warn and fall back from an unreachable \u003ccode\u003eXDG_RUNTIME_DIR\u003c/code\u003e under\n:attr:\u003ccode\u003e~platformdirs.api.PlatformDirsABC.ensure_exists\u003c/code\u003e instead of raising. :pr:\u003ccode\u003e611\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.12.3 (2026-10-03)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003ePlace files from \u003ccode\u003eplace_config_file\u003c/code\u003e and \u003ccode\u003eplace_data_file\u003c/code\u003e in the first site directory for root on Unix with\n\u003ccode\u003euse_site_for_root=True\u003c/code\u003e and \u003ccode\u003emultipath=True\u003c/code\u003e, where \u003ccode\u003efind_config_file\u003c/code\u003e and \u003ccode\u003efind_data_file\u003c/code\u003e look for them.\n:pr:\u003ccode\u003e607\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.12.2 (2026-09-29)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eKeep \u003ccode\u003eos.pathsep\u003c/code\u003e in \u003ccode\u003esite_applications_path\u003c/code\u003e under \u003ccode\u003emultipath=True\u003c/code\u003e on platforms with one applications\ndirectory. :pr:\u003ccode\u003e604\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.12.1 (2026-09-28)\u003c/p\u003e\n\u003chr /\u003e\n\u003cul\u003e\n\u003cli\u003eAvoid \u003ccode\u003ePytestAssertRewriteWarning\u003c/code\u003e when importing \u003ccode\u003eplatformdirs\u003c/code\u003e before invoking pytest. :pr:\u003ccode\u003e601\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr /\u003e\n\u003cp\u003e4.12.0 (2026-09-26)\u003c/p\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/960ff632eb575deb6f0d5bf49519d5a2ee2098b6\"\u003e\u003ccode\u003e960ff63\u003c/code\u003e\u003c/a\u003e Release 4.12.3\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/8047ad5bf0e5fd3db9c8ce9f250f73c3d961fe19\"\u003e\u003ccode\u003e8047ad5\u003c/code\u003e\u003c/a\u003e Place root config and data files in the first site directory (\u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/issues/607\"\u003e#607\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/af2fc7f3e0beee7f4672787152ff41c5c59e0909\"\u003e\u003ccode\u003eaf2fc7f\u003c/code\u003e\u003c/a\u003e Release 4.12.2\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/bdafa67c2d0f95e146bdd25c362ae80cd530b7e8\"\u003e\u003ccode\u003ebdafa67\u003c/code\u003e\u003c/a\u003e ♻️ refactor(api): share use_site iteration (\u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/issues/606\"\u003e#606\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/d5ff75cd1ad8ccec8ce275966fa8588608badd44\"\u003e\u003ccode\u003ed5ff75c\u003c/code\u003e\u003c/a\u003e 🐛 fix(api): keep os.pathsep in site_applications_path (\u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/issues/604\"\u003e#604\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/d5457447b05d745d65645b3a9aeecbe4a968865d\"\u003e\u003ccode\u003ed545744\u003c/code\u003e\u003c/a\u003e build(deps): bump astral-sh/setup-uv from 10.1.0 to 10.2.0 in the all group (...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/9fd89a77f53ebb8f61dede06a10301154d27fd41\"\u003e\u003ccode\u003e9fd89a7\u003c/code\u003e\u003c/a\u003e [pre-commit.ci] pre-commit autoupdate (\u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/issues/603\"\u003e#603\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/0a50795934584595a0076ccfa54166e00c31c066\"\u003e\u003ccode\u003e0a50795\u003c/code\u003e\u003c/a\u003e Release 4.12.1\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/tox-dev/platformdirs/commit/72e93ffd58d1d63b00fc2937d4132fe9b481fcc9\"\u003e\u003ccode\u003e72e93ff\u003c/code\u003e\u003c/a\u003e fix(pytest): allow import before pytest startup (\u003ca href=\"https://redirect.github.com/tox-dev/platformdirs/issues/602\"\u003e#602\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/tox-dev/platformdirs/compare/4.12.0...4.12.3\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `pytz` from 2026.4 to 2026.5\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/stub42/pytz/commit/21be17fe9b5334f51ac145d08dfc089b3c40b96f\"\u003e\u003ccode\u003e21be17f\u003c/code\u003e\u003c/a\u003e Add Python 3.14 to test suite\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/stub42/pytz/commit/fddd01c11ddbf65dea944e7a2fdb523327df3275\"\u003e\u003ccode\u003efddd01c\u003c/code\u003e\u003c/a\u003e Bump version numbers to 2026.5 (2026e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/stub42/pytz/commit/8f05ab3e7f1176950c9490692ffec74db5dd2b85\"\u003e\u003ccode\u003e8f05ab3\u003c/code\u003e\u003c/a\u003e IANA 2026e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/stub42/pytz/commit/d79605f8e4d65ab57b8cdf7eca535d3b4f4685e5\"\u003e\u003ccode\u003ed79605f\u003c/code\u003e\u003c/a\u003e Squashed 'tz/' changes from d633fe7ed3..db07415c7d\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/stub42/pytz/compare/release_2026.4...release_2026.5\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `tzd...\n\n_Description has been truncated_","html_url":"https://github.com/appeler/parsernaam/pull/27","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/appeler%2Fparsernaam/issues/27","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/27/packages"}}]}