Sourced from platformdirs's releases.
4.11.12
What's Changed
- docs: preserve nested directories in the migration recipe by
@agammannin tox-dev/platformdirs#553- fix: ignore broken sphinx-llm release by
@gaborbernatin tox-dev/platformdirs#556- fix: ignore relative XDG user directory environment variables by
@darrenhuaiin tox-dev/platformdirs#554New Contributors
@agammannmade their first contribution in tox-dev/platformdirs#553Full Changelog: https://github.com/tox-dev/platformdirs/compare/4.11.11...4.11.12
Sourced from platformdirs's changelog.
########### Changelog ###########
.. towncrier-draft-entries:: Unreleased
.. towncrier release notes start
4.11.13 (2026-09-25)
- With
ensure_exists, the media directories such asuser_documents_dirare created on Unix, and on macOS when an XDG variable sets them - by :user:ekanshul. :pr:560
4.11.12 (2026-09-22)
- Ignore relative paths in the XDG user directory environment variables, so
XDG_DOCUMENTS_DIR=Documentsno longer makes :func:~platformdirs.user_documents_dirand the other media directories return a path relative to the working directory. They now fall back to the platform default like the XDG Base Directory variables, and like the same keys read fromuser-dirs.dirs- by :user:darrenhuai. :pr:554- Copy nested directories in the versioned data migration recipe. :pr:
553- Exclude sphinx-llm 1.1.0 from documentation dependencies because its Markdown builder emits unknown-node warnings. :pr:
556
4.11.11 (2026-09-19)
- Reject
appname,appauthorandversionvalues that leave the platform base directory (a..segment, a leading separator, a drive or a UNC share) withValueError, soensure_existscannot create directories outside it - by :user:Pitchfork-and-Torch. :pr:552
4.11.10 (2026-09-18)
- With
ensure_exists, thesite_*_dirandsite_*_pathproperties and theiter_*_dirsiterators only create the site directories they return or yield, instead of every entry in the site list - by :user:darrenhuai. :pr:550
4.11.9 (2026-09-16)
- Accept
multipathin :func:~platformdirs.site_cache_dirand :func:~platformdirs.site_cache_path. Without it, the function API could not return the Homebrew cache prefix that :attr:~platformdirs.macos.MacOS.site_cache_diradds undermultipath- by :user:darrenhuai. :pr:544
... (truncated)
0975949
Release 4.11.12f0f5667
fix: ignore relative XDG user directory environment variables (#554)1f944d0
fix: ignore broken sphinx-llm release (#556)3e2e590
[pre-commit.ci] pre-commit autoupdate (#555)897097b
docs: preserve nested directories in the migration recipe (#553)Sourced from multidict's releases.
6.9.1
Bug fixes
Fixed the C extension reading freed memory on free-threaded builds when a list handed to :py:meth:
~multidict.MultiDict.update, :py:meth:~multidict.MultiDict.extend, :py:meth:~multidict.MultiDict.mergeor the :py:class:~multidict.MultiDictand :py:class:~multidict.CIMultiDictconstructors, a[key, value]item inside any iterable handed to them, or a list tested withinagainst :py:meth:~multidict.MultiDict.items, is changed by another thread; a call that catches the list shrinking under it now raises :py:exc:RuntimeError-- by :user:rodrigobnogueira.Related issues and pull requests on GitHub: #1437.
Fixed a data race on the free-threaded build where a retired hash table's reader count used relaxed atomics, letting a lock-free
get()/getone()/__getitem__()read race a concurrent free of that table. The reader-exit decrement and the drain's free check now use release/acquire ordering instead -- by :user:asvetlov.Related issues and pull requests on GitHub: #1481.
Fixed a free-threaded build bug where two threads calling
update(),merge(), or__setitem__()on the same key at the same time could lose the key entirely instead of just racing on which value wins. A decref of the replaced value could transiently suspend the writer's critical section, letting a second writer for the same key observe the first writer's in-progress entry as absent and, once both settled, mistake it for a stale duplicate and delete it. Every such decref is now deferred until the writer has released its critical section, so the window can no longer open.setdefault()had an unrelated instance of the same blind spot (it could insert a duplicate rather than recognizing an in-flight key), fixed alongside it -- by :user:asvetlov.Related issues and pull requests on GitHub: #1483.
Fixed a free-threaded build bug where
getall()and theitems()/keys()/values()equality path could raiseKeyErroror report a present, never-deleted key as missing. A concurrentupdate()/extend()/__setitem__()call can have its critical section transiently suspended (a decref triggering a blocking allocator call) while an entry is marked as part of its own bookkeeping; a reader landing in that window used to treat the mark as "not found" instead of "still there, in flight" -- by :user:asvetlov.Related issues and pull requests on GitHub:
... (truncated)
Sourced from multidict's changelog.
6.9.1
(2026-09-21)
Bug fixes
Fixed the C extension reading freed memory on free-threaded builds when a list handed to :py:meth:
~multidict.MultiDict.update, :py:meth:~multidict.MultiDict.extend, :py:meth:~multidict.MultiDict.mergeor the :py:class:~multidict.MultiDictand :py:class:~multidict.CIMultiDictconstructors, a[key, value]item inside any iterable handed to them, or a list tested withinagainst :py:meth:~multidict.MultiDict.items, is changed by another thread; a call that catches the list shrinking under it now raises :py:exc:RuntimeError-- by :user:rodrigobnogueira.Related issues and pull requests on GitHub: :issue:
1437.Fixed a data race on the free-threaded build where a retired hash table's reader count used relaxed atomics, letting a lock-free
get()/getone()/__getitem__()read race a concurrent free of that table. The reader-exit decrement and the drain's free check now use release/acquire ordering instead -- by :user:asvetlov.Related issues and pull requests on GitHub: :issue:
1481.Fixed a free-threaded build bug where two threads calling
update(),merge(), or__setitem__()on the same key at the same time could lose the key entirely instead of just racing on which value wins. A decref of the replaced value could transiently suspend the writer's critical section, letting a second writer for the same key observe the first writer's in-progress entry as absent and, once both settled, mistake it for a stale duplicate and delete it. Every such decref is now deferred until the writer has released its critical section, so the window can no longer open.setdefault()had an unrelated instance of the same blind spot (it could insert a duplicate rather than recognizing an in-flight key), fixed alongside it -- by :user:asvetlov.Related issues and pull requests on GitHub: :issue:
1483.Fixed a free-threaded build bug where
getall()and theitems()/keys()/values()equality path could raiseKeyErroror report a present, never-deleted key as missing. A concurrentupdate()/extend()/__setitem__()call can have its critical section transiently suspended (a decref triggering a blocking allocator call) while an entry is marked as
... (truncated)
0a1770c
Release 6.9.1 (#1504)d220522
Upload release assets one at a time to avoid the secondary rate limit
(#1503)30cd596
Stop a GIL-releasing del from segfaulting the standard
C extension build ...d1c331a
Recheck the reader gate after taking the retired list (#1502)b37f07c
Allocate deferred decrefs in fixed-size blocks (#1501)563f667
Run CodSpeed benchmarks on Python 3.14 and loop the smallest ones (#1498)157c87c
Cancel superseded CI runs on pull requests (#1500)d43adfe
Drop -I from the ASan test command so PYTHONMALLOC takes effect (#1499)2a68472
Stop items() iteration from reading a freed entry in CIMultiDict (#1496)cd528d6
Rename GHSA-54p9-h82j-f925 changelog fragment to the merged commit (#1495)