]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.12] gh-121277: Allow `.. versionadded:: next` in docs (GH-121278) (GH-125980)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Mon, 28 Oct 2024 13:30:29 +0000 (14:30 +0100)
committerGitHub <noreply@github.com>
Mon, 28 Oct 2024 13:30:29 +0000 (14:30 +0100)
Make `versionchanged:: next`` expand to current (unreleased) version.

When a new CPython release is cut, the release manager will replace
all such occurences of "next" with the just-released version.
(See the issue for release-tools and devguide PRs.)

(cherry picked from commit 7d24ea9db3e8fdca52058629c9ba577aba3d8e5c)

Also backports a minor fix-up:
gh-121277: Raise nice error on `next` as second argument to deprecated-removed (GH-124623)

(cherry-picked from commit e349f73a5ad2856b0a7cbe4aef7cc081c7aed777)

Co-authored-by: Petr Viktorin <encukou@gmail.com>
Doc/tools/extensions/pyspecific.py
Misc/NEWS.d/next/Documentation/2024-07-19-12-22-48.gh-issue-121277.wF_zKd.rst [new file with mode: 0644]

index 8cb5eaffebfad089cd787af8a069977f20ecbd9d..615c7f1f30fc6c69a1122ecddcb0a1209e1349d5 100644 (file)
@@ -184,7 +184,22 @@ class PyAbstractMethod(PyMethod):
         return PyMethod.run(self)
 
 
-# Support for documenting version of removal in deprecations
+# Support for documenting version of changes, additions, deprecations
+
+def expand_version_arg(argument, release):
+    """Expand "next" to the current version"""
+    if argument == 'next':
+        return sphinx_gettext('{} (unreleased)').format(release)
+    return argument
+
+
+class PyVersionChange(VersionChange):
+    def run(self):
+        # Replace the 'next' special token with the current development version
+        self.arguments[0] = expand_version_arg(self.arguments[0],
+                                               self.config.release)
+        return super().run()
+
 
 class DeprecatedRemoved(VersionChange):
     required_arguments = 2
@@ -195,8 +210,12 @@ class DeprecatedRemoved(VersionChange):
     def run(self):
         # Replace the first two arguments (deprecated version and removed version)
         # with a single tuple of both versions.
-        version_deprecated = self.arguments[0]
+        version_deprecated = expand_version_arg(self.arguments[0],
+                                                self.config.release)
         version_removed = self.arguments.pop(1)
+        if version_removed == 'next':
+            raise ValueError(
+                'deprecated-removed:: second argument cannot be `next`')
         self.arguments[0] = version_deprecated, version_removed
 
         # Set the label based on if we have reached the removal version
@@ -398,6 +417,10 @@ def setup(app):
     app.add_role('issue', issue_role)
     app.add_role('gh', gh_issue_role)
     app.add_directive('impl-detail', ImplementationDetail)
+    app.add_directive('versionadded', PyVersionChange, override=True)
+    app.add_directive('versionchanged', PyVersionChange, override=True)
+    app.add_directive('versionremoved', PyVersionChange, override=True)
+    app.add_directive('deprecated', PyVersionChange, override=True)
     app.add_directive('deprecated-removed', DeprecatedRemoved)
     app.add_builder(PydocTopicsBuilder)
     app.add_object_type('opcode', 'opcode', '%s (opcode)', parse_opcode_signature)
diff --git a/Misc/NEWS.d/next/Documentation/2024-07-19-12-22-48.gh-issue-121277.wF_zKd.rst b/Misc/NEWS.d/next/Documentation/2024-07-19-12-22-48.gh-issue-121277.wF_zKd.rst
new file mode 100644 (file)
index 0000000..60f75ae
--- /dev/null
@@ -0,0 +1,2 @@
+Writers of CPython's documentation can now use ``next`` as the version for
+the ``versionchanged``, ``versionadded``, ``deprecated`` directives.