|
22 | 22 | from sphinx import addnodes |
23 | 23 | from sphinx.builders import Builder |
24 | 24 | from sphinx.domains.python import PyFunction, PyMethod |
| 25 | +from sphinx.domains.changeset import VersionChange |
25 | 26 | from sphinx.errors import NoUri |
26 | 27 | from sphinx.locale import _ as sphinx_gettext |
27 | 28 | from sphinx.util import logging |
@@ -414,7 +415,22 @@ def run(self): |
414 | 415 | return PyMethod.run(self) |
415 | 416 |
|
416 | 417 |
|
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 | + |
418 | 434 |
|
419 | 435 | class DeprecatedRemoved(Directive): |
420 | 436 | has_content = True |
@@ -430,17 +446,23 @@ def run(self): |
430 | 446 | node = addnodes.versionmodified() |
431 | 447 | node.document = self.state.document |
432 | 448 | node['type'] = 'deprecated-removed' |
433 | | - version = (self.arguments[0], self.arguments[1]) |
434 | | - node['version'] = version |
435 | 449 | 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 |
436 | 458 | 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('.')) |
438 | 460 | if current_version < removed_version: |
439 | 461 | label = self._deprecated_label |
440 | 462 | else: |
441 | 463 | label = self._removed_label |
442 | 464 |
|
443 | | - text = label.format(deprecated=self.arguments[0], removed=self.arguments[1]) |
| 465 | + text = label.format(deprecated=version[0], removed=version[1]) |
444 | 466 | if len(self.arguments) == 3: |
445 | 467 | inodes, messages = self.state.inline_text(self.arguments[2], |
446 | 468 | self.lineno+1) |
@@ -713,6 +735,10 @@ def setup(app): |
713 | 735 | app.add_directive('availability', Availability) |
714 | 736 | app.add_directive('audit-event', AuditEvent) |
715 | 737 | 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) |
716 | 742 | app.add_directive('deprecated-removed', DeprecatedRemoved) |
717 | 743 | app.add_builder(PydocTopicsBuilder) |
718 | 744 | app.add_builder(suspicious.CheckSuspiciousMarkupBuilder) |
|