Repository: twisted/twisted

Issue:
Release 24.10.0 with support for Python 3.13
This is blocking on https://github.com/twisted/twisted/pull/12336

The idea is to have a new release with support for Python 3.13.0

Discussion:

Patch:
diff --git a/NEWS.rst b/NEWS.rst
index 9138e7bb81..73400b9dff 100644
--- a/NEWS.rst
+++ b/NEWS.rst
@@ -8,6 +8,115 @@ https://twisted.org/trac/ticket/<number>
 
 .. towncrier release notes start
 
+Twisted 24.10.0 (2024-10-28)
+============================
+
+No changes since 24.10.0.rc1.
+
+Features
+--------
+
+- Python 3.13 is now supported. (#11750)
+- twisted.internet.defer.succeed() is significantly faster, and awaiting Deferred has also been sped up. (#12225)
+- twisted.python.failure.Failure creation no longer records the place where it was created. This reduces creation time by 60% at least, thereby speeding up Deferred error handling. (#12230)
+- twisted.internet.defer.Deferred no longer removes the traceback object from Failures. This may result in more objects staying in memory if you don't clean up failed Deferreds, but it speeds up error handling and enables improvements to traceback reporting. (#12234)
+- twisted.internet.defer APIs are 2%-4% faster in many cases. (#12237)
+- twisted.internet.defer.Deferred runs callbacks with chained Deferreds a little faster. (#12284)
+- The reactor now will use a little less CPU when events have been scheduled with callLater(). (#12286)
+- Creation of twisted.python.failure.Failure is now faster. (#12288)
+
+
+Bugfixes
+--------
+
+- Fixed unreleased regression caused by PR 12109. (#12279)
+- twisted.logger.eventAsText can now format the output having types/classes as input.
+  This was a regression introduced in Twisted 24.3.0. (#12323)
+- twisted.internet.endpoints.clientFromString for TLS endpoints with "bindAddress="  no longer crashes during connect. twisted.internet.endpoints.HostnameEndpoint() no longer crashes when given a bindAddress= argument that is just a string, and that argument now accepts either address strings or (address, port) tuples. (#12325)
+- The URLs from README and pyproject.toml were updated. (#12327)
+
+
+Misc
+----
+
+- #11236, #12060, #12062, #12099, #12219, #12290, #12296, #12305, #12329, #12331, #12339
+
+
+Conch
+-----
+
+Features
+~~~~~~~~
+
+- twisted.conch.ssh.keys.Key can now load public blob keys of type sk-ssh-ed25519@openssh.com and sk-ecdsa-sha2-nistp256@openssh.com. (#12211)
+
+
+Bugfixes
+~~~~~~~~
+
+- twisted.conch tests no longer rely on OpenSSH supporting DSA keys, fixing compatibility with OpenSSH >= 9.8. (#12273)
+- twisted.conch.ssh.SSHCiphers no longer supports the cast128-ctr, cast128-cbc, blowfish-ctr, and blowfish-cbc ciphers.
+  The Blowfish and CAST5 ciphers were removed as they were deprecated by the Python cryptography library. (#12308)
+
+
+Misc
+~~~~
+
+- #12313
+
+
+Web
+---
+
+Features
+~~~~~~~~
+
+- The twisted.web HTTP server and client now reject HTTP header names containing whitespace or other invalid characters by raising twisted.web.http_headers.InvalidHeaderName, improving compliance with RFC 9110. As a side effect, the server is slightly faster. (#12191)
+- twisted.web.client and twisted.web.server now disable the Nagle algorithm (enable TCP_NODELAY), reducing the latency of small HTTP queries. (#12311)
+- twisted.web.server is 1-2% faster in some cases. (#12318)
+
+
+Bugfixes
+~~~~~~~~
+
+- twisted.web's HTTP/1.1 server now rejects header values containing a NUL byte with a 400 error, in compliance with RFC 9110. (#12228)
+- twisted.internet.address no longer raises DeprecationWarning when used with attrs>=24.1.0. (#12277)
+- twisted.web's HTTP/1.1 server now accepts '&' within tokens (methods, header field names, etc.), in compliance with RFC 9110. (#12301)
+
+
+Misc
+~~~~
+
+- #9743, #12276
+
+
+Mail
+----
+
+No significant changes.
+
+
+Words
+-----
+
+No significant changes.
+
+
+Names
+-----
+
+No significant changes.
+
+
+Trial
+-----
+
+Features
+~~~~~~~~
+
+- Trial's ``-j`` flag now accepts an ``auto`` keyword to spawn a number of workers based on the available CPUs. (#5824)
+
+
 Twisted 24.7.0 (2024-08-08)
 ===========================
 
diff --git a/src/twisted/_version.py b/src/twisted/_version.py
index ae3c080d20..510268a123 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", 24, 7, 0, post=0)
+__version__ = Version("Twisted", 24, 10, 0, post=0)
 __all__ = ["__version__"]
diff --git a/src/twisted/conch/newsfragments/12211.feature b/src/twisted/conch/newsfragments/12211.feature
deleted file mode 100644
index 75b3a37a32..0000000000
--- a/src/twisted/conch/newsfragments/12211.feature
+++ /dev/null
@@ -1,1 +0,0 @@
-twisted.conch.ssh.keys.Key can now load public blob keys of type sk-ssh-ed25519@openssh.com and sk-ecdsa-sha2-nistp256@openssh.com.
\ No newline at end of file
diff --git a/src/twisted/conch/newsfragments/12273.bugfix b/src/twisted/conch/newsfragments/12273.bugfix
deleted file mode 100644
index f4c7637e9b..0000000000
--- a/src/twisted/conch/newsfragments/12273.bugfix
+++ /dev/null
@@ -1,1 +0,0 @@
-twisted.conch tests no longer rely on OpenSSH supporting DSA keys, fixing compatibility with OpenSSH >= 9.8.
diff --git a/src/twisted/conch/newsfragments/12308.bugfix b/src/twisted/conch/newsfragments/12308.bugfix
deleted file mode 100644
index 895e73efdd..0000000000
--- a/src/twisted/conch/newsfragments/12308.bugfix
+++ /dev/null
@@ -1,2 +0,0 @@
-twisted.conch.ssh.SSHCiphers no longer supports the cast128-ctr, cast128-cbc, blowfish-ctr, and blowfish-cbc ciphers.
-The Blowfish and CAST5 ciphers were removed as they were deprecated by the Python cryptography library.```
diff --git a/src/twisted/conch/newsfragments/12313.misc b/src/twisted/conch/newsfragments/12313.misc
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/src/twisted/newsfragments/11236.misc b/src/twisted/newsfragments/11236.misc
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/src/twisted/newsfragments/11750.feature b/src/twisted/newsfragments/11750.feature
deleted file mode 100644
index 7ad97ba3c0..0000000000
--- a/src/twisted/newsfragments/11750.feature
+++ /dev/null
@@ -1,1 +0,0 @@
-Python 3.13 is now supported.
\ No newline at end of file
diff --git a/src/twisted/newsfragments/12060.misc b/src/twisted/newsfragments/12060.misc
deleted file mode 100644
index 7fb2f06542..0000000000
--- a/src/twisted/newsfragments/12060.misc
+++ /dev/null
@@ -1,1 +0,0 @@
-Enable trial tests for twisted.test on 3.13.
diff --git a/src/twisted/newsfragments/12062.misc b/src/twisted/newsfragments/12062.misc
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/src/twisted/newsfragments/12099.misc b/src/twisted/newsfragments/12099.misc
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/src/twisted/newsfragments/12219.misc b/src/twisted/newsfragments/12219.misc
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/src/twisted/newsfragments/12225.feature b/src/twisted/newsfragments/12225.feature
deleted file mode 100644
index f7286ad308..0000000000
--- a/src/twisted/newsfragments/12225.feature
+++ /dev/null
@@ -1,1 +0,0 @@
-twisted.internet.defer.succeed() is significantly faster, and awaiting Deferred has also been sped up.
\ No newline at end of file
diff --git a/src/twisted/newsfragments/12230.feature b/src/twisted/newsfragments/12230.feature
deleted file mode 100644
index 0371d187c2..0000000000
--- a/src/twisted/newsfragments/12230.feature
+++ /dev/null
@@ -1,1 +0,0 @@
-twisted.python.failure.Failure creation no longer records the place where it was created. This reduces creation time by 60% at least, thereby speeding up Deferred error handling.
\ No newline at end of file
diff --git a/src/twisted/newsfragments/12234.feature b/src/twisted/newsfragments/12234.feature
deleted file mode 100644
index 5fbb121346..0000000000
--- a/src/twisted/newsfragments/12234.feature
+++ /dev/null
@@ -1,1 +0,0 @@
-twisted.internet.defer.Deferred no longer removes the traceback object from Failures. This may result in more objects staying in memory if you don't clean up failed Deferreds, but it speeds up error handling and enables improvements to traceback reporting.
\ No newline at end of file
diff --git a/src/twisted/newsfragments/12237.feature b/src/twisted/newsfragments/12237.feature
deleted file mode 100644
index 7cdf1eef4b..0000000000
--- a/src/twisted/newsfragments/12237.feature
+++ /dev/null
@@ -1,1 +0,0 @@
-twisted.internet.defer APIs are 2%-4% faster in many cases.
\ No newline at end of file
diff --git a/src/twisted/newsfragments/12279.bugfix b/src/twisted/newsfragments/12279.bugfix
deleted file mode 100644
index 8b6afeabdf..0000000000
--- a/src/twisted/newsfragments/12279.bugfix
+++ /dev/null
@@ -1,1 +0,0 @@
-Fixed unreleased regression caused by PR 12109.
\ No newline at end of file
diff --git a/src/twisted/newsfragments/12284.feature b/src/twisted/newsfragments/12284.feature
deleted file mode 100644
index 1366ce1190..0000000000
--- a/src/twisted/newsfragments/12284.feature
+++ /dev/null
@@ -1,1 +0,0 @@
-twisted.internet.defer.Deferred runs callbacks with chained Deferreds a little faster.
\ No newline at end of file
diff --git a/src/twisted/newsfragments/12286.feature b/src/twisted/newsfragments/12286.feature
deleted file mode 100644
index f288364f10..0000000000
--- a/src/twisted/newsfragments/12286.feature
+++ /dev/null
@@ -1,1 +0,0 @@
-The reactor now will use a little less CPU when events have been scheduled with callLater().
\ No newline at end of file
diff --git a/src/twisted/newsfragments/12288.feature b/src/twisted/newsfragments/12288.feature
deleted file mode 100644
index cd6724b5da..0000000000
--- a/src/twisted/newsfragments/12288.feature
+++ /dev/null
@@ -1,1 +0,0 @@
-Creation of twisted.python.failure.Failure is now faster.
\ No newline at end of file
diff --git a/src/twisted/newsfragments/12290.misc b/src/twisted/newsfragments/12290.misc
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/src/twisted/newsfragments/12296.misc b/src/twisted/newsfragments/12296.misc
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/src/twisted/newsfragments/12305.misc b/src/twisted/newsfragments/12305.misc
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/src/twisted/newsfragments/12318.feature b/src/twisted/newsfragments/12318.feature
deleted file mode 100644
index 4e3ad503b5..0000000000
--- a/src/twisted/newsfragments/12318.feature
+++ /dev/null
@@ -1,1 +0,0 @@
-twisted.web.server is 1-2% faster in some cases.
\ No newline at end of file
diff --git a/src/twisted/newsfragments/12323.bugfix b/src/twisted/newsfragments/12323.bugfix
deleted file mode 100644
index 373b75cf58..0000000000
--- a/src/twisted/newsfragments/12323.bugfix
+++ /dev/null
@@ -1,2 +0,0 @@
-twisted.logger.eventAsText can now format the output having types/classes as input.
-This was a regression introduced in Twisted 24.3.0.
\ No newline at end of file
diff --git a/src/twisted/newsfragments/12325.bugfix b/src/twisted/newsfragments/12325.bugfix
deleted file mode 100644
index ed48539244..0000000000
--- a/src/twisted/newsfragments/12325.bugfix
+++ /dev/null
@@ -1,1 +0,0 @@
-twisted.internet.endpoints.clientFromString for TLS endpoints with "bindAddress="  no longer crashes during connect. twisted.internet.endpoints.HostnameEndpoint() no longer crashes when given a bindAddress= argument that is just a string, and that argument now accepts either address strings or (address, port) tuples.
\ No newline at end of file
diff --git a/src/twisted/newsfragments/12327.bugfix b/src/twisted/newsfragments/12327.bugfix
deleted file mode 100644
index db871eff9c..0000000000
--- a/src/twisted/newsfragments/12327.bugfix
+++ /dev/null
@@ -1,1 +0,0 @@
-The URLs from README and pyproject.toml were updated.
diff --git a/src/twisted/newsfragments/12329.misc b/src/twisted/newsfragments/12329.misc
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/src/twisted/newsfragments/12331.misc b/src/twisted/newsfragments/12331.misc
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/src/twisted/newsfragments/12339.misc b/src/twisted/newsfragments/12339.misc
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/src/twisted/python/failure.py b/src/twisted/python/failure.py
index a9323eecfa..987287e0c7 100644
--- a/src/twisted/python/failure.py
+++ b/src/twisted/python/failure.py
@@ -348,7 +348,7 @@ class Failure(BaseException):
     def frames(self, frames):
         self._frames = frames
 
-    @deprecatedProperty(Version("Twisted", "NEXT", 0, 0))
+    @deprecatedProperty(Version("Twisted", 24, 10, 0))
     def stack(self):
         return []
 
diff --git a/src/twisted/trial/newsfragments/5824.feature b/src/twisted/trial/newsfragments/5824.feature
deleted file mode 100644
index 808acebfce..0000000000
--- a/src/twisted/trial/newsfragments/5824.feature
+++ /dev/null
@@ -1,1 +0,0 @@
-Trial's ``-j`` flag now accepts an ``auto`` keyword to spawn a number of workers based on the available CPUs.
diff --git a/src/twisted/web/newsfragments/12191.feature b/src/twisted/web/newsfragments/12191.feature
deleted file mode 100644
index 035347e9f5..0000000000
--- a/src/twisted/web/newsfragments/12191.feature
+++ /dev/null
@@ -1,1 +0,0 @@
-The twisted.web HTTP server and client now reject HTTP header names containing whitespace or other invalid characters by raising twisted.web.http_headers.InvalidHeaderName, improving compliance with RFC 9110. As a side effect, the server is slightly faster.
diff --git a/src/twisted/web/newsfragments/12228.bugfix b/src/twisted/web/newsfragments/12228.bugfix
deleted file mode 100644
index 3b9f4adb19..0000000000
--- a/src/twisted/web/newsfragments/12228.bugfix
+++ /dev/null
@@ -1,1 +0,0 @@
-twisted.web's HTTP/1.1 server now rejects header values containing a NUL byte with a 400 error, in compliance with RFC 9110.
diff --git a/src/twisted/web/newsfragments/12276.misc b/src/twisted/web/newsfragments/12276.misc
deleted file mode 100644
index 8b13789179..0000000000
--- a/src/twisted/web/newsfragments/12276.misc
+++ /dev/null
@@ -1,1 +0,0 @@
-
diff --git a/src/twisted/web/newsfragments/12277.bugfix b/src/twisted/web/newsfragments/12277.bugfix
deleted file mode 100644
index 78e82ba765..0000000000
--- a/src/twisted/web/newsfragments/12277.bugfix
+++ /dev/null
@@ -1,1 +0,0 @@
-twisted.internet.address no longer raises DeprecationWarning when used with attrs>=24.1.0.
\ No newline at end of file
diff --git a/src/twisted/web/newsfragments/12301.bugfix b/src/twisted/web/newsfragments/12301.bugfix
deleted file mode 100644
index 9ac16288fa..0000000000
--- a/src/twisted/web/newsfragments/12301.bugfix
+++ /dev/null
@@ -1,1 +0,0 @@
-twisted.web's HTTP/1.1 server now accepts '&' within tokens (methods, header field names, etc.), in compliance with RFC 9110.
diff --git a/src/twisted/web/newsfragments/12311.feature b/src/twisted/web/newsfragments/12311.feature
deleted file mode 100644
index 2a4c7a4d90..0000000000
--- a/src/twisted/web/newsfragments/12311.feature
+++ /dev/null
@@ -1,1 +0,0 @@
-twisted.web.client and twisted.web.server now disable the Nagle algorithm (enable TCP_NODELAY), reducing the latency of small HTTP queries.
\ No newline at end of file


Test patch:
diff --git a/src/twisted/test/test_failure.py b/src/twisted/test/test_failure.py
index a9e920c10e..8b8e55be64 100644
--- a/src/twisted/test/test_failure.py
+++ b/src/twisted/test/test_failure.py
@@ -513,7 +513,7 @@ class FailureTests(SynchronousTestCase):
         self.assertTrue(len(warnings) >= 1)
         for w in warnings[-2:]:
             self.assertEqual(
-                "twisted.python.failure.Failure.stack was deprecated in Twisted NEXT",
+                "twisted.python.failure.Failure.stack was deprecated in Twisted 24.10.0",
                 w["message"],
             )