GH-121970: Make ``DeprecatedRemoved`` a subclass of ``VersionChange`` (#121971)

This commit is contained in:
Adam Turner 2024-07-19 11:39:51 +01:00 committed by GitHub
parent adf0b94d1c
commit 898e90c3be
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 24 additions and 44 deletions

View File

@ -15,11 +15,13 @@ from os import getenv, path
from time import asctime from time import asctime
from pprint import pformat from pprint import pformat
import sphinx
from docutils import nodes from docutils import nodes
from docutils.io import StringOutput from docutils.io import StringOutput
from docutils.utils import new_document, unescape from docutils.utils import new_document, unescape
from sphinx import addnodes from sphinx import addnodes
from sphinx.builders import Builder from sphinx.builders import Builder
from sphinx.domains.changeset import VersionChange, versionlabels, versionlabel_classes
from sphinx.domains.python import PyFunction, PyMethod from sphinx.domains.python import PyFunction, PyMethod
from sphinx.errors import NoUri from sphinx.errors import NoUri
from sphinx.locale import _ as sphinx_gettext from sphinx.locale import _ as sphinx_gettext
@ -393,56 +395,34 @@ class PyAbstractMethod(PyMethod):
# Support for documenting version of removal in deprecations # Support for documenting version of removal in deprecations
class DeprecatedRemoved(SphinxDirective): class DeprecatedRemoved(VersionChange):
has_content = True
required_arguments = 2 required_arguments = 2
optional_arguments = 1
final_argument_whitespace = True
option_spec = {}
_deprecated_label = sphinx_gettext('Deprecated since version {deprecated}, will be removed in version {removed}') _deprecated_label = sphinx_gettext('Deprecated since version %s, will be removed in version %s')
_removed_label = sphinx_gettext('Deprecated since version {deprecated}, removed in version {removed}') _removed_label = sphinx_gettext('Deprecated since version %s, removed in version %s')
def run(self): def run(self):
node = addnodes.versionmodified() # Replace the first two arguments (deprecated version and removed version)
node.document = self.state.document # with a single tuple of both versions.
node['type'] = 'deprecated-removed' version_deprecated = self.arguments[0]
version = (self.arguments[0], self.arguments[1]) version_removed = self.arguments.pop(1)
node['version'] = version self.arguments[0] = version_deprecated, version_removed
current_version = tuple(int(e) for e in self.config.version.split('.'))
removed_version = tuple(int(e) for e in self.arguments[1].split('.'))
if current_version < removed_version:
label = self._deprecated_label
else:
label = self._removed_label
text = label.format(deprecated=self.arguments[0], removed=self.arguments[1]) # Set the label based on if we have reached the removal version
if len(self.arguments) == 3: current_version = tuple(map(int, self.config.version.split('.')))
inodes, messages = self.state.inline_text(self.arguments[2], removed_version = tuple(map(int, version_removed.split('.')))
self.lineno+1) if current_version < removed_version:
para = nodes.paragraph(self.arguments[2], '', *inodes, translatable=False) versionlabels[self.name] = self._deprecated_label
node.append(para) versionlabel_classes[self.name] = 'deprecated'
else: else:
messages = [] versionlabels[self.name] = self._removed_label
if self.content: versionlabel_classes[self.name] = 'removed'
self.state.nested_parse(self.content, self.content_offset, node) try:
if len(node): return super().run()
if isinstance(node[0], nodes.paragraph) and node[0].rawsource: finally:
content = nodes.inline(node[0].rawsource, translatable=True) # reset versionlabels and versionlabel_classes
content.source = node[0].source versionlabels[self.name] = ''
content.line = node[0].line versionlabel_classes[self.name] = ''
content += node[0].children
node[0].replace_self(nodes.paragraph('', '', content, translatable=False))
node[0].insert(0, nodes.inline('', '%s: ' % text,
classes=['versionmodified']))
else:
para = nodes.paragraph('', '',
nodes.inline('', '%s.' % text,
classes=['versionmodified']),
translatable=False)
node.append(para)
self.env.get_domain('changeset').note_changeset(node)
return [node] + messages
# Support for including Misc/NEWS # Support for including Misc/NEWS