Repository: twisted/twisted

Issue:
Release 23.10.0
This is the PR to track the next release of twisted

Discussion:

Patch:
diff --git a/NEWS.rst b/NEWS.rst
index 0383fb86f0..e38c56a457 100644
--- a/NEWS.rst
+++ b/NEWS.rst
@@ -8,6 +8,101 @@ https://twisted.org/trac/ticket/<number>
 
 .. towncrier release notes start
 
+Twisted 23.10.0 (2023-10-31)
+============================
+
+No changes since 23.10.0.rc1.
+
+
+Features
+--------
+
+- twisted.python.filepath.FilePath and related classes (twisted.python.filepath.IFilepath, twisted.python.filepath.AbstractFilePath, twisted.python.zippath.ZipPath, and twisted.python.zippath.ZipArchive) now have type annotations.  Additionally, FilePath is now generic, describing its mode, so you can annotate variables as FilePath[str] or FilePath[bytes] depending on the types that you wish to get back from the 'path' attribute and related methods like 'basename'. (#11822)
+- When using `CPython`, functions wrapped by `twisted.internet.defer.inlineCallbacks` can have their arguments and return values freed immediately after completion (due to there no longer being circular references). (#11885)
+
+
+Bugfixes
+--------
+
+- Fix TypeError on t.i.cfreactor due to 3.10 type annotation syntax (#11965)
+- Fix the type annotations of DeferredLock.run, DeferredSemaphore.run, maybeDeferred, ensureDeferred, inlineCallbacks and fromCoroutine that used to return Deferred[Any] to return the result of the passed Coroutine/Coroutine function (#11985)
+- Fixed significant performance overhead (CPU and bandwidth) when doing small writes to a TLS transport. Specifically, small writes to a TLS transport are now buffered until the next reactor iteration. (#11989)
+- fix mypy due to hypothesis 6.85 (#11995)
+
+
+Improved Documentation
+----------------------
+
+- The search and version navigation for the documentation hosted on
+  Read The Docs was fixed.
+  This was a regression introduced with 23.8.0. (#12012)
+
+
+Deprecations and Removals
+-------------------------
+
+- Drop support for Python 3.7. Remove twisted[contextvars] extra (contextvars are always available in Python 3.7+) (#11913)
+
+
+Misc
+----
+
+- #5206, #11583, #11787, #11871, #11912, #11921, #11922, #11926, #11932, #11934, #11936, #11938, #11940, #11942, #11945, #11948, #11952, #11953, #11955, #11957, #11959, #11961, #11964, #11973, #11977, #11980, #11982, #11993, #11999, #12004, #12005, #12009
+
+
+Conch
+-----
+
+No significant changes.
+
+
+Web
+---
+
+Bugfixes
+~~~~~~~~
+
+- In Twisted 16.3.0, we changed twisted.web to stop dispatching HTTP/1.1
+  pipelined requests to application code.  There was a bug in this change which
+  still allowed clients which could send multiple full HTTP requests in a single
+  TCP segment to trigger asynchronous processing of later requests, which could
+  lead to out-of-order responses.  This has now been corrected and twisted.web
+  should never process a pipelined request over HTTP/1.1 until the previous
+  request has fully completed. (CVE-2023-46137, GHSA-cq7q-gv5w-rwx2) (#11976)
+
+
+Deprecations and Removals
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+- twisted.dom.microdom and twisted.web.domhelpers are now deprecated. (#3651)
+
+
+Mail
+----
+
+No significant changes.
+
+
+Words
+-----
+
+No significant changes.
+
+
+Names
+-----
+
+No significant changes.
+
+
+Trial
+-----
+
+Misc
+~~~~
+
+- #10115
+
 
 Twisted 23.8.0. (2023-08-28)
 ============================
diff --git a/src/twisted/_version.py b/src/twisted/_version.py
index f93bfba852..820da1c0c1 100644
--- a/src/twisted/_version.py
+++ b/src/twisted/_version.py
@@ -7,5 +7,5 @@ Provides Twisted version information.
 
 from incremental import Version
 
-__version__ = Version("Twisted", 23, 8, 0, post=0)
+__version__ = Version("Twisted", 23, 10, 0, post=0)
 __all__ = ["__version__"]
diff --git a/src/twisted/newsfragments/11583.misc b/src/twisted/newsfragments/11583.misc
deleted file mode 100644
index daabc51017..0000000000
--- a/src/twisted/newsfragments/11583.misc
+++ /dev/null
@@ -1,2 +0,0 @@
-twisted.python._release.CheckNewsfragmentScript was removed as we now use
-towncrier upstream checks for PR CI.
diff --git a/src/twisted/newsfragments/11787.misc b/src/twisted/newsfragments/11787.misc
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/src/twisted/newsfragments/11822.feature b/src/twisted/newsfragments/11822.feature
deleted file mode 100644
index 635ee2914e..0000000000
--- a/src/twisted/newsfragments/11822.feature
+++ /dev/null
@@ -1,1 +0,0 @@
-twisted.python.filepath.FilePath and related classes (twisted.python.filepath.IFilepath, twisted.python.filepath.AbstractFilePath, twisted.python.zippath.ZipPath, and twisted.python.zippath.ZipArchive) now have type annotations.  Additionally, FilePath is now generic, describing its mode, so you can annotate variables as FilePath[str] or FilePath[bytes] depending on the types that you wish to get back from the 'path' attribute and related methods like 'basename'.
\ No newline at end of file
diff --git a/src/twisted/newsfragments/11871.misc b/src/twisted/newsfragments/11871.misc
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/src/twisted/newsfragments/11885.feature b/src/twisted/newsfragments/11885.feature
deleted file mode 100644
index 6b2dfb6b86..0000000000
--- a/src/twisted/newsfragments/11885.feature
+++ /dev/null
@@ -1,1 +0,0 @@
-When using `CPython`, functions wrapped by `twisted.internet.defer.inlineCallbacks` can have their arguments and return values freed immediately after completion (due to there no longer being circular references).
diff --git a/src/twisted/newsfragments/11912.misc b/src/twisted/newsfragments/11912.misc
deleted file mode 100644
index 8ab44ba769..0000000000
--- a/src/twisted/newsfragments/11912.misc
+++ /dev/null
@@ -1,1 +0,0 @@
-Remove deprecated pkg_resources.
diff --git a/src/twisted/newsfragments/11913.removal b/src/twisted/newsfragments/11913.removal
deleted file mode 100644
index 35159785d4..0000000000
--- a/src/twisted/newsfragments/11913.removal
+++ /dev/null
@@ -1,1 +0,0 @@
-Drop support for Python 3.7. Remove twisted[contextvars] extra (contextvars are always available in Python 3.7+)
diff --git a/src/twisted/newsfragments/11921.misc b/src/twisted/newsfragments/11921.misc
deleted file mode 100644
index be80897d2c..0000000000
--- a/src/twisted/newsfragments/11921.misc
+++ /dev/null
@@ -1,1 +0,0 @@
-move mypy.ini config into pyproject.toml
diff --git a/src/twisted/newsfragments/11922.misc b/src/twisted/newsfragments/11922.misc
deleted file mode 100644
index 3f3eff9b99..0000000000
--- a/src/twisted/newsfragments/11922.misc
+++ /dev/null
@@ -1,1 +0,0 @@
-disallow incomplete defs in mypy config
diff --git a/src/twisted/newsfragments/11926.misc b/src/twisted/newsfragments/11926.misc
deleted file mode 100644
index 3dd9488d31..0000000000
--- a/src/twisted/newsfragments/11926.misc
+++ /dev/null
@@ -1,1 +0,0 @@
-revert urllib3 pin
diff --git a/src/twisted/newsfragments/11932.misc b/src/twisted/newsfragments/11932.misc
deleted file mode 100644
index 3e25bf292b..0000000000
--- a/src/twisted/newsfragments/11932.misc
+++ /dev/null
@@ -1,1 +0,0 @@
-Fix URL to mypy badge in readme
diff --git a/src/twisted/newsfragments/11934.misc b/src/twisted/newsfragments/11934.misc
deleted file mode 100644
index 5c41c03dd8..0000000000
--- a/src/twisted/newsfragments/11934.misc
+++ /dev/null
@@ -1,1 +0,0 @@
-Move a few more modules to the mypy disallow_untyped_defs config section
diff --git a/src/twisted/newsfragments/11936.misc b/src/twisted/newsfragments/11936.misc
deleted file mode 100644
index 64f7a1f6c9..0000000000
--- a/src/twisted/newsfragments/11936.misc
+++ /dev/null
@@ -1,1 +0,0 @@
-upgrade to "mypy~=1.5.1" and "mypy-zope~=1.0.1"
diff --git a/src/twisted/newsfragments/11938.misc b/src/twisted/newsfragments/11938.misc
deleted file mode 100644
index 66717a2af2..0000000000
--- a/src/twisted/newsfragments/11938.misc
+++ /dev/null
@@ -1,1 +0,0 @@
-fix readthedocs docs build
diff --git a/src/twisted/newsfragments/11940.misc b/src/twisted/newsfragments/11940.misc
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/src/twisted/newsfragments/11942.misc b/src/twisted/newsfragments/11942.misc
deleted file mode 100644
index 4eccd59612..0000000000
--- a/src/twisted/newsfragments/11942.misc
+++ /dev/null
@@ -1,1 +0,0 @@
-require type annotations in zippath and filepath
diff --git a/src/twisted/newsfragments/11945.misc b/src/twisted/newsfragments/11945.misc
deleted file mode 100644
index 94dc89355d..0000000000
--- a/src/twisted/newsfragments/11945.misc
+++ /dev/null
@@ -1,1 +0,0 @@
-opt into mypy strict by default, remove redundant mypy overrides
diff --git a/src/twisted/newsfragments/11948.misc b/src/twisted/newsfragments/11948.misc
deleted file mode 100644
index 7b6799a1a9..0000000000
--- a/src/twisted/newsfragments/11948.misc
+++ /dev/null
@@ -1,1 +0,0 @@
-configure disallow_untyped_decorators = true
diff --git a/src/twisted/newsfragments/11952.misc b/src/twisted/newsfragments/11952.misc
deleted file mode 100644
index 1fb0d8b280..0000000000
--- a/src/twisted/newsfragments/11952.misc
+++ /dev/null
@@ -1,1 +0,0 @@
-use positional only for _ConcurrencyPrimitive run
diff --git a/src/twisted/newsfragments/11953.misc b/src/twisted/newsfragments/11953.misc
deleted file mode 100644
index 1e43bde92c..0000000000
--- a/src/twisted/newsfragments/11953.misc
+++ /dev/null
@@ -1,1 +0,0 @@
-check_untyped_defs=True in more places
diff --git a/src/twisted/newsfragments/11955.misc b/src/twisted/newsfragments/11955.misc
deleted file mode 100644
index c69fa7ae70..0000000000
--- a/src/twisted/newsfragments/11955.misc
+++ /dev/null
@@ -1,1 +0,0 @@
-Configure mypy warn_return_any = true
diff --git a/src/twisted/newsfragments/11957.misc b/src/twisted/newsfragments/11957.misc
deleted file mode 100644
index 6c77563a40..0000000000
--- a/src/twisted/newsfragments/11957.misc
+++ /dev/null
@@ -1,1 +0,0 @@
-expand mypy .* module overrides
diff --git a/src/twisted/newsfragments/11959.misc b/src/twisted/newsfragments/11959.misc
deleted file mode 100644
index 78da09e660..0000000000
--- a/src/twisted/newsfragments/11959.misc
+++ /dev/null
@@ -1,1 +0,0 @@
-apply autotyping to test modules and commit those that pass mypy
diff --git a/src/twisted/newsfragments/11961.misc b/src/twisted/newsfragments/11961.misc
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/src/twisted/newsfragments/11964.misc b/src/twisted/newsfragments/11964.misc
deleted file mode 100644
index 6411e5f4f6..0000000000
--- a/src/twisted/newsfragments/11964.misc
+++ /dev/null
@@ -1,1 +0,0 @@
-type annotate more tests
diff --git a/src/twisted/newsfragments/11965.bugfix b/src/twisted/newsfragments/11965.bugfix
deleted file mode 100644
index b8a16d2e9a..0000000000
--- a/src/twisted/newsfragments/11965.bugfix
+++ /dev/null
@@ -1,1 +0,0 @@
-Fix TypeError on t.i.cfreactor due to 3.10 type annotation syntax
diff --git a/src/twisted/newsfragments/11973.misc b/src/twisted/newsfragments/11973.misc
deleted file mode 100644
index 40dd09f6d4..0000000000
--- a/src/twisted/newsfragments/11973.misc
+++ /dev/null
@@ -1,1 +0,0 @@
-test on macos python 3.8
diff --git a/src/twisted/newsfragments/11977.misc b/src/twisted/newsfragments/11977.misc
deleted file mode 100644
index af1fdb7206..0000000000
--- a/src/twisted/newsfragments/11977.misc
+++ /dev/null
@@ -1,1 +0,0 @@
-configure mypy disallow_any_generic = true
diff --git a/src/twisted/newsfragments/11980.misc b/src/twisted/newsfragments/11980.misc
deleted file mode 100644
index acc0fc6e66..0000000000
--- a/src/twisted/newsfragments/11980.misc
+++ /dev/null
@@ -1,1 +0,0 @@
-type annotate even more tests
diff --git a/src/twisted/newsfragments/11982.misc b/src/twisted/newsfragments/11982.misc
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/src/twisted/newsfragments/11985.bugfix b/src/twisted/newsfragments/11985.bugfix
deleted file mode 100644
index f14cf433a5..0000000000
--- a/src/twisted/newsfragments/11985.bugfix
+++ /dev/null
@@ -1,1 +0,0 @@
-Fix the type annotations of DeferredLock.run, DeferredSemaphore.run, maybeDeferred, ensureDeferred, inlineCallbacks and fromCoroutine that used to return Deferred[Any] to return the result of the passed Coroutine/Coroutine function
diff --git a/src/twisted/newsfragments/11989.bugfix b/src/twisted/newsfragments/11989.bugfix
deleted file mode 100644
index bdf2171b4d..0000000000
--- a/src/twisted/newsfragments/11989.bugfix
+++ /dev/null
@@ -1,1 +0,0 @@
-Fixed significant performance overhead (CPU and bandwidth) when doing small writes to a TLS transport. Specifically, small writes to a TLS transport are now buffered until the next reactor iteration.
\ No newline at end of file
diff --git a/src/twisted/newsfragments/11993.misc b/src/twisted/newsfragments/11993.misc
deleted file mode 100644
index 6411e5f4f6..0000000000
--- a/src/twisted/newsfragments/11993.misc
+++ /dev/null
@@ -1,1 +0,0 @@
-type annotate more tests
diff --git a/src/twisted/newsfragments/11995.bugfix b/src/twisted/newsfragments/11995.bugfix
deleted file mode 100644
index 026bda5b4c..0000000000
--- a/src/twisted/newsfragments/11995.bugfix
+++ /dev/null
@@ -1,1 +0,0 @@
-fix mypy due to hypothesis 6.85
diff --git a/src/twisted/newsfragments/11999.misc b/src/twisted/newsfragments/11999.misc
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/src/twisted/newsfragments/12004.misc b/src/twisted/newsfragments/12004.misc
deleted file mode 100644
index 6411e5f4f6..0000000000
--- a/src/twisted/newsfragments/12004.misc
+++ /dev/null
@@ -1,1 +0,0 @@
-type annotate more tests
diff --git a/src/twisted/newsfragments/12005.misc b/src/twisted/newsfragments/12005.misc
deleted file mode 100644
index b64a2dc0c0..0000000000
--- a/src/twisted/newsfragments/12005.misc
+++ /dev/null
@@ -1,1 +0,0 @@
-This modifies the pyproject.toml so that the license appears correctly on the PyPI repository
\ No newline at end of file
diff --git a/src/twisted/newsfragments/12009.misc b/src/twisted/newsfragments/12009.misc
deleted file mode 100644
index 6411e5f4f6..0000000000
--- a/src/twisted/newsfragments/12009.misc
+++ /dev/null
@@ -1,1 +0,0 @@
-type annotate more tests
diff --git a/src/twisted/newsfragments/12012.doc b/src/twisted/newsfragments/12012.doc
deleted file mode 100644
index 4dbfa26f55..0000000000
--- a/src/twisted/newsfragments/12012.doc
+++ /dev/null
@@ -1,3 +0,0 @@
-The search and version navigation for the documentation hosted on
-Read The Docs was fixed.
-This was a regression introduced with 23.8.0.
diff --git a/src/twisted/newsfragments/5206.misc b/src/twisted/newsfragments/5206.misc
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/src/twisted/trial/newsfragments/10115.misc b/src/twisted/trial/newsfragments/10115.misc
deleted file mode 100644
index db0f6ea02b..0000000000
--- a/src/twisted/trial/newsfragments/10115.misc
+++ /dev/null
@@ -1,1 +0,0 @@
-test with subunit on 3.10+.
diff --git a/src/twisted/web/domhelpers.py b/src/twisted/web/domhelpers.py
index 0903eb692b..326c3f8485 100644
--- a/src/twisted/web/domhelpers.py
+++ b/src/twisted/web/domhelpers.py
@@ -16,7 +16,7 @@ from twisted.web import microdom
 from twisted.web.microdom import escape, getElementsByTagName, unescape
 
 warningString = "twisted.web.domhelpers was deprecated at {}".format(
-    getVersionString(Version("Twisted", "NEXT", 0, 0))
+    getVersionString(Version("Twisted", 23, 10, 0))
 )
 warnings.warn(warningString, DeprecationWarning, stacklevel=3)
 
diff --git a/src/twisted/web/microdom.py b/src/twisted/web/microdom.py
index 088825714e..b80db5394e 100644
--- a/src/twisted/web/microdom.py
+++ b/src/twisted/web/microdom.py
@@ -33,7 +33,7 @@ from twisted.python.util import InsensitiveDict
 from twisted.web.sux import ParseError, XMLParser
 
 warningString = "twisted.web.microdom was deprecated at {}".format(
-    getVersionString(Version("Twisted", "NEXT", 0, 0))
+    getVersionString(Version("Twisted", 23, 10, 0))
 )
 warnings.warn(warningString, DeprecationWarning, stacklevel=3)
 
diff --git a/src/twisted/web/newsfragments/11976.bugfix b/src/twisted/web/newsfragments/11976.bugfix
deleted file mode 100644
index 8ac292bef5..0000000000
--- a/src/twisted/web/newsfragments/11976.bugfix
+++ /dev/null
@@ -1,7 +0,0 @@
-In Twisted 16.3.0, we changed twisted.web to stop dispatching HTTP/1.1
-pipelined requests to application code.  There was a bug in this change which
-still allowed clients which could send multiple full HTTP requests in a single
-TCP segment to trigger asynchronous processing of later requests, which could
-lead to out-of-order responses.  This has now been corrected and twisted.web
-should never process a pipelined request over HTTP/1.1 until the previous
-request has fully completed.
diff --git a/src/twisted/web/newsfragments/3651.removal b/src/twisted/web/newsfragments/3651.removal
deleted file mode 100644
index 06a16e473a..0000000000
--- a/src/twisted/web/newsfragments/3651.removal
+++ /dev/null
@@ -1,1 +0,0 @@
-twisted.dom.microdom and twisted.web.domhelpers are now deprecated.


Test patch:
diff --git a/src/twisted/web/test/test_domhelpers.py b/src/twisted/web/test/test_domhelpers.py
index 670f9bc30c..bbefd68516 100644
--- a/src/twisted/web/test/test_domhelpers.py
+++ b/src/twisted/web/test/test_domhelpers.py
@@ -268,7 +268,7 @@ class MicroDOMHelpersTests(DOMHelpersTestsMixin, TestCase):
         warnings = self.flushWarnings([self.test_deprecation])
         self.assertEqual(1, len(warnings))
         self.assertEqual(
-            "twisted.web.domhelpers was deprecated at Twisted NEXT",
+            "twisted.web.domhelpers was deprecated at Twisted 23.10.0",
             warnings[0]["message"],
         )
 
diff --git a/src/twisted/web/test/test_xml.py b/src/twisted/web/test/test_xml.py
index 475c80707a..468e87738e 100644
--- a/src/twisted/web/test/test_xml.py
+++ b/src/twisted/web/test/test_xml.py
@@ -802,7 +802,7 @@ alert("I hate you");
         warnings = self.flushWarnings([self.test_deprecation])
         self.assertEqual(1, len(warnings))
         self.assertEqual(
-            "twisted.web.microdom was deprecated at Twisted NEXT",
+            "twisted.web.microdom was deprecated at Twisted 23.10.0",
             warnings[0]["message"],
         )