gh-121277: Allow .. versionadded:: next in docs (GH-121278)

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

Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com>
Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com>
This commit is contained in:
Petr Viktorin 2024-09-25 23:30:40 +02:00 committed by GitHub
parent 1ff1b899ce
commit 7d24ea9db3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 36 additions and 14 deletions

View File

@ -570,7 +570,7 @@ distinguished from a number. Use :c:func:`PyErr_Occurred` to disambiguate.
On failure, return -1 with an exception set. This function always succeeds On failure, return -1 with an exception set. This function always succeeds
if *obj* is a :c:type:`PyLongObject` or its subtype. if *obj* is a :c:type:`PyLongObject` or its subtype.
.. versionadded:: 3.14 .. versionadded:: next
.. c:function:: PyObject* PyLong_GetInfo(void) .. c:function:: PyObject* PyLong_GetInfo(void)

View File

@ -1534,7 +1534,7 @@ PyUnicodeWriter
The :c:type:`PyUnicodeWriter` API can be used to create a Python :class:`str` The :c:type:`PyUnicodeWriter` API can be used to create a Python :class:`str`
object. object.
.. versionadded:: 3.14 .. versionadded:: next
.. c:type:: PyUnicodeWriter .. c:type:: PyUnicodeWriter

View File

@ -2491,7 +2491,7 @@ effects on the compilation of a program:
differ in whitespace or similar details. Attributes include line numbers differ in whitespace or similar details. Attributes include line numbers
and column offsets. and column offsets.
.. versionadded:: 3.14 .. versionadded:: next
.. _ast-cli: .. _ast-cli:

View File

@ -2303,7 +2303,7 @@ These are the fundamental ctypes data types:
Represents the C :c:expr:`double complex` datatype, if available. The Represents the C :c:expr:`double complex` datatype, if available. The
constructor accepts an optional :class:`complex` initializer. constructor accepts an optional :class:`complex` initializer.
.. versionadded:: 3.14 .. versionadded:: next
.. class:: c_float_complex .. class:: c_float_complex

View File

@ -959,7 +959,7 @@ iterations of the loop.
list of constants supported by this instruction. Used by the :keyword:`assert` list of constants supported by this instruction. Used by the :keyword:`assert`
statement to load :exc:`AssertionError`. statement to load :exc:`AssertionError`.
.. versionadded:: 3.14 .. versionadded:: next
.. opcode:: LOAD_BUILD_CLASS .. opcode:: LOAD_BUILD_CLASS
@ -1826,7 +1826,7 @@ iterations of the loop.
If ``type(STACK[-1]).__xxx__`` is not a method, leave If ``type(STACK[-1]).__xxx__`` is not a method, leave
``STACK[-1].__xxx__; NULL`` on the stack. ``STACK[-1].__xxx__; NULL`` on the stack.
.. versionadded:: 3.14 .. versionadded:: next
**Pseudo-instructions** **Pseudo-instructions**

View File

@ -1563,7 +1563,7 @@ Copying, moving and deleting
This argument has no effect when copying files on Windows (where This argument has no effect when copying files on Windows (where
metadata is always preserved). metadata is always preserved).
.. versionadded:: 3.14 .. versionadded:: next
.. method:: Path.copy_into(target_dir, *, follow_symlinks=True, \ .. method:: Path.copy_into(target_dir, *, follow_symlinks=True, \
@ -1574,7 +1574,7 @@ Copying, moving and deleting
:meth:`Path.copy`. Returns a new :class:`!Path` instance pointing to the :meth:`Path.copy`. Returns a new :class:`!Path` instance pointing to the
copy. copy.
.. versionadded:: 3.14 .. versionadded:: next
.. method:: Path.rename(target) .. method:: Path.rename(target)

View File

@ -255,7 +255,7 @@ Examining Symbol Tables
Return ``True`` if the symbol is a type parameter. Return ``True`` if the symbol is a type parameter.
.. versionadded:: 3.14 .. versionadded:: next
.. method:: is_global() .. method:: is_global()
@ -302,7 +302,7 @@ Examining Symbol Tables
be free from the perspective of ``C.method``, thereby allowing be free from the perspective of ``C.method``, thereby allowing
the latter to return *1* at runtime and not *2*. the latter to return *1* at runtime and not *2*.
.. versionadded:: 3.14 .. versionadded:: next
.. method:: is_assigned() .. method:: is_assigned()
@ -312,13 +312,13 @@ Examining Symbol Tables
Return ``True`` if the symbol is a comprehension iteration variable. Return ``True`` if the symbol is a comprehension iteration variable.
.. versionadded:: 3.14 .. versionadded:: next
.. method:: is_comp_cell() .. method:: is_comp_cell()
Return ``True`` if the symbol is a cell in an inlined comprehension. Return ``True`` if the symbol is a cell in an inlined comprehension.
.. versionadded:: 3.14 .. versionadded:: next
.. method:: is_namespace() .. method:: is_namespace()

View File

@ -259,7 +259,22 @@ class PyAbstractMethod(PyMethod):
return PyMethod.run(self) 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): class DeprecatedRemoved(VersionChange):
required_arguments = 2 required_arguments = 2
@ -270,7 +285,8 @@ class DeprecatedRemoved(VersionChange):
def run(self): def run(self):
# Replace the first two arguments (deprecated version and removed version) # Replace the first two arguments (deprecated version and removed version)
# with a single tuple of both versions. # 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) version_removed = self.arguments.pop(1)
self.arguments[0] = version_deprecated, version_removed self.arguments[0] = version_deprecated, version_removed
@ -474,6 +490,10 @@ def setup(app):
app.add_role('gh', gh_issue_role) app.add_role('gh', gh_issue_role)
app.add_directive('impl-detail', ImplementationDetail) app.add_directive('impl-detail', ImplementationDetail)
app.add_directive('availability', Availability) app.add_directive('availability', Availability)
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_directive('deprecated-removed', DeprecatedRemoved)
app.add_builder(PydocTopicsBuilder) app.add_builder(PydocTopicsBuilder)
app.add_object_type('opcode', 'opcode', '%s (opcode)', parse_opcode_signature) app.add_object_type('opcode', 'opcode', '%s (opcode)', parse_opcode_signature)

View File

@ -0,0 +1,2 @@
Writers of CPython's documentation can now use ``next`` as the version for
the ``versionchanged``, ``versionadded``, ``deprecated`` directives.