Skip to content

Commit f0895aa

Browse files
authored
[3.11] gh-121277: Allow .. versionadded:: next in docs (GH-121278) (#124718) (#127827)
* [3.11] gh-121277: Allow `.. versionadded:: next` in docs (GH-121278) (#124718) 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 <[email protected]> Co-authored-by: Hugo van Kemenade <[email protected]> (cherry picked from commit 7d24ea9) gh-121277: Raise nice error on `next` as second argument to deprecated-removed (GH-124623) (cherry-picked from e349f73) * Import VersionChange sphinx.domains.changeset.VersionChange exists at least since Sphinx 2.1, according to: https://www.sphinx-doc.org/en/master/extdev/deprecated.html * Get config from env * Use version, not arguments directly
1 parent 976c4f2 commit f0895aa

File tree

2 files changed

+33
-5
lines changed

2 files changed

+33
-5
lines changed

Doc/tools/extensions/pyspecific.py

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
from sphinx import addnodes
2323
from sphinx.builders import Builder
2424
from sphinx.domains.python import PyFunction, PyMethod
25+
from sphinx.domains.changeset import VersionChange
2526
from sphinx.errors import NoUri
2627
from sphinx.locale import _ as sphinx_gettext
2728
from sphinx.util import logging
@@ -414,7 +415,22 @@ def run(self):
414415
return PyMethod.run(self)
415416

416417

417-
# Support for documenting version of removal in deprecations
418+
# Support for documenting version of changes, additions, deprecations
419+
420+
def expand_version_arg(argument, release):
421+
"""Expand "next" to the current version"""
422+
if argument == 'next':
423+
return sphinx_gettext('{} (unreleased)').format(release)
424+
return argument
425+
426+
427+
class PyVersionChange(VersionChange):
428+
def run(self):
429+
# Replace the 'next' special token with the current development version
430+
self.arguments[0] = expand_version_arg(self.arguments[0],
431+
self.config.release)
432+
return super().run()
433+
418434

419435
class DeprecatedRemoved(Directive):
420436
has_content = True
@@ -430,17 +446,23 @@ def run(self):
430446
node = addnodes.versionmodified()
431447
node.document = self.state.document
432448
node['type'] = 'deprecated-removed'
433-
version = (self.arguments[0], self.arguments[1])
434-
node['version'] = version
435449
env = self.state.document.settings.env
450+
version = (
451+
expand_version_arg(self.arguments[0], env.config.release),
452+
self.arguments[1],
453+
)
454+
if version[1] == 'next':
455+
raise ValueError(
456+
'deprecated-removed:: second argument cannot be `next`')
457+
node['version'] = version
436458
current_version = tuple(int(e) for e in env.config.version.split('.'))
437-
removed_version = tuple(int(e) for e in self.arguments[1].split('.'))
459+
removed_version = tuple(int(e) for e in version[1].split('.'))
438460
if current_version < removed_version:
439461
label = self._deprecated_label
440462
else:
441463
label = self._removed_label
442464

443-
text = label.format(deprecated=self.arguments[0], removed=self.arguments[1])
465+
text = label.format(deprecated=version[0], removed=version[1])
444466
if len(self.arguments) == 3:
445467
inodes, messages = self.state.inline_text(self.arguments[2],
446468
self.lineno+1)
@@ -713,6 +735,10 @@ def setup(app):
713735
app.add_directive('availability', Availability)
714736
app.add_directive('audit-event', AuditEvent)
715737
app.add_directive('audit-event-table', AuditEventListDirective)
738+
app.add_directive('versionadded', PyVersionChange, override=True)
739+
app.add_directive('versionchanged', PyVersionChange, override=True)
740+
app.add_directive('versionremoved', PyVersionChange, override=True)
741+
app.add_directive('deprecated', PyVersionChange, override=True)
716742
app.add_directive('deprecated-removed', DeprecatedRemoved)
717743
app.add_builder(PydocTopicsBuilder)
718744
app.add_builder(suspicious.CheckSuspiciousMarkupBuilder)
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Writers of CPython's documentation can now use ``next`` as the version for
2+
the ``versionchanged``, ``versionadded``, ``deprecated`` directives.

0 commit comments

Comments
 (0)