diff --git a/docs/versionhistory.rst b/docs/versionhistory.rst
index a7c5073e..8d02395b 100644
--- a/docs/versionhistory.rst
+++ b/docs/versionhistory.rst
@@ -3,27 +3,7 @@ Version history
This library adheres to `Semantic Versioning 2.0 `_.
-**UNRELEASED**
-
-- Added documentation on how to migrate from AnyIO 3 to 4
-- Fixed the type annotation of ``TaskGroup.start_soon()`` to accept any awaitables
- (already in v3.7.0 but was missing from 4.0.0rc1)
-- Changed ``CancelScope`` to also consider the cancellation count (in addition to the
- cancel message) on asyncio to determine if a cancellation exception should be
- swallowed on scope exit, to combat issues where third party libraries catch the
- ``CancelledError`` and raise another, thus erasing the original cancel message
-- Worked around a `CPython bug `_ that
- caused ``TLSListener.handle_handshake_error()`` on asyncio to log ``"NoneType: None"``
- instead of the error (PR by Ganden Schaffner)
-- Re-added the ``item_type`` argument to ``create_memory_object_stream()`` (but using it
- raises a deprecation warning and does nothing with regards to the static types of the
- returned streams)
-- Fixed processes spawned by ``anyio.to_process()`` being "lost" as unusable to the
- process pool when processes that have idled over 5 minutes are pruned at part of the
- ``to_process.run_sync()`` call, leading to increased memory consumption
- (PR by Anael Gorfinkel)
-
-**4.0.0rc1**
+**4.0.0**
- **BACKWARDS INCOMPATIBLE** Replaced AnyIO's own ``ExceptionGroup`` class with the PEP
654 ``BaseExceptionGroup`` and ``ExceptionGroup``
@@ -38,7 +18,7 @@ This library adheres to `Semantic Versioning 2.0 `_.
whether there are running child tasks to be waited on
- On asyncio, cancel scopes will defer cancelling tasks that are scheduled to resume
with a finished future
- - On asyncio and Python 3.9 or later, cancel scopes now only suppress cancellation
+ - On asyncio and Python 3.9/3.10, cancel scopes now only suppress cancellation
exceptions if the cancel message matches the scope
- Task groups on all backends now raise a single cancellation exception when an outer
cancel scope is cancelled, and no exceptions other than cancellation exceptions are
@@ -71,8 +51,8 @@ This library adheres to `Semantic Versioning 2.0 `_.
in a thread running trio or curio (PR by Ganden Schaffner)
- Improved type annotations:
- - **BACKWARDS INCOMPATIBLE** ``create_memory_object_stream`` no longer accepts an
- ``item_type`` argument for static typing. Use
+ - The ``item_type`` argument of ``create_memory_object_stream`` was deprecated.
+ To indicate the item type handled by the stream, use
``create_memory_object_stream[T_Item]()`` instead. Type checking should no longer
fail when annotating memory object streams with uninstantiable item types (PR by
Ganden Schaffner)
@@ -88,6 +68,29 @@ This library adheres to `Semantic Versioning 2.0 `_.
(``concurrent.futures.wait()``) when they're cancelled
- Removed unnecessary extra waiting cycle in ``Event.wait()`` on asyncio in the case
where the event was not yet set
+- Fixed processes spawned by ``anyio.to_process()`` being "lost" as unusable to the
+ process pool when processes that have idled over 5 minutes are pruned at part of the
+ ``to_process.run_sync()`` call, leading to increased memory consumption
+ (PR by Anael Gorfinkel)
+
+Changes since 4.0.0rc1:
+
+- Fixed the type annotation of ``TaskGroup.start_soon()`` to accept any awaitables
+ (already in v3.7.0 but was missing from 4.0.0rc1)
+- Changed ``CancelScope`` to also consider the cancellation count (in addition to the
+ cancel message) on asyncio to determine if a cancellation exception should be
+ swallowed on scope exit, to combat issues where third party libraries catch the
+ ``CancelledError`` and raise another, thus erasing the original cancel message
+- Worked around a `CPython bug `_ that
+ caused ``TLSListener.handle_handshake_error()`` on asyncio to log ``"NoneType: None"``
+ instead of the error (PR by Ganden Schaffner)
+- Re-added the ``item_type`` argument to ``create_memory_object_stream()`` (but using it
+ raises a deprecation warning and does nothing with regards to the static types of the
+ returned streams)
+- Fixed processes spawned by ``anyio.to_process()`` being "lost" as unusable to the
+ process pool when processes that have idled over 5 minutes are pruned at part of the
+ ``to_process.run_sync()`` call, leading to increased memory consumption
+ (PR by Anael Gorfinkel)
**3.7.1**