Skip to content

Fix Process.stdin.send exceptions and checkpointing on asyncio - #1002

Merged
agronholm merged 14 commits into
agronholm:masterfrom
gschaffner:fix-closed-vs-broken
Oct 22, 2025
Merged

Fix Process.stdin.send exceptions and checkpointing on asyncio#1002
agronholm merged 14 commits into
agronholm:masterfrom
gschaffner:fix-closed-vs-broken

Conversation

@gschaffner

Copy link
Copy Markdown
Collaborator

Changes

Fixes the remaining issue reported in #671:

_asyncio.Process.stdin.send not raising ClosedResourceError or BrokenResourceError, but rather non-AnyIO exceptions. (The analogous std{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 = False unconditional in asyncio UDP aclose, 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

  • You've added tests (in tests/) which would fail without your patch
  • You've updated the documentation (in docs/), in case of behavior changes or new
    features
  • You've added a new changelog entry (in docs/versionhistory.rst).

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.
Comment thread src/anyio/_backends/_asyncio.py
@@ -1052,12 +1052,26 @@ async def aclose(self) -> None:
@dataclass(eq=False)
class StreamWriterWrapper(abc.ByteSendStream):

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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?

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@gschaffner
gschaffner force-pushed the fix-closed-vs-broken branch from 19017a0 to f784e97 Compare October 17, 2025 06:27
@gschaffner

Copy link
Copy Markdown
Collaborator Author

@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 agronholm left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good. I left some formatting changes and other comments.

Comment thread src/anyio/_backends/_asyncio.py Outdated
async def send(self, item: bytes) -> None:
self._stream.write(item)
await self._stream.drain()
await AsyncIOBackend.checkpoint()

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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().

@gschaffner gschaffner Oct 17, 2025

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@agronholm agronholm Oct 21, 2025

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@gschaffner gschaffner Oct 22, 2025

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done.

Comment thread src/anyio/_backends/_asyncio.py
Comment thread src/anyio/_backends/_asyncio.py
Comment thread tests/test_subprocesses.py
@@ -1052,12 +1052,26 @@ async def aclose(self) -> None:
@dataclass(eq=False)
class StreamWriterWrapper(abc.ByteSendStream):

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@agronholm

Copy link
Copy Markdown
Owner

Note that a test on Windows + Python 3.9 is genuinely failing.

gschaffner and others added 3 commits October 17, 2025 22:20
Co-authored-by: Alex Grönholm <alex.gronholm@nextday.fi>
Co-authored-by: Alex Grönholm <alex.gronholm@nextday.fi>
@gschaffner

gschaffner commented Oct 18, 2025

Copy link
Copy Markdown
Collaborator Author

@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.

Note that a test on Windows + Python 3.9 is genuinely failing.

See Vizonex/Winloop#84

@Vizonex

Vizonex commented Oct 18, 2025

Copy link
Copy Markdown
Contributor

@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.

Note that a test on Windows + Python 3.9 is genuinely failing.

See Vizonex/Winloop#84

@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 =)

@Vizonex

Vizonex commented Oct 18, 2025

Copy link
Copy Markdown
Contributor

@agronholm I fixed the bug on winloop's end there should be a release for 0.3.1 shortly here later today.

@agronholm

Copy link
Copy Markdown
Owner

@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.

@agronholm agronholm added this to the 4.12 milestone Oct 21, 2025
@gschaffner

Copy link
Copy Markdown
Collaborator Author

It looks like test_exceptions_after_subprocess_closes_standard_streams[asyncio+winloop] is still failing sporadically on Winloop 0.3.1, on both 3.9 and 3.13. Looking into it.

@Vizonex

Vizonex commented Oct 22, 2025

Copy link
Copy Markdown
Contributor

It looks like test_exceptions_after_subprocess_closes_standard_streams[asyncio+winloop] is still failing sporadically on Winloop 0.3.1, on both 3.9 and 3.13. Looking into it.

@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...

@gschaffner

gschaffner commented Oct 22, 2025

Copy link
Copy Markdown
Collaborator Author

When I remove the schedule point at the start of send(), the test that is sporadically failing on asyncio+winloop (test_exceptions_after_subprocess_closes_standard_streams) starts failing on asyncio+uvloop too (but not stdlib asyncio). I'm wondering if there is a problem with the approach or the test here.

I suppose it's just a race? Perhaps it's fine for subprocess.stdin.send() to return success once or twice after the peer has closed their end of the pipe—even when the event loop1 already knows that the peer closed their end of the pipe—as long as send() eventually starts raising BrokenResourceError?

Footnotes

  1. or at least some parts of the event loop

@gschaffner

Copy link
Copy Markdown
Collaborator Author

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)

@gschaffner

gschaffner commented Oct 22, 2025

Copy link
Copy Markdown
Collaborator Author

On the other hand:

@gschaffner

Copy link
Copy Markdown
Collaborator Author

I've gone ahead and weakened the test to accommodate uvloop's and Winloop's transmission delays. Let me know what you think.

@agronholm agronholm left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

@agronholm
agronholm merged commit 8175082 into agronholm:master Oct 22, 2025
16 checks passed
@Vizonex

Vizonex commented Oct 22, 2025

Copy link
Copy Markdown
Contributor

@agronholm @gschaffner Thank both of you, glad I could be of assistance and that you helped me hunt down some bugs with my library.

@gschaffner
gschaffner deleted the fix-closed-vs-broken branch October 23, 2025 05:18
john-gom added a commit to openfoodfacts/recipe-estimator that referenced this pull request Oct 31, 2025
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 &lt; 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 &lt; 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 = &quot;auto&quot;</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
&lt;http://semver.org/&gt;</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)
&lt;https://github.com/agronholm/anyio/pull/1001&gt;</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)
&lt;https://github.com/agronholm/anyio/pull/960&gt;</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)
&lt;https://github.com/agronholm/anyio/pull/1009&gt;</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)
&lt;https://github.com/agronholm/anyio/issues/671&gt;</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)
&lt;https://github.com/agronholm/anyio/issues/1002&gt;</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)
&lt;https://github.com/agronholm/anyio/issues/1011&gt;</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)
&lt;https://github.com/agronholm/anyio/pull/975&gt;</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)
&lt;https://github.com/agronholm/anyio/issues/256&gt;</code>_)</li>
<li>Added pytest option (<code>anyio_mode = &quot;auto&quot;</code>) to
make the pytest plugin automatically
handle all async tests
(<code>[#971](https://github.com/agronholm/anyio/issues/971)
&lt;https://github.com/agronholm/anyio/pull/971&gt;</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)
&lt;https://github.com/agronholm/anyio/pull/974&gt;</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)
&lt;https://github.com/agronholm/anyio/pull/964&gt;</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)
&lt;https://github.com/agronholm/anyio/issues/857&gt;</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&gt;=68,&lt;=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&gt;=68,&lt;=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
&lt;http://semver.org/&gt;</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)
&lt;https://github.com/agronholm/exceptiongroup/issues/143&gt;</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)
&lt;https://github.com/agronholm/exceptiongroup/issues/123&gt;</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 &lt; 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
&lt;https://github.com/canonical/apport&gt;</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 &quot;Migrated test dependencies to dependency groups&quot;</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 &lt;<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>…
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants