Fix Process.stdin.send exceptions and checkpointing on asyncio - #1002
Conversation
This ensures that a closed UDPSocket will not raise BrokenResourceError. I'm not sure whether this change is strictly necessary---it may be impossible for transport.is_closing to return True on UDP prior to AnyIO's aclose being called, in which case this change does nothing. Still, I see no reason not to make this change to be safe.
| @@ -1052,12 +1052,26 @@ async def aclose(self) -> None: | |||
| @dataclass(eq=False) | |||
| class StreamWriterWrapper(abc.ByteSendStream): | |||
There was a problem hiding this comment.
Off topic: I noticed that we don't have ResourceGuards in _asyncio.Stream{Reader,Writer}Wrapper and _trio.{Receive,Send}StreamWrapper. Should we add guards?
There was a problem hiding this comment.
Perhaps that would be wise. I'm not sure if Trio doesn't already have a mechanism in place to guard against concurrent access. It would be good to check first.
There was a problem hiding this comment.
Trio already has its own ConflictDetectors in standard streams (FdStream, PipeSendStream, and PipeReceiveStream), but they raise trio.BusyResourceError, not anyio.BusyResourceError, so I think we should to add our own guards on the Trio backend too.
Perhaps let's handle this in a separate PR after this one. It looks like there are also a few other places where one can currently get a ConflictDetector's trio.BusyResourceError on AnyIO instead of an anyio.BusyResourceError.
19017a0 to
f784e97
Compare
|
@Vizonex there's a new test here that is only failing on Winloop—would you be able to take a look? I will take a look tomorrow too. |
agronholm
left a comment
There was a problem hiding this comment.
Looks good. I left some formatting changes and other comments.
| async def send(self, item: bytes) -> None: | ||
| self._stream.write(item) | ||
| await self._stream.drain() | ||
| await AsyncIOBackend.checkpoint() |
There was a problem hiding this comment.
We already have self._stream.drain(), so I don't think we need a second full checkpoint here. What we should add instead is AsyncIOBackend.checkpoint_if_cancelled() to respond to cancellation before the synchronous stream.write().
There was a problem hiding this comment.
It looks like drain() might not checkpoint in all branches: https://github.com/python/cpython/blob/v3.14.0/Lib/asyncio/streams.py#L167-L168
There was a problem hiding this comment.
OK, how about checkpointing based on self._stream._paused?
async def send(self, item: bytes) -> None:
await checkpoint_if_cancelled()
stream_paused = self._stream._paused
try:
self._stream.write(item)
await self._stream.drain()
except (ConnectionResetError, BrokenPipeError, RuntimeError) as exc:
# If closed by us and/or the peer:
# * on stdlib, drain() raises ConnectionResetError or BrokenPipeError
# * on uvloop, write() raises RuntimeError and drain() doesn't appear to
# raise anything
if self._closed:
raise ClosedResourceError from exc
elif self._stream.is_closing():
raise BrokenResourceError from exc
raise
if not stream_paused:
await cancel_shielded_checkpoint()I know it's a private attribute but our CI should alert us if it's ever changed.
There was a problem hiding this comment.
Sounds good. I'm assuming that you meant self._stream._protocol._paused since self._stream._paused does not exist.
However: when I do make this change, test_exceptions_after_subprocess_closes_standard_streams[asyncio+uvloop] starts failing. (It's fine on stdlib asyncio.) Without the checkpoint, it seems like we might be hitting a uvloop bug that is similar to the Winloop bug. Looking into it.
| @@ -1052,12 +1052,26 @@ async def aclose(self) -> None: | |||
| @dataclass(eq=False) | |||
| class StreamWriterWrapper(abc.ByteSendStream): | |||
There was a problem hiding this comment.
Perhaps that would be wise. I'm not sure if Trio doesn't already have a mechanism in place to guard against concurrent access. It would be good to check first.
|
Note that a test on Windows + Python 3.9 is genuinely failing. |
Co-authored-by: Alex Grönholm <alex.gronholm@nextday.fi>
Co-authored-by: Alex Grönholm <alex.gronholm@nextday.fi>
|
@gschaffner @agronholm I saw it and I have now made a fork. Thanks for writing me a reproducible test those really help me understand what it is that is going on. I'll try and come up with a template as well when the bug for winloop is fixed so people know I want reproducible tests =) |
|
@agronholm I fixed the bug on winloop's end there should be a release for 0.3.1 shortly here later today. |
There seems to be a failure on 3.13 now with winloop. 3.9 passes though. |
Co-authored-by: Alex Grönholm <alex.gronholm@nextday.fi>
|
It looks like |
@gschaffner If your lucky I might be able to do another bugfix tomorrow or make better tests available. (This might be related/unrelated) but winloop & uvloop are suffering from rounding bugs as well... |
|
When I remove the schedule point at the start of I suppose it's just a race? Perhaps it's fine for Footnotes
|
|
I.e. perhaps the test is too strict, and we should amend it?: diff --git a/tests/test_subprocesses.py b/tests/test_subprocesses.py
index c18df94..736ef8c 100644
--- a/tests/test_subprocesses.py
+++ b/tests/test_subprocesses.py
@@ -275,7 +275,8 @@ async def test_exceptions_after_subprocess_closes_standard_streams() -> None:
assert process.stderr is not None
assert process.stdout is not None
with pytest.raises(BrokenResourceError):
- await process.stdin.send(b"foo")
+ for _ in range(5):
+ await process.stdin.send(b"foo")
with pytest.raises(EndOfStream):
await process.stdout.receive(1) |
|
On the other hand:
|
|
I've gone ahead and weakened the test to accommodate uvloop's and Winloop's transmission delays. Let me know what you think. |
|
@agronholm @gschaffner Thank both of you, glad I could be of assistance and that you helped me hunt down some bugs with my library. |
Bumps the python group with 26 updates: | Package | From | To | | --- | --- | --- | | [absl-py](https://github.com/abseil/abseil-py) | `2.3.0` | `2.3.1` | | [anyio](https://github.com/agronholm/anyio) | `4.8.0` | `4.11.0` | | [certifi](https://github.com/certifi/python-certifi) | `2024.12.14` | `2025.10.5` | | [charset-normalizer](https://github.com/jawah/charset_normalizer) | `3.4.2` | `3.4.4` | | [click](https://github.com/pallets/click) | `8.1.8` | `8.3.0` | | [exceptiongroup](https://github.com/agronholm/exceptiongroup) | `1.2.2` | `1.3.0` | | [fastapi](https://github.com/fastapi/fastapi) | `0.115.13` | `0.120.3` | | [h11](https://github.com/python-hyper/h11) | `0.14.0` | `0.16.0` | | [idna](https://github.com/kjd/idna) | `3.10` | `3.11` | | [immutabledict](https://github.com/corenting/immutabledict) | `4.2.1` | `4.2.2` | | [iniconfig](https://github.com/pytest-dev/iniconfig) | `2.0.0` | `2.3.0` | | [numpy](https://github.com/numpy/numpy) | `2.2.6` | `2.3.4` | | [packaging](https://github.com/pypa/packaging) | `24.2` | `25.0` | | [pandas](https://github.com/pandas-dev/pandas) | `2.3.0` | `2.3.3` | | [pluggy](https://github.com/pytest-dev/pluggy) | `1.5.0` | `1.6.0` | | [protobuf](https://github.com/protocolbuffers/protobuf) | `6.31.1` | `6.33.0` | | [pydantic](https://github.com/pydantic/pydantic) | `2.10.6` | `2.12.3` | | [pydantic-core](https://github.com/pydantic/pydantic-core) | `2.27.2` | `2.41.4` | | [pytest](https://github.com/pytest-dev/pytest) | `8.3.5` | `8.4.2` | | [requests](https://github.com/psf/requests) | `2.32.4` | `2.32.5` | | [scipy](https://github.com/scipy/scipy) | `1.15.3` | `1.16.3` | | [starlette](https://github.com/Kludex/starlette) | `0.41.3` | `0.49.1` | | [tomli](https://github.com/hukkin/tomli) | `2.2.1` | `2.3.0` | | [typing-extensions](https://github.com/python/typing_extensions) | `4.12.2` | `4.15.0` | | [urllib3](https://github.com/urllib3/urllib3) | `2.3.0` | `2.5.0` | | [uvicorn](https://github.com/Kludex/uvicorn) | `0.34.3` | `0.38.0` | Updates `absl-py` from 2.3.0 to 2.3.1 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/abseil/abseil-py/releases">absl-py's releases</a>.</em></p> <blockquote> <h2>v2.3.1</h2> <h3>Changed</h3> <ul> <li>(cleanup) Removed leftover code supporting Python < 3.8, as well as other references to older Python versions.</li> </ul> <h3>Fixed</h3> <ul> <li>(typechecking) Fixed typechecking errors that appeared under mypy release 1.16</li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/abseil/abseil-py/blob/main/CHANGELOG.md">absl-py's changelog</a>.</em></p> <blockquote> <h2>2.3.1 (2025-07-03)</h2> <h3>Changed</h3> <ul> <li>(cleanup) Removed leftover code supporting Python < 3.8, as well as other references to older Python versions.</li> </ul> <h3>Fixed</h3> <ul> <li>(typechecking) Fixed typechecking errors that appeared under mypy release 1.16</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/abseil/abseil-py/commit/bdad52d90492be48ed535f7d6369c406860d547a"><code>bdad52d</code></a> Release Abseil-py 2.3.1</li> <li><a href="https://github.com/abseil/abseil-py/commit/a2d05830f40abf992f4a7e9716cf518f64ec0ce4"><code>a2d0583</code></a> Clean up some references to older Python versions</li> <li><a href="https://github.com/abseil/abseil-py/commit/55c8f4d1a83481ef4d62fb38b043844580169886"><code>55c8f4d</code></a> Fix typechecking errors that appeared under mypy release 1.16</li> <li><a href="https://github.com/abseil/abseil-py/commit/aafb0d89d21f38e9eb200eb375db3473678a98dc"><code>aafb0d8</code></a> Add useful links to the abseil-py public files</li> <li>See full diff in <a href="https://github.com/abseil/abseil-py/compare/v2.3.0...v2.3.1">compare view</a></li> </ul> </details> <br /> Updates `anyio` from 4.8.0 to 4.11.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/agronholm/anyio/releases">anyio's releases</a>.</em></p> <blockquote> <h2>4.11.0</h2> <ul> <li>Added support for cancellation reasons (the <code>reason</code> parameter to <code>CancelScope.cancel()</code>) (<a href="https://redirect.github.com/agronholm/anyio/pull/975">#975</a>)</li> <li>Bumped the minimum version of Trio to v0.31.0</li> <li>Added the ability to enter the event loop from foreign (non-worker) threads by passing the return value of <code>anyio.lowlevel.current_token()</code> to <code>anyio.from_thread.run()</code> and <code>anyio.from_thread.run_sync()</code> as the <code>token</code> keyword argument (<a href="https://redirect.github.com/agronholm/anyio/issues/256">#256</a>)</li> <li>Added pytest option (<code>anyio_mode = "auto"</code>) to make the pytest plugin automatically handle all async tests (<a href="https://redirect.github.com/agronholm/anyio/pull/971">#971</a>)</li> <li>Added the <code>anyio.Condition.wait_for()</code> method for feature parity with asyncio (<a href="https://redirect.github.com/agronholm/anyio/pull/974">#974</a>)</li> <li>Changed the default type argument of <code>anyio.abc.TaskStatus</code> from <code>Any</code> to <code>None</code> (<a href="https://redirect.github.com/agronholm/anyio/pull/964">#964</a>)</li> <li>Fixed TCP listener behavior to guarantee the same ephemeral port is used for all socket listeners when <code>local_port=0</code> (<a href="https://redirect.github.com/agronholm/anyio/issues/857">#857</a>; PR by <a href="https://github.com/11kkw"><code>@11kkw</code></a> and <a href="https://github.com/agronholm"><code>@agronholm</code></a>)</li> <li>Fixed inconsistency between Trio and asyncio where a TCP stream that previously raised a <code>BrokenResourceError</code> on <code>send()</code> would still raise <code>BrokenResourceError</code> after the stream was closed on asyncio, but <code>ClosedResourceError</code> on Trio. They now both raise a <code>ClosedResourceError</code> in this scenario. (<a href="https://redirect.github.com/agronholm/anyio/issues/671">#671</a>)</li> </ul> <h2>4.10.0</h2> <ul> <li>Added the <code>feed_data()</code> method to the <code>BufferedByteReceiveStream</code> class, allowing users to inject data directly into the buffer</li> <li>Added various class methods to wrap existing sockets as listeners or socket streams: <ul> <li><code>SocketListener.from_socket()</code></li> <li><code>SocketStream.from_socket()</code></li> <li><code>UNIXSocketStream.from_socket()</code></li> <li><code>UDPSocket.from_socket()</code></li> <li><code>ConnectedUDPSocket.from_socket()</code></li> <li><code>UNIXDatagramSocket.from_socket()</code></li> <li><code>ConnectedUNIXDatagramSocket.from_socket()</code></li> </ul> </li> <li>Added a hierarchy of connectable stream classes for transparently connecting to various remote or local endpoints for exchanging bytes or objects</li> <li>Added context manager mix-in classes (<code>anyio.ContextManagerMixin</code> and <code>anyio.AsyncContextManagerMixin</code>) to help write classes that embed other context managers, particularly cancel scopes or task groups (<a href="https://redirect.github.com/agronholm/anyio/pull/905">#905</a>; PR by <a href="https://github.com/agronholm"><code>@agronholm</code></a> and <a href="https://github.com/tapetersen"><code>@tapetersen</code></a>)</li> <li>Added the ability to specify the thread name in <code>start_blocking_portal()</code> (<a href="https://redirect.github.com/agronholm/anyio/issues/818">#818</a>; PR by <a href="https://github.com/davidbrochart"><code>@davidbrochart</code></a>)</li> <li>Added <code>anyio.notify_closing</code> to allow waking <code>anyio.wait_readable</code> and <code>anyio.wait_writable</code> before closing a socket. Among other things, this prevents an OSError on the <code>ProactorEventLoop</code>. (<a href="https://redirect.github.com/agronholm/anyio/pull/896">#896</a>; PR by <a href="https://github.com/graingert"><code>@graingert</code></a>)</li> <li>Incorporated several documentation improvements from the EuroPython 2025 sprint (special thanks to the sprinters: Emmanuel Okedele, Jan Murre, Euxenia Miruna Goia and Christoffer Fjord)</li> <li>Added a documentation page explaining why one might want to use AnyIO's APIs instead of asyncio's</li> <li>Updated the <code>to_interpreters</code> module to use the public <code>concurrent.interpreters</code> API on Python 3.14 or later</li> <li>Fixed <code>anyio.Path.copy()</code> and <code>anyio.Path.copy_into()</code> failing on Python 3.14.0a7</li> <li>Fixed return annotation of <code>__aexit__</code> on async context managers. CMs which can suppress exceptions should return <code>bool</code>, or <code>None</code> otherwise. (<a href="https://redirect.github.com/agronholm/anyio/pull/913">#913</a>; PR by <a href="https://github.com/Enegg"><code>@Enegg</code></a>)</li> <li>Fixed rollover boundary check in <code>SpooledTemporaryFile</code> so that rollover only occurs when the buffer size exceeds <code>max_size</code> (<a href="https://redirect.github.com/agronholm/anyio/pull/915">#915</a>; PR by <a href="https://github.com/11kkw"><code>@11kkw</code></a>)</li> <li>Migrated testing and documentation dependencies from extras to dependency groups</li> <li>Fixed compatibility of <code>anyio.to_interpreter</code> with Python 3.14.0b2 (<a href="https://redirect.github.com/agronholm/anyio/issues/926">#926</a>; PR by <a href="https://github.com/hroncok"><code>@hroncok</code></a>)</li> <li>Fixed <code>SyntaxWarning</code> on Python 3.14 about <code>return</code> in <code>finally</code> (<a href="https://redirect.github.com/agronholm/anyio/issues/816">#816</a>)</li> <li>Fixed RunVar name conflicts. RunVar instances with the same name should not share storage (<a href="https://redirect.github.com/agronholm/anyio/issues/880">#880</a>; PR by <a href="https://github.com/vimfu"><code>@vimfu</code></a>)</li> <li>Renamed the <code>BrokenWorkerIntepreter</code> exception to <code>BrokenWorkerInterpreter</code>. The old name is available as a deprecated alias. (<a href="https://redirect.github.com/agronholm/anyio/pull/938">#938</a>; PR by <a href="https://github.com/ayussh-verma"><code>@ayussh-verma</code></a>)</li> <li>Fixed an edge case in <code>CapacityLimiter</code> on asyncio where a task, waiting to acquire a limiter gets cancelled and is subsequently granted a token from the limiter, but before the cancellation is delivered, and then fails to notify the next waiting task (<a href="https://redirect.github.com/agronholm/anyio/issues/947">#947</a>)</li> </ul> <h2>4.9.0</h2> <ul> <li>Added async support for temporary file handling (<a href="https://redirect.github.com/agronholm/anyio/issues/344">#344</a>; PR by <a href="https://github.com/11kkw"><code>@11kkw</code></a>)</li> <li>Added 4 new fixtures for the AnyIO <code>pytest</code> plugin: <ul> <li><code>free_tcp_port_factory</code>: session scoped fixture returning a callable that generates unused TCP port numbers</li> <li><code>free_udp_port_factory</code>: session scoped fixture returning a callable that generates unused UDP port numbers</li> <li><code>free_tcp_port</code>: function scoped fixture that invokes the <code>free_tcp_port_factory</code> fixture to generate a free TCP port number</li> <li><code>free_udp_port</code>: function scoped fixture that invokes the <code>free_udp_port_factory</code> fixture to generate a free UDP port number</li> </ul> </li> <li>Added <code>stdin</code> argument to <code>anyio.run_process()</code> akin to what <code>anyio.open_process()</code>, <code>asyncio.create_subprocess()</code>, <code>trio.run_process()</code>, and <code>subprocess.run()</code> already accept (PR by <a href="https://github.com/jmehnle"><code>@jmehnle</code></a>)</li> <li>Added the <code>info</code> property to <code>anyio.Path</code> on Python 3.14</li> <li>Changed <code>anyio.getaddrinfo()</code> to ignore (invalid) IPv6 name resolution results when IPv6 support is disabled in Python</li> <li>Changed <code>EndOfStream</code> raised from <code>MemoryObjectReceiveStream.receive()</code> to leave out the <code>AttributeError</code> from the exception chain which was merely an implementation detail and caused some confusion</li> <li>Fixed traceback formatting growing quadratically with level of <code>TaskGroup</code> nesting on asyncio due to exception chaining when raising <code>ExceptionGroups</code> in <code>TaskGroup.__aexit__</code> (<a href="https://redirect.github.com/agronholm/anyio/issues/863">#863</a>; PR by <a href="https://github.com/tapetersen"><code>@tapetersen</code></a>)</li> <li>Fixed <code>anyio.Path.iterdir()</code> making a blocking call in Python 3.13 (<a href="https://redirect.github.com/agronholm/anyio/issues/873">#873</a>; PR by <a href="https://github.com/cbornet"><code>@cbornet</code></a> and <a href="https://github.com/agronholm"><code>@agronholm</code></a>)</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/agronholm/anyio/blob/master/docs/versionhistory.rst">anyio's changelog</a>.</em></p> <blockquote> <h1>Version history</h1> <p>This library adheres to <code>Semantic Versioning 2.0 <http://semver.org/></code>_.</p> <p><strong>UNRELEASED</strong></p> <ul> <li>Added an asynchronous implementation of the <code>functools</code> module (<code>[#1001](https://github.com/agronholm/anyio/issues/1001) <https://github.com/agronholm/anyio/pull/1001></code>_)</li> <li>Added support for <code>uvloop=True</code> on Windows via the winloop_ implementation (<code>[#960](https://github.com/agronholm/anyio/issues/960) <https://github.com/agronholm/anyio/pull/960></code>_; PR by <a href="https://github.com/Vizonex"><code>@Vizonex</code></a>)</li> <li>Added support for use as a context manager to <code>anyio.lowlevel.RunVar</code></li> <li>Added <code>__all__</code> declarations to public submodules (<code>anyio.lowlevel</code> etc.) (<code>[#1009](https://github.com/agronholm/anyio/issues/1009) <https://github.com/agronholm/anyio/pull/1009></code>_)</li> <li>Fixed <code>Process.stdin.send()</code> not raising <code>ClosedResourceError</code> and <code>BrokenResourceError</code> on asyncio. Previously, a non-AnyIO exception was raised in such cases (<code>[#671](https://github.com/agronholm/anyio/issues/671) <https://github.com/agronholm/anyio/issues/671></code>_; PR by <a href="https://github.com/gschaffner"><code>@gschaffner</code></a>)</li> <li>Fixed <code>Process.stdin.send()</code> not checkpointing before writing data on asyncio (<code>[#1002](https://github.com/agronholm/anyio/issues/1002) <https://github.com/agronholm/anyio/issues/1002></code>_; PR by <a href="https://github.com/gschaffner"><code>@gschaffner</code></a>)</li> <li>Fixed a race condition where cancelling a <code>Future</code> from <code>BlockingPortal.start_task_soon()</code> would sometimes not cancel the async function (<code>[#1011](https://github.com/agronholm/anyio/issues/1011) <https://github.com/agronholm/anyio/issues/1011></code>_; PR by <a href="https://github.com/gschaffner"><code>@gschaffner</code></a>)</li> </ul> <p>.. _winloop: <a href="https://github.com/Vizonex/Winloop">https://github.com/Vizonex/Winloop</a></p> <p><strong>4.11.0</strong></p> <ul> <li>Added support for cancellation reasons (the <code>reason</code> parameter to <code>CancelScope.cancel()</code>) (<code>[#975](https://github.com/agronholm/anyio/issues/975) <https://github.com/agronholm/anyio/pull/975></code>_)</li> <li>Bumped the minimum version of Trio to v0.31.0</li> <li>Added the ability to enter the event loop from foreign (non-worker) threads by passing the return value of <code>anyio.lowlevel.current_token()</code> to <code>anyio.from_thread.run()</code> and <code>anyio.from_thread.run_sync()</code> as the <code>token</code> keyword argument (<code>[#256](https://github.com/agronholm/anyio/issues/256) <https://github.com/agronholm/anyio/issues/256></code>_)</li> <li>Added pytest option (<code>anyio_mode = "auto"</code>) to make the pytest plugin automatically handle all async tests (<code>[#971](https://github.com/agronholm/anyio/issues/971) <https://github.com/agronholm/anyio/pull/971></code>_)</li> <li>Added the <code>anyio.Condition.wait_for()</code> method for feature parity with asyncio (<code>[#974](https://github.com/agronholm/anyio/issues/974) <https://github.com/agronholm/anyio/pull/974></code>_)</li> <li>Changed the default type argument of <code>anyio.abc.TaskStatus</code> from <code>Any</code> to <code>None</code> (<code>[#964](https://github.com/agronholm/anyio/issues/964) <https://github.com/agronholm/anyio/pull/964></code>_)</li> <li>Fixed TCP listener behavior to guarantee the same ephemeral port is used for all socket listeners when <code>local_port=0</code> (<code>[#857](https://github.com/agronholm/anyio/issues/857) <https://github.com/agronholm/anyio/issues/857></code>_; PR by <a href="https://github.com/11kkw"><code>@11kkw</code></a> and <a href="https://github.com/agronholm"><code>@agronholm</code></a>)</li> <li>Fixed inconsistency between Trio and asyncio where a TCP stream that previously raised a <code>BrokenResourceError</code> on <code>send()</code> would still raise <code>BrokenResourceError</code> after the stream was closed on asyncio, but <code>ClosedResourceError</code> on Trio. They now both raise a <code>ClosedResourceError</code> in this</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/agronholm/anyio/commit/08737af202f6610cdb8ba53fecaefd9c03269637"><code>08737af</code></a> Bumped up the version</li> <li><a href="https://github.com/agronholm/anyio/commit/8bb9fe04a1c0a4b6615c843d4a88bba38a386059"><code>8bb9fe0</code></a> Fixed the inconsistent exception on sending to a closed TCP stream (<a href="https://redirect.github.com/agronholm/anyio/issues/980">#980</a>)</li> <li><a href="https://github.com/agronholm/anyio/commit/963709358a05ced66986e928b593b4bd82422981"><code>9637093</code></a> [pre-commit.ci] pre-commit autoupdate (<a href="https://redirect.github.com/agronholm/anyio/issues/981">#981</a>)</li> <li><a href="https://github.com/agronholm/anyio/commit/f1bc6ee95a75007681ef9cb4eec0369838b390e9"><code>f1bc6ee</code></a> Fixed changelog entry formatting</li> <li><a href="https://github.com/agronholm/anyio/commit/0b58964a26c68ca427b711bbe8536f61ed900133"><code>0b58964</code></a> Mentioned the sub-interpreter support in the README</li> <li><a href="https://github.com/agronholm/anyio/commit/1ed112c65628d3cce312e7b6875b9f914d174a71"><code>1ed112c</code></a> Ensure same port is used for IPv4/IPv6 when creating TCP listener with local_...</li> <li><a href="https://github.com/agronholm/anyio/commit/aceeee09868642311a96626924f2f09c088a26c0"><code>aceeee0</code></a> Re-enabled coverage reporting on macOS</li> <li><a href="https://github.com/agronholm/anyio/commit/6b890dc869f54b6237caff52a74e86382c076ad2"><code>6b890dc</code></a> Reworded a changelog entry and added PR links to others</li> <li><a href="https://github.com/agronholm/anyio/commit/944257d2d59e8057dd00cd5cc96d8f73028031dd"><code>944257d</code></a> Updated pre-commit modules</li> <li><a href="https://github.com/agronholm/anyio/commit/087975f44599471a84bea2077731143a346c276a"><code>087975f</code></a> Fixed a documentation style (<a href="https://redirect.github.com/agronholm/anyio/issues/976">#976</a>)</li> <li>Additional commits viewable in <a href="https://github.com/agronholm/anyio/compare/4.8.0...4.11.0">compare view</a></li> </ul> </details> <br /> Updates `certifi` from 2024.12.14 to 2025.10.5 <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/certifi/python-certifi/commit/fb14ac49a976b1695d84b1ac1307276a20b3aac9"><code>fb14ac4</code></a> 2025.10.05 (<a href="https://redirect.github.com/certifi/python-certifi/issues/371">#371</a>)</li> <li><a href="https://github.com/certifi/python-certifi/commit/2c7c7ee6b76a118191b685a4cc028d4241f22eb7"><code>2c7c7ee</code></a> Add Python 3.14 classifier in setup.py</li> <li><a href="https://github.com/certifi/python-certifi/commit/1a5cb7b3771bba256755f88b3dcf3ac13f064622"><code>1a5cb7b</code></a> Bump actions/setup-python from 5.6.0 to 6.0.0 (<a href="https://redirect.github.com/certifi/python-certifi/issues/367">#367</a>)</li> <li><a href="https://github.com/certifi/python-certifi/commit/dea59605ef2b266c2e0e67938e8c8535a04b1211"><code>dea5960</code></a> Bump pypa/gh-action-pypi-publish from 1.12.4 to 1.13.0 (<a href="https://redirect.github.com/certifi/python-certifi/issues/366">#366</a>)</li> <li><a href="https://github.com/certifi/python-certifi/commit/83566b7c993eef772facdaff59c7bba105675329"><code>83566b7</code></a> Bump actions/checkout from 4.2.2 to 5.0.0</li> <li><a href="https://github.com/certifi/python-certifi/commit/ca2e121bdb304fd01f802d3b1ee6a65684f569f2"><code>ca2e121</code></a> Bump actions/download-artifact from 4.3.0 to 5.0.0</li> <li><a href="https://github.com/certifi/python-certifi/commit/a97d9ad8f87c382378dddc0b0b33b9770932404e"><code>a97d9ad</code></a> 2025.08.03 (<a href="https://redirect.github.com/certifi/python-certifi/issues/362">#362</a>)</li> <li><a href="https://github.com/certifi/python-certifi/commit/ddd90c6d726f174c1e5820379dac0f2a8fc723a1"><code>ddd90c6</code></a> 2025.07.14 (<a href="https://redirect.github.com/certifi/python-certifi/issues/359">#359</a>)</li> <li><a href="https://github.com/certifi/python-certifi/commit/d905221c916d51077f5c8071a0f7aa2df2a37c52"><code>d905221</code></a> 2025.07.09 (<a href="https://redirect.github.com/certifi/python-certifi/issues/358">#358</a>)</li> <li><a href="https://github.com/certifi/python-certifi/commit/e767d5938eddddf804216cec93a55c85129c5f2d"><code>e767d59</code></a> 2025.06.15 (<a href="https://redirect.github.com/certifi/python-certifi/issues/357">#357</a>)</li> <li>Additional commits viewable in <a href="https://github.com/certifi/python-certifi/compare/2024.12.14...2025.10.05">compare view</a></li> </ul> </details> <br /> Updates `charset-normalizer` from 3.4.2 to 3.4.4 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/jawah/charset_normalizer/releases">charset-normalizer's releases</a>.</em></p> <blockquote> <h2>Version 3.4.4</h2> <h2><a href="https://github.com/Ousret/charset_normalizer/compare/3.4.3...3.4.4">3.4.4</a> (2025-10-13)</h2> <h3>Changed</h3> <ul> <li>Bound <code>setuptools</code> to a specific constraint <code>setuptools>=68,<=81</code>.</li> <li>Raised upper bound of mypyc for the optional pre-built extension to v1.18.2</li> </ul> <h3>Removed</h3> <ul> <li><code>setuptools-scm</code> as a build dependency.</li> </ul> <h3>Misc</h3> <ul> <li>Enforced hashes in <code>dev-requirements.txt</code> and created <code>ci-requirements.txt</code> for security purposes.</li> <li>Additional pre-built wheels for riscv64, s390x, and armv7l architectures.</li> <li>Restore <code>multiple.intoto.jsonl</code> in GitHub releases in addition to individual attestation file per wheel.</li> </ul> <h2>Version 3.4.3</h2> <h2><a href="https://github.com/Ousret/charset_normalizer/compare/3.4.2...3.4.3">3.4.3</a> (2025-08-09)</h2> <h3>Changed</h3> <ul> <li>mypy(c) is no longer a required dependency at build time if <code>CHARSET_NORMALIZER_USE_MYPYC</code> isn't set to <code>1</code>. (<a href="https://redirect.github.com/jawah/charset_normalizer/issues/595">#595</a>) (<a href="https://redirect.github.com/jawah/charset_normalizer/issues/583">#583</a>)</li> <li>automatically lower confidence on small bytes samples that are not Unicode in <code>detect</code> output legacy function. (<a href="https://redirect.github.com/jawah/charset_normalizer/issues/391">#391</a>)</li> </ul> <h3>Added</h3> <ul> <li>Custom build backend to overcome inability to mark mypy as an optional dependency in the build phase.</li> <li>Support for Python 3.14</li> </ul> <h3>Fixed</h3> <ul> <li>sdist archive contained useless directories.</li> <li>automatically fallback on valid UTF-16 or UTF-32 even if the md says it's noisy. (<a href="https://redirect.github.com/jawah/charset_normalizer/issues/633">#633</a>)</li> </ul> <h3>Misc</h3> <ul> <li>SBOM are automatically published to the relevant GitHub release to comply with regulatory changes. Each published wheel comes with its SBOM. We choose CycloneDX as the format.</li> <li>Prebuilt optimized wheel are no longer distributed by default for CPython 3.7 due to a change in cibuildwheel.</li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/jawah/charset_normalizer/blob/master/CHANGELOG.md">charset-normalizer's changelog</a>.</em></p> <blockquote> <h2><a href="https://github.com/Ousret/charset_normalizer/compare/3.4.2...3.4.4">3.4.4</a> (2025-10-13)</h2> <h3>Changed</h3> <ul> <li>Bound <code>setuptools</code> to a specific constraint <code>setuptools>=68,<=81</code>.</li> <li>Raised upper bound of mypyc for the optional pre-built extension to v1.18.2</li> </ul> <h3>Removed</h3> <ul> <li><code>setuptools-scm</code> as a build dependency.</li> </ul> <h3>Misc</h3> <ul> <li>Enforced hashes in <code>dev-requirements.txt</code> and created <code>ci-requirements.txt</code> for security purposes.</li> <li>Additional pre-built wheels for riscv64, s390x, and armv7l architectures.</li> <li>Restore <code> multiple.intoto.jsonl</code> in GitHub releases in addition to individual attestation file per wheel.</li> </ul> <h2><a href="https://github.com/Ousret/charset_normalizer/compare/3.4.2...3.4.3">3.4.3</a> (2025-08-09)</h2> <h3>Changed</h3> <ul> <li>mypy(c) is no longer a required dependency at build time if <code>CHARSET_NORMALIZER_USE_MYPYC</code> isn't set to <code>1</code>. (<a href="https://redirect.github.com/jawah/charset_normalizer/issues/595">#595</a>) (<a href="https://redirect.github.com/jawah/charset_normalizer/issues/583">#583</a>)</li> <li>automatically lower confidence on small bytes samples that are not Unicode in <code>detect</code> output legacy function. (<a href="https://redirect.github.com/jawah/charset_normalizer/issues/391">#391</a>)</li> </ul> <h3>Added</h3> <ul> <li>Custom build backend to overcome inability to mark mypy as an optional dependency in the build phase.</li> <li>Support for Python 3.14</li> </ul> <h3>Fixed</h3> <ul> <li>sdist archive contained useless directories.</li> <li>automatically fallback on valid UTF-16 or UTF-32 even if the md says it's noisy. (<a href="https://redirect.github.com/jawah/charset_normalizer/issues/633">#633</a>)</li> </ul> <h3>Misc</h3> <ul> <li>SBOM are automatically published to the relevant GitHub release to comply with regulatory changes. Each published wheel comes with its SBOM. We choose CycloneDX as the format.</li> <li>Prebuilt optimized wheel are no longer distributed by default for CPython 3.7 due to a change in cibuildwheel.</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/jawah/charset_normalizer/commit/b30ffdcc2f11043c0d34e60fe66d3815cd49b32b"><code>b30ffdc</code></a> :wrench: fix checksum step in cd.yml</li> <li><a href="https://github.com/jawah/charset_normalizer/commit/d3fbfcfad7dfe3c640886f1a6a6351da527f6634"><code>d3fbfcf</code></a> :wrench: fix cd.yml</li> <li><a href="https://github.com/jawah/charset_normalizer/commit/dafbb95f8c00d3cc8b99158caa63006ffab98749"><code>dafbb95</code></a> Release 3.4.4 (<a href="https://redirect.github.com/jawah/charset_normalizer/issues/658">#658</a>)</li> <li><a href="https://github.com/jawah/charset_normalizer/commit/1f18ffaa69d2c84fea7abedb8840197ba9c14562"><code>1f18ffa</code></a> :arrow_up: raise mypy upper bound to 1.18.2</li> <li><a href="https://github.com/jawah/charset_normalizer/commit/ef4ac69ad203891f24e26b2422ab3a08053044fa"><code>ef4ac69</code></a> Merge branch 'release-3.4.4' of github.com:jawah/charset_normalizer into rele...</li> <li><a href="https://github.com/jawah/charset_normalizer/commit/4b35dda053db5e2e60a247e80a116e4ef04f439b"><code>4b35dda</code></a> :pencil: write changelog for 3.4.4</li> <li><a href="https://github.com/jawah/charset_normalizer/commit/0ec6452f1a34cbc77a55b237c4118807b44c2a33"><code>0ec6452</code></a> :wrench: update cd.yml workflow (add riscv64, s390x and armv7l)</li> <li><a href="https://github.com/jawah/charset_normalizer/commit/f341edec8a828dda394abfa011b1ded8b4b102e2"><code>f341ede</code></a> :arrow_up: upgrade dependencies (dev, ci)</li> <li><a href="https://github.com/jawah/charset_normalizer/commit/a308841e660a4d61ea6c448e7b8bf97415ecdc4a"><code>a308841</code></a> :pencil: write changelog for 3.4.4</li> <li><a href="https://github.com/jawah/charset_normalizer/commit/9c906da611d5ca5ef076d6bf7f60e629f661d0b0"><code>9c906da</code></a> :wrench: update cd.yml workflow (add riscv64, s390x and armv7l)</li> <li>Additional commits viewable in <a href="https://github.com/jawah/charset_normalizer/compare/3.4.2...3.4.4">compare view</a></li> </ul> </details> <br /> Updates `click` from 8.1.8 to 8.3.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/pallets/click/releases">click's releases</a>.</em></p> <blockquote> <h2>8.3.0</h2> <p>This is the Click 8.3.0 feature release. A feature release may include new features, remove previously deprecated code, add new deprecation, or introduce potentially breaking changes.</p> <p>We encourage everyone to upgrade. You can read more about our <a href="https://palletsprojects.com/versions">Version Support Policy</a> on our website.</p> <p>PyPI: <a href="https://pypi.org/project/click/8.3.0/">https://pypi.org/project/click/8.3.0/</a> Changes: <a href="https://click.palletsprojects.com/page/changes/#version-8-3-0">https://click.palletsprojects.com/page/changes/#version-8-3-0</a> Milestone <a href="https://github.com/pallets/click/milestone/27">https://github.com/pallets/click/milestone/27</a></p> <ul> <li> <p><strong>Improved flag option handling</strong>: Reworked the relationship between <code>flag_value</code> and <code>default</code> parameters for better consistency:</p> <ul> <li>The <code>default</code> parameter value is now preserved as-is and passed directly to CLI functions (no more unexpected transformations)</li> <li>Exception: flag options with <code>default=True</code> maintain backward compatibility by defaulting to their <code>flag_value</code></li> <li>The <code>default</code> parameter can now be any type (<code>bool</code>, <code>None</code>, etc.)</li> <li>Fixes inconsistencies reported in: <a href="https://redirect.github.com/pallets/click/issues/1992">#1992</a> <a href="https://redirect.github.com/pallets/click/issues/2514">#2514</a> <a href="https://redirect.github.com/pallets/click/issues/2610">#2610</a> <a href="https://redirect.github.com/pallets/click/issues/3024">#3024</a> <a href="https://redirect.github.com/pallets/click/issues/3030">#3030</a></li> </ul> </li> <li> <p>Allow <code>default</code> to be set on <code>Argument</code> for <code>nargs = -1</code>. <a href="https://redirect.github.com/pallets/click/issues/2164">#2164</a> <a href="https://redirect.github.com/pallets/click/issues/3030">#3030</a></p> </li> <li> <p>Show correct auto complete value for <code>nargs</code> option in combination with flag option <a href="https://redirect.github.com/pallets/click/issues/2813">#2813</a></p> </li> <li> <p>Show correct auto complete value for nargs option in combination with flag option <a href="https://redirect.github.com/pallets/click/issues/2813">#2813</a></p> </li> <li> <p>Fix handling of quoted and escaped parameters in Fish autocompletion. <a href="https://redirect.github.com/pallets/click/issues/2995">#2995</a> <a href="https://redirect.github.com/pallets/click/issues/3013">#3013</a></p> </li> <li> <p>Lazily import <code>shutil</code>. <a href="https://redirect.github.com/pallets/click/issues/3023">#3023</a></p> </li> <li> <p>Properly forward exception information to resources registered with <code>click.core.Context.with_resource()</code>. <a href="https://redirect.github.com/pallets/click/issues/2447">#2447</a> <a href="https://redirect.github.com/pallets/click/issues/3058">#3058</a></p> </li> <li> <p>Fix regression related to EOF handling in CliRunner. <a href="https://redirect.github.com/pallets/click/issues/2939">#2939</a> <a href="https://redirect.github.com/pallets/click/issues/2940">#2940</a></p> </li> </ul> <h2>8.2.2</h2> <p>This is the Click 8.2.2 fix release, which fixes bugs but does not otherwise change behavior and should not result in breaking changes compared to the latest feature release.</p> <p>PyPI: <a href="https://pypi.org/project/click/8.2.2/">https://pypi.org/project/click/8.2.2/</a> Changes: <a href="https://click.palletsprojects.com/page/changes/#version-8-2-2">https://click.palletsprojects.com/page/changes/#version-8-2-2</a> Milestone: <a href="https://github.com/pallets/click/milestone/25">https://github.com/pallets/click/milestone/25</a></p> <ul> <li>Fix reconciliation of <code>default</code>, <code>flag_value</code> and <code>type</code> parameters for flag options, as well as parsing and normalization of environment variables. <a href="https://redirect.github.com/pallets/click/issues/2952">#2952</a> <a href="https://redirect.github.com/pallets/click/issues/2956">#2956</a></li> <li>Fix typing issue in <code>BadParameter</code> and <code>MissingParameter</code> exceptions for the parameter <code>param_hint</code> that did not allow for a sequence of string where the underlying functino <code>_join_param_hints</code> allows for it. <a href="https://redirect.github.com/pallets/click/issues/2777">#2777</a> <a href="https://redirect.github.com/pallets/click/issues/2990">#2990</a></li> <li>Use the value of <code>Enum</code> choices to render their default value in help screen. <a href="https://redirect.github.com/pallets/click/issues/2911">#2911</a> <a href="https://redirect.github.com/pallets/click/issues/3004">#3004</a></li> <li>Fix completion for the Z shell (<code>zsh</code>) for completion items containing colons. <a href="https://redirect.github.com/pallets/click/issues/2703">#2703</a> <a href="https://redirect.github.com/pallets/click/issues/2846">#2846</a></li> <li>Don't include envvar in error hint when not configured. <a href="https://redirect.github.com/pallets/click/issues/2971">#2971</a> <a href="https://redirect.github.com/pallets/click/issues/2972">#2972</a></li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/pallets/click/blob/main/CHANGES.rst">click's changelog</a>.</em></p> <blockquote> <h2>Version 8.3.0</h2> <p>Released 2025-09-17</p> <ul> <li> <p><strong>Improved flag option handling</strong>: Reworked the relationship between <code>flag_value</code> and <code>default</code> parameters for better consistency:</p> <ul> <li>The <code>default</code> parameter value is now preserved as-is and passed directly to CLI functions (no more unexpected transformations)</li> <li>Exception: flag options with <code>default=True</code> maintain backward compatibility by defaulting to their <code>flag_value</code></li> <li>The <code>default</code> parameter can now be any type (<code>bool</code>, <code>None</code>, etc.)</li> <li>Fixes inconsistencies reported in: :issue:<code>1992</code> :issue:<code>2514</code> :issue:<code>2610</code> :issue:<code>3024</code> :pr:<code>3030</code></li> </ul> </li> <li> <p>Allow <code>default</code> to be set on <code>Argument</code> for <code>nargs = -1</code>. :issue:<code>2164</code> :pr:<code>3030</code></p> </li> <li> <p>Show correct auto complete value for <code>nargs</code> option in combination with flag option :issue:<code>2813</code></p> </li> <li> <p>Fix handling of quoted and escaped parameters in Fish autocompletion. :issue:<code>2995</code> :pr:<code>3013</code></p> </li> <li> <p>Lazily import <code>shutil</code>. :pr:<code>3023</code></p> </li> <li> <p>Properly forward exception information to resources registered with <code>click.core.Context.with_resource()</code>. :issue:<code>2447</code> :pr:<code>3058</code></p> </li> <li> <p>Fix regression related to EOF handling in <code>CliRunner</code>. :issue:<code>2939</code> :pr:<code>2940</code></p> </li> </ul> <h2>Version 8.2.2</h2> <p>Released 2025-07-31</p> <ul> <li>Fix reconciliation of <code>default</code>, <code>flag_value</code> and <code>type</code> parameters for flag options, as well as parsing and normalization of environment variables. :issue:<code>2952</code> :pr:<code>2956</code></li> <li>Fix typing issue in <code>BadParameter</code> and <code>MissingParameter</code> exceptions for the parameter <code>param_hint</code> that did not allow for a sequence of string where the underlying function <code>_join_param_hints</code> allows for it. :issue:<code>2777</code> :pr:<code>2990</code></li> <li>Use the value of <code>Enum</code> choices to render their default value in help screen. Refs :issue:<code>2911</code> :pr:<code>3004</code></li> <li>Fix completion for the Z shell (<code>zsh</code>) for completion items containing colons. :issue:<code>2703</code> :pr:<code>2846</code></li> <li>Don't include envvar in error hint when not configured. :issue:<code>2971</code> :pr:<code>2972</code></li> <li>Fix a rare race in <code>click.testing.StreamMixer</code>'s finalization that manifested as a <code>ValueError</code> on close in a multi-threaded test session. :issue:<code>2993</code> :pr:<code>2991</code></li> </ul> <h2>Version 8.2.1</h2> <p>Released 2025-05-20</p> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/pallets/click/commit/00fadb8904387158ce6e9aa1573be770446895c1"><code>00fadb8</code></a> Release version 8.3.0</li> <li><a href="https://github.com/pallets/click/commit/2a0e3ba907927ade6951d5732b775f11b54cb766"><code>2a0e3ba</code></a> testing/CliRunner: Fix regression related to EOF introduced in 262bdf0 (<a href="https://redirect.github.com/pallets/click/issues/2940">#2940</a>)</li> <li><a href="https://github.com/pallets/click/commit/e11a1efc3395e998a1521a0dc35672a799e78d30"><code>e11a1ef</code></a> Merge branch 'main' into fix-cli-runner-prompt-eof-handling</li> <li><a href="https://github.com/pallets/click/commit/36deba8a95a2585de1a2aa4475b7f054f52830ac"><code>36deba8</code></a> Forward exception information to resources registered in a context (<a href="https://redirect.github.com/pallets/click/issues/3058">#3058</a>)</li> <li><a href="https://github.com/pallets/click/commit/f2cae7ae997cd32311cab3dede4c2b89fe05e191"><code>f2cae7a</code></a> <a href="https://redirect.github.com/pallets/click/issues/2447">#2447</a> Add summary of PR to changelog for 8.3.x</li> <li><a href="https://github.com/pallets/click/commit/7c7ec36354f49d1a092cb077fa4881ea4d70ba01"><code>7c7ec36</code></a> <a href="https://redirect.github.com/pallets/click/issues/2447">#2447</a> Split resource exception handling tests in single and nested</li> <li><a href="https://github.com/pallets/click/commit/92129c552da88ac30b578132031efa4b003ecc46"><code>92129c5</code></a> <a href="https://redirect.github.com/pallets/click/issues/2447">#2447</a> Added exception forwarding to context tests</li> <li><a href="https://github.com/pallets/click/commit/555fa9bb37770a6845a98be60b0c84876775552e"><code>555fa9b</code></a> <a href="https://redirect.github.com/pallets/click/issues/2447">#2447</a> Forward exception data to exit stack when calling <code>__exit__</code></li> <li><a href="https://github.com/pallets/click/commit/16fe802a3f96c4c8fa3cd382f1a7577fda0c5321"><code>16fe802</code></a> Add more tests on <code>Enum</code> rendering (<a href="https://redirect.github.com/pallets/click/issues/3053">#3053</a>)</li> <li><a href="https://github.com/pallets/click/commit/d36de6fc67882f23d7a7d61cd4c0e25e0f88b0ac"><code>d36de6f</code></a> Add more tests on Enum rendering their item's names and not values</li> <li>Additional commits viewable in <a href="https://github.com/pallets/click/compare/8.1.8...8.3.0">compare view</a></li> </ul> </details> <br /> Updates `exceptiongroup` from 1.2.2 to 1.3.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/agronholm/exceptiongroup/releases">exceptiongroup's releases</a>.</em></p> <blockquote> <h2>1.3.0</h2> <ul> <li>Added <code>**kwargs</code> to function and method signatures as appropriate to match the signatures in the standard library</li> <li>In line with the stdlib typings in typeshed, updated <code>(Base)ExceptionGroup</code> generic types to define defaults for their generic arguments (defaulting to <code>BaseExceptionGroup[BaseException]</code> and <code>ExceptionGroup[Exception]</code>) (PR by <a href="https://github.com/mikenerone"><code>@mikenerone</code></a>)</li> <li>Changed <code>BaseExceptionGroup.__init__()</code> to directly call <code>BaseException.__init__()</code> instead of the superclass <code>__init__()</code> in order to emulate the CPython behavior (broken or not) (PR by <a href="https://github.com/cfbolz"><code>@cfbolz</code></a>)</li> <li>Changed the <code>exceptions</code> attribute to always return the same tuple of exceptions, created from the original exceptions sequence passed to <code>BaseExceptionGroup</code> to match CPython behavior (<a href="https://redirect.github.com/agronholm/exceptiongroup/issues/143">#143</a>)</li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/agronholm/exceptiongroup/blob/main/CHANGES.rst">exceptiongroup's changelog</a>.</em></p> <blockquote> <h1>Version history</h1> <p>This library adheres to <code>Semantic Versioning 2.0 <http://semver.org/></code>_.</p> <p><strong>1.3.0</strong></p> <ul> <li>Added <code>**kwargs</code> to function and method signatures as appropriate to match the signatures in the standard library</li> <li>In line with the stdlib typings in typeshed, updated <code>(Base)ExceptionGroup</code> generic types to define defaults for their generic arguments (defaulting to <code>BaseExceptionGroup[BaseException]</code> and <code>ExceptionGroup[Exception]</code>) (PR by <a href="https://github.com/mikenerone"><code>@mikenerone</code></a>)</li> <li>Changed <code>BaseExceptionGroup.__init__()</code> to directly call <code>BaseException.__init__()</code> instead of the superclass <code>__init__()</code> in order to emulate the CPython behavior (broken or not) (PR by <a href="https://github.com/cfbolz"><code>@cfbolz</code></a>)</li> <li>Changed the <code>exceptions</code> attribute to always return the same tuple of exceptions, created from the original exceptions sequence passed to <code>BaseExceptionGroup</code> to match CPython behavior (<code>[#143](https://github.com/agronholm/exceptiongroup/issues/143) <https://github.com/agronholm/exceptiongroup/issues/143></code>_)</li> </ul> <p><strong>1.2.2</strong></p> <ul> <li>Removed an <code>assert</code> in <code>exceptiongroup._formatting</code> that caused compatibility issues with Sentry (<code>[#123](https://github.com/agronholm/exceptiongroup/issues/123) <https://github.com/agronholm/exceptiongroup/issues/123></code>_)</li> </ul> <p><strong>1.2.1</strong></p> <ul> <li>Updated the copying of <code>__notes__</code> to match CPython behavior (PR by CF Bolz-Tereick)</li> <li>Corrected the type annotation of the exception handler callback to accept a <code>BaseExceptionGroup</code> instead of <code>BaseException</code></li> <li>Fixed type errors on Python < 3.10 and the type annotation of <code>suppress()</code> (PR by John Litborn)</li> </ul> <p><strong>1.2.0</strong></p> <ul> <li>Added special monkeypatching if <code>Apport <https://github.com/canonical/apport></code>_ has overridden <code>sys.excepthook</code> so it will format exception groups correctly (PR by John Litborn)</li> <li>Added a backport of <code>contextlib.suppress()</code> from Python 3.12.1 which also handles suppressing exceptions inside exception groups</li> <li>Fixed bare <code>raise</code> in a handler reraising the original naked exception rather than an exception group which is what is raised when you do a <code>raise</code> in an <code>except*</code> handler</li> </ul> <p><strong>1.1.3</strong></p> <ul> <li><code>catch()</code> now raises a <code>TypeError</code> if passed an async exception handler instead of just giving a <code>RuntimeWarning</code> about the coroutine never being awaited. (<a href="https://redirect.github.com/agronholm/exceptiongroup/issues/66">#66</a>, PR by John Litborn)</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/agronholm/exceptiongroup/commit/77fba8a871408ff2c48f536e5e73b1918239ba5f"><code>77fba8a</code></a> Added the release version</li> <li><a href="https://github.com/agronholm/exceptiongroup/commit/5e153aa379ac53af79cc7f5e287f77929cb4d0dc"><code>5e153aa</code></a> Revert "Migrated test dependencies to dependency groups"</li> <li><a href="https://github.com/agronholm/exceptiongroup/commit/5000bfea208ad59e3a20e2fb91a513ad559711b1"><code>5000bfe</code></a> Migrated tox configuration to native TOML</li> <li><a href="https://github.com/agronholm/exceptiongroup/commit/427220d67a52585e98575103b090b5fdaf87a899"><code>427220d</code></a> Updated pytest options</li> <li><a href="https://github.com/agronholm/exceptiongroup/commit/4ca264fa3605d52067c20b351a0d3b947fa1f363"><code>4ca264f</code></a> Migrated test dependencies to dependency groups</li> <li><a href="https://github.com/agronholm/exceptiongroup/commit/163c3a8cb27f8a5325258b5a83e7cf8fc002c3b7"><code>163c3a8</code></a> Marked test_exceptions_mutate_original_sequence as xfail on pypy3.11</li> <li><a href="https://github.com/agronholm/exceptiongroup/commit/a1765740db2d55d1eb91d67a8fbbb355caf7881b"><code>a176574</code></a> Always create the exceptions tuple at init and return it from the exceptions ...</li> <li><a href="https://github.com/agronholm/exceptiongroup/commit/550b79621cc35892413fa91903a1d6c7951d0449"><code>550b796</code></a> Added BaseExceptionGroup.<strong>init</strong>, following CPython (<a href="https://redirect.github.com/agronholm/exceptiongroup/issues/142">#142</a>)</li> <li><a href="https://github.com/agronholm/exceptiongroup/commit/2a84dfd5599bca0c653143f0f4252d38afac9867"><code>2a84dfd</code></a> Added typevar defaults to (Base)ExceptionGroup (<a href="https://redirect.github.com/agronholm/exceptiongroup/issues/147">#147</a>)</li> <li><a href="https://github.com/agronholm/exceptiongroup/commit/fb9133b495fc82bc2907e8cfbdff6c6dc3087e2f"><code>fb9133b</code></a> [pre-commit.ci] pre-commit autoupdate (<a href="https://redirect.github.com/agronholm/exceptiongroup/issues/145">#145</a>)</li> <li>Additional commits viewable in <a href="https://github.com/agronholm/exceptiongroup/compare/1.2.2...1.3.0">compare view</a></li> </ul> </details> <br /> Updates `fastapi` from 0.115.13 to 0.120.3 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/fastapi/fastapi/releases">fastapi's releases</a>.</em></p> <blockquote> <h2>0.120.3</h2> <h3>Refactors</h3> <ul> <li>♻️ Reduce internal cyclic recursion in dependencies, from 2 functions calling each other to 1 calling itself. PR <a href="https://redirect.github.com/fastapi/fastapi/pull/14256">#14256</a> by <a href="https://github.com/tiangolo"><code>@tiangolo</code></a>.</li> <li>♻️ Refactor internals of dependencies, simplify code and remove <code>get_param_sub_dependant</code>. PR <a href="https://redirect.github.com/fastapi/fastapi/pull/14255">#14255</a> by <a href="https://github.com/tiangolo"><code>@tiangolo</code></a>.</li> <li>♻️ Refactor internals of dependencies, simplify using dataclasses. PR <a href="https://redirect.github.com/fastapi/fastapi/pull/14254">#14254</a> by <a href="https://github.com/tiangolo"><code>@tiangolo</code></a>.</li> </ul> <h3>Docs</h3> <ul> <li>📝 Update note for untranslated pages. PR <a href="https://redirect.github.com/fastapi/fastapi/pull/14257">#14257</a> by <a href="https://github.com/YuriiMotov"><code>@YuriiMotov</code></a>.</li> </ul> <h2>0.120.2</h2> <h3>Fixes</h3> <ul> <li>🐛 Fix separation of schemas with nested models introduced in 0.119.0. PR <a href="https://redirect.github.com/fastapi/fastapi/pull/14246">#14246</a> by <a href="https://github.com/tiangolo"><code>@tiangolo</code></a>.</li> </ul> <h3>Internal</h3> <ul> <li>🔧 Add sponsor: SerpApi. PR <a href="https://redirect.github.com/fastapi/fastapi/pull/14248">#14248</a> by <a href="https://github.com/tiangolo"><code>@tiangolo</code></a>.</li> <li>⬆ Bump actions/download-artifact from 5 to 6. PR <a href="https://redirect.github.com/fastapi/fastapi/pull/14236">#14236</a> by <a href="https://github.com/apps/dependabot"><code>@dependabot[bot]</code></a>.</li> <li>⬆ [pre-commit.ci] pre-commit autoupdate. PR <a href="https://redirect.github.com/fastapi/fastapi/pull/14237">#14237</a> by <a href="https://github.com/apps/pre-commit-ci"><code>@pre-commit-ci[bot]</code></a>.</li> <li>⬆ Bump actions/upload-artifact from 4 to 5. PR <a href="https://redirect.github.com/fastapi/fastapi/pull/14235">#14235</a> by <a href="https://github.com/apps/dependabot"><code>@dependabot[bot]</code></a>.</li> </ul> <h2>0.120.1</h2> <h3>Upgrades</h3> <ul> <li>⬆️ Bump Starlette to <<code>0.50.0</code>. PR <a href="https://redirect.github.com/fastapi/fastapi/pull/14234">#14234</a> by <a href="https://github.com/YuriiMotov"><code>@YuriiMotov</code></a>.</li> </ul> <h3>Internal</h3> <ul> <li>🔧 Add <code>license</code> and <code>license-files</code> to <code>pyproject.toml</code>, remove <code>License</code> from <code>classifiers</code>. PR <a href="https://redirect.github.com/fastapi/fastapi/pull/14230">#14230</a> by <a href="https://github.com/YuriiMotov"><code>@YuriiMotov</code></a>.</li> </ul> <h2>0.120.0</h2> <p>There are no major nor breaking changes in this release. ☕️</p> <p>The internal reference documentation now uses <code>annotated_doc.Doc</code> instead of <code>typing_extensions.Doc</code>, this adds a new (very small) dependency on <a href="https://github.com/fastapi/annotated-doc"><code>annotated-doc</code></a>, a package made just to provide that <code>Doc</code> documentation utility class.</p> <p>I would expect <code>typing_extensions.Doc</code> to be deprecated and then removed at some point from <code>typing_extensions</code>, for that reason there's the new <code>annotated-doc</code> micro-package. If you are curious about this, you can read more in the repo for <a href="https://github.com/fastapi/annotated-doc"><code>annotated-doc</code></a>.</p> <p>This new version <code>0.120.0</code> only contains that transition to the new home package for that utility class <code>Doc</code>.</p> <h3>Translations</h3> <ul> <li>🌐 Sync German docs. PR <a href="https://redirect.github.com/fastapi/fastapi/pull/14188">#14188</a> by <a href="https://github.com/nilslindemann"><code>@nilslindemann</code></a>.</li> </ul> <h3>Internal</h3> <ul> <li>➕ Migrate internal reference documentation from <code>typing_extensions.Doc</code> to <code>annotated_doc.Doc</code>. PR <a href="https://redirect.github.com/fastapi/fastapi/pull/14222">#14222</a> by <a href="https://github.com/tiangolo"><code>@tiangolo</code></a>.</li> <li>🛠️ Update German LLM prompt and test file. PR <a href="https://redirect.github.com/fastapi/fastapi/pull/14189">#14189</a> by <a href="https://github.com/nilslindemann"><code>@nilslindemann</code></a>.</li> <li>⬆ [pre-commit.ci] pre-commit autoupdate. PR <a href="https://redirect.github.com/fastapi/fastapi/pull/14181">#14181</a> by <a href="https://github.com/apps/pre-commit-ci"><code>@pre-commit-ci[bot]</code></a>.</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/fastapi/fastapi/commit/2cf04ee30db9df2db04a5b1e0d2c625dfbf1a211"><code>2cf04ee</code></a> 🔖 Release version 0.120.3</li> <li><a href="https://github.com/fastapi/fastapi/commit/ec00f5a90f8f9030e8d92b7fad19ab4bde7e738f"><code>ec00f5a</code></a> 📝 Update release notes</li> <li><a href="https://github.com/fastapi/fastapi/commit/8b46d8821b199f9c45e1383c296275fac21d01d8"><code>8b46d88</code></a> 📝 Update note for untranslated pages (<a href="https://redirect.github.com/fastapi/fastapi/issues/14257">#14257</a>)</li> <li><a href="https://github.com/fastapi/fastapi/commit/17fcbbe9102f0af63ad615ebec3ccccd0760555f"><code>17fcbbe</code></a> 📝 Update release notes</li> <li><a href="https://github.com/fastapi/fastapi/commit/dcfb8b9dda7b8117141b89e84527b48f978e0b31"><code>dcfb8b9</code></a> ♻️ Reduce internal cyclic recursion in dependencies, from 2 functions calling...</li> <li><a href="https://github.com/fastapi/fastapi/commit/1fc586c3a5ae457457c5c70adddb07c7e9185f16"><code>1fc586c</code></a> 📝 Update release notes</li> <li><a href="https://github.com/fastapi/fastapi/commit/bb88a0f94a9633b861f90f6752e397980a7cfea9"><code>bb88a0f</code></a> ♻️ Refactor internals of dependencies, simplify code and remove `get_param_su...</li> <li><a href="https://github.com/fastapi/fastapi/commit/9d1a384f4f904aaf72be5a73a2f721f92fad3e9e"><code>9d1a384</code></a> 📝 Update release notes</li> <li><a href="https://github.com/fastapi/fastapi/commit/c144f9fbd356e7e378a6b42cff68cf4a4667111a"><code>c144f9f</code></a> ♻️ Refactor internals of dependencies, simplify using dataclasses (<a href="https://redirect.github.com/fastapi/fastapi/issues/14254">#14254</a>)</li> <li><a href="https://github.com/fastapi/fastapi/commit/22ccca21fc13b7ac138e277490ec4d05b4f5094a"><code>22ccca2</code></a> 🔖 Release version 0.120.2</li> <li>Additional commits viewable in <a href="https://github.com/fastapi/fastapi/compare/0.115.13...0.120.3">compare view</a></li> </ul> </details> <br /> Updates `h11` from 0.14.0 to 0.16.0 <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/python-hyper/h11/commit/1c5b07581f058886c8bdd87adababd7d959dc7ca"><code>1c5b075</code></a> this time for surer</li> <li><a href="https://github.com/python-hyper/h11/commit/d9c369935e853a7ee1aeb7e481f6dddf9b9c9b8a"><code>d9c3699</code></a> this time for sure...</li> <li><a href="https://github.com/python-hyper/h11/commit/d91b9dd2290a25c8c3f5ec15feb57de5873e6e39"><code>d91b9dd</code></a> blacken</li> <li><a href="https://github.com/python-hyper/h11/commit/5a4683ca466b59bbab9b19cfea20ee157b31cee0"><code>5a4683c</code></a> Soothe mypy</li> <li><a href="https://github.com/python-hyper/h11/commit/9c9567f0a92d13a83a8d8ebdbc757c8c2d384536"><code>9c9567f</code></a> Bump version to 0.16.0</li> <li><a href="https://github.com/python-hyper/h11/commit/114803a29ce50116dc47951c690ad4892b1a36ed"><code>114803a</code></a> Merge commit from fork</li> <li><a href="https://github.com/python-hyper/h11/commit/9462006f6ce4941661888228cbd4ac1ea80689b0"><code>9462006</code></a> Bump version to 0.15.0</li> <li><a href="https://github.com/python-hyper/h11/commit/70a96bea8e55403e5d92db14c111432c6d7a8685"><code>70a96be</code></a> Merge pull request <a href="https://redirect.github.com/python-hyper/h11/issues/181">#181</a> from Julien00859/Julien00859/get_int_max_str_digits</li> <li><a href="https://github.com/python-hyper/h11/commit/60782ad107e538b9312aac7e1c119c8358bf797c"><code>60782ad</code></a> Reject Content-Length longer 1 billion TB</li> <li><a href="https://github.com/python-hyper/h11/commit/dff7cc397a26ed4acdedd92d1bda6c8f18a6ed9f"><code>dff7cc3</code></a> Validate Chunked-Encoding chunk footer</li> <li>Additional commits viewable in <a href="https://github.com/python-hyper/h11/compare/v0.14.0...v0.16.0">compare view</a></li> </ul> </details> <br /> Updates `idna` from 3.10 to 3.11 <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/kjd/idna/blob/master/HISTORY.rst">idna's changelog</a>.</em></p> <blockquote> <p>3.11 (2025-10-12)</p> <ul> <li>Update to Unicode 16.0.0, including significant changes to UTS46 processing. As a result of Unicode ending support for it, transitional processing no longer has an effect and returns the same result.</li> <li>Add support for Python 3.14, lowest supported version is Python 3.8.</li> <li>Various updates to packaging, including PEP 740 support.</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/kjd/idna/commit/ad949ee3052c2265c66e3df2dd8871a5832ba327"><code>ad949ee</code></a> Release v3.11</li> <li><a href="https://github.com/kjd/idna/commit/cae4ba779e0a543823894bd4136651c187944da8"><code>cae4ba7</code></a> Second release candidate for 3.11</li> <li><a href="https://github.com/kjd/idna/commit/8adb305165c77c4a45d1568a70ead75d2197692c"><code>8adb305</code></a> Add space in RST link</li> <li><a href="https://github.com/kjd/idna/commit/74cb2b652bb06133b0c4ab52cc98221be63162cf"><code>74cb2b6</code></a> Release candidate for 3.11</li> <li><a href="https://github.com/kjd/idna/commit/05dab09fdde5bbf7d52f757c4dc62e0ba934cca8"><code>05dab09</code></a> Format idna-data with ruff</li> <li><a href="https://github.com/kjd/idna/commit/90eac78b737d26613776b490432fc6d926b15c55"><code>90eac78</code></a> Apply ruff formatting</li> <li><a href="https://github.com/kjd/idna/commit/a31ce7ecc0b767e40abb5ce28744ac567b73f366"><code>a31ce7e</code></a> Remove errant test vectors</li> <li><a href="https://github.com/kjd/idna/commit/81f03334211c78c1832991ce70ebafb3cbfbb79c"><code>81f0333</code></a> Omit vectors known to be broken in test suite</li> <li><a href="https://github.com/kjd/idna/commit/a0f32578c0cac28c7ffbb4c860c92eb2b9b579bd"><code>a0f3257</code></a> Merge branch 'master' into unicode-16-uts46-changes</li> <li><a href="https://github.com/kjd/idna/commit/38d98860e6a1ab92fd35ab09ea4739feabf339a3"><code>38d9886</code></a> Remove extra UTS46 test vector</li> <li>Additional commits viewable in <a href="https://github.com/kjd/idna/compare/v3.10...v3.11">compare view</a></li> </ul> </details> <br /> Updates `immutabledict` from 4.2.1 to 4.2.2 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/corenting/immutabledict/releases">immutabledict's releases</a>.</em></p> <blockquote> <h2>Version 4.2.2</h2> <p>No code changes.</p> <ul> <li>Update classifiers, Github Actions... for Python 3.14</li> <li>Update metadatas for PEP 639</li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/corenting/immutabledict/blob/master/CHANGELOG.md">immutabledict's changelog</a>.</em></p> <blockquote> <h2>Version 4.2.2</h2> <p>No code changes.</p> <ul> <li>Update classifiers, Github Actions... for Python 3.14</li> <li>Update metadatas for PEP 639</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/corenting/immutabledict/commit/1f70d2cc207d9d6ca76b9b0c53f75cf235ee1c0e"><code>1f70d2c</code></a> Merge pull request <a href="https://redirect.github.com/corenting/immutabledict/issues/399">#399</a> from corenting/check/update-metadata</li> <li><a href="https://github.com/corenting/immutabledict/commit/e32030042f6270f61010d8ae72812cdbb28ed6af"><code>e320300</code></a> feat: release 4.2.2</li> <li><a href="https://github.com/corenting/immutabledict/commit/e4fdf60efff505a4af119240ee1a10948c28b7d4"><code>e4fdf60</code></a> Merge pull request <a href="https://redirect.github.com/corenting/immutabledict/issues/398">#398</a> from corenting/chore/test-against-314-release</li> <li><a href="https://github.com/corenting/immutabledict/commit/3387e42eaf31998d8e474f562af006c11ca7decb"><code>3387e42</code></a> chore: update pyproject.toml</li> <li><a href="https://github.com/corenting/immutabledict/commit/24e51407a888fa98b4c2936f02ec4841ff61934b"><code>24e5140</code></a> chore: update dev dependencies</li> <li><a href="https://github.com/corenting/immutabledict/commit/b224d2b348458b1fd1dd86d6a030e2407eb96bff"><code>b224d2b</code></a> chore: test against 3.14</li> <li><a href="https://github.com/corenting/immutabledict/commit/0b642786a73f5328c2aea98fd4f00a661f34a537"><code>0b64278</code></a> Merge pull request <a href="https://redirect.github.com/corenting/immutabledict/issues/396">#396</a> from corenting/dependabot/pip/development-dependencie...</li> <li><a href="https://github.com/corenting/immutabledict/commit/7a08490d6106a678c5e0121ccce415dfc425cc01"><code>7a08490</code></a> build(deps-dev): bump ruff in the development-dependencies group</li> <li><a href="https://github.com/corenting/immutabledict/commit/71565e83aa3cd17af7e952ceac3f273dee877794"><code>71565e8</code></a> Merge pull request <a href="https://redirect.github.com/corenting/immutabledict/issues/395">#395</a> from corenting/dependabot/pip/development-dependencie...</li> <li><a href="https://github.com/corenting/immutabledict/commit/2d787412f2abefcdffe3d6892b0cfe7761789264"><code>2d78741</code></a> build(deps-dev): bump ruff in the development-dependencies group</li> <li>Additional commits viewable in <a href="https://github.com/corenting/immutabledict/compare/v4.2.1...v4.2.2">compare view</a></li> </ul> </details> <br /> Updates `iniconfig` from 2.0.0 to 2.3.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/pytest-dev/iniconfig/releases">iniconfig's releases</a>.</em></p> <blockquote> <h2>Version 2.3.0</h2> <h2>What's Changed</h2> <ul> <li>Add IniConfig.parse() with inline comment stripping and Unicode whitespace handling by <a href="https://github.com/RonnyPfannschmidt"><code>@RonnyPfannschmidt</code></a> in <a href="https://redirect.github.com/pytest-dev/iniconfig/pull/70">pytest-dev/iniconfig#70</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/pytest-dev/iniconfig/compare/v2.2.0...v2.3.0">https://github.com/pytest-dev/iniconfig/compare/v2.2.0...v2.3.0</a></p> <h2>Version 2.2.0</h2> <p>No release notes provided.</p> <h2>v2.1.0</h2> <h2>What's Changed</h2> <ul> <li>fix <a href="https://redirect.github.com/pytest-dev/iniconfig/issues/26">#26</a> - list individuals in license file by <a href="https://github.com/RonnyPfannschmidt"><code>@RonnyPfannschmidt</code></a> in <a href="https://redirect.github.com/pytest-dev/iniconfig/pull/52">pytest-dev/iniconfig#52</a></li> <li>Run tests in CI by <a href="https://github.com/nicoddemus"><code>@nicoddemus</code></a> in <a href="https://redirect.github.com/pytest-dev/iniconfig/pull/53">pytest-dev/iniconfig#53</a></li> <li>Use <code>pypa/gh-action-pypi-publish@release/v1</code> @ GHA by <a href="https://github.com/webknjaz"><code>@webknjaz</code></a> in <a href="https://redirect.github.com/pytest-dev/iniconfig/pull/54">pytest-dev/iniconfig#54</a></li> <li>Add support for Python 3.12-3.13 and drop EOL 3.7 by <a href="https://github.com/hugovk"><code>@hugovk</code></a> in <a href="https://redirect.github.com/pytest-dev/iniconfig/pull/56">pytest-dev/iniconfig#56</a></li> </ul> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/nicoddemus"><code>@nicoddemus</code></a> made their first contribution in <a href="https://redirect.github.com/pytest-dev/iniconfig/pull/53">pytest-dev/iniconfig#53</a></li> <li><a href="https://github.com/webknjaz"><code>@webknjaz</code></a> made their first contribution in <a href="https://redirect.github.com/pytest-dev/iniconfig/pull/54">pytest-dev/iniconfig#54</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/pytest-dev/iniconfig/compare/v2.0.0...v2.1.0">https://github.com/pytest-dev/iniconfig/compare/v2.0.0...v2.1.0</a></p> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/pytest-dev/iniconfig/blob/main/CHANGELOG">iniconfig's changelog</a>.</em></p> <blockquote> <h1>2.3.0</h1> <ul> <li>add IniConfig.parse() classmethod with strip_inline_comments parameter (fixes <a href="https://redirect.github.com/pytest-dev/iniconfig/issues/55">#55</a>) <ul> <li>by default (strip_inline_comments=True), inline comments are properly stripped from values</li> <li>set strip_inline_comments=False to preserve old behavior if needed</li> </ul> </li> <li>IniConfig() constructor maintains backward compatibility (does not strip inline comments)</li> <li>users should migrate to IniConfig.parse() for correct comment handling</li> <li>add strip_section_whitespace parameter to IniConfig.parse() (regarding <a href="https://redirect.github.com/pytest-dev/iniconfig/issues/4">#4</a>) <ul> <li>opt-in parameter to strip Unicode whitespace from section names</li> <li>when True, strips Unicode whitespace (U+00A0, U+2000, U+3000, etc.) from section names</li> <li>when False (default), preserves existing behavior for backward compatibility</li> </ul> </li> <li>…
Changes
Fixes the remaining issue reported in #671:
_asyncio.Process.stdin.sendnot raisingClosedResourceErrororBrokenResourceError, but rather non-AnyIO exceptions. (The analogousstd{out,err}case was already fixed in #752.)I also fixed a missing checkpoint before writing to a subprocess send buffer on asyncio.
I also made
_close = Falseunconditional in asyncio UDPaclose, similar to #980. I'm not sure that this is strictly necessary, but it seems safer and I don't see any downsides. See details in commit message.Checklist
tests/) which would fail without your patchdocs/), in case of behavior changes or newfeatures
docs/versionhistory.rst).