Skip to content

Commit 8d3d608

Browse files
committed
Hyphenate versioning admonitions
Use e.g. 'version-changed' over 'versionchanged'. While the deprecated admonition is marked as deprecated itself in the docs, we do not do anything at runtime since there is almost zero cost to keeping this relative to the work needed for millions of documents to be updated. While here, we also update a use of the deprecated admonition with version-changed since it makes more sense in the context (an attribute of the feature was deprecated but not the whole feature itself). Signed-off-by: Stephen Finucane <[email protected]>
1 parent 7522fb6 commit 8d3d608

File tree

13 files changed

+179
-65
lines changed

13 files changed

+179
-65
lines changed

doc/usage/restructuredtext/directives.rst

Lines changed: 43 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -537,7 +537,7 @@ Describing changes between versions
537537
pair: changes; in version
538538
pair: removed; in version
539539

540-
.. rst:directive:: .. versionadded:: version [brief explanation]
540+
.. rst:directive:: .. version-added:: version [brief explanation]
541541
542542
This directive documents the version of the project
543543
which added the described feature.
@@ -553,57 +553,84 @@ Describing changes between versions
553553

554554
Example::
555555

556-
.. versionadded:: 2.5
556+
.. version-added:: 2.5
557557
The *spam* parameter.
558558

559-
.. versionadded:: 2.5
559+
.. version-added:: 2.5
560560
The *spam* parameter.
561561

562-
.. rst:directive:: .. versionchanged:: version [brief explanation]
562+
.. rst:directive:: .. version-changed:: version [brief explanation]
563563
564-
Similar to :rst:dir:`versionadded`, but describes when and what changed in
564+
Similar to :rst:dir:`version-added`, but describes when and what changed in
565565
the named feature in some way (new parameters, changed side effects, etc.).
566566

567567
Example::
568568

569-
.. versionchanged:: 2.8
569+
.. version-changed:: 2.8
570570
The *spam* parameter is now of type *boson*.
571571

572-
.. versionchanged:: 2.8
572+
.. version-changed:: 2.8
573573
The *spam* parameter is now of type *boson*.
574574

575-
.. rst:directive:: .. deprecated:: version [brief explanation]
575+
.. rst:directive:: .. version-deprecated:: version [brief explanation]
576576
577-
Similar to :rst:dir:`versionadded`, but describes when the feature was
577+
Similar to :rst:dir:`version-added`, but describes when the feature was
578578
deprecated.
579579
A *brief* explanation can also be given,
580580
for example to tell the reader what to use instead.
581581

582+
.. version-added:: 8.3
583+
582584
Example::
583585

584-
.. deprecated:: 3.1
586+
.. version-deprecated:: 3.1
585587
Use :py:func:`spam` instead.
586588

587-
.. deprecated:: 3.1
589+
.. version-deprecated:: 3.1
588590
Use :py:func:`!spam` instead.
589591

590-
.. rst:directive:: .. versionremoved:: version [brief explanation]
592+
.. rst:directive:: .. version-removed:: version [brief explanation]
591593
592-
Similar to :rst:dir:`versionadded`, but describes when the feature was removed.
594+
Similar to :rst:dir:`version-added`, but describes when the feature was removed.
593595
An explanation may be provided to tell the reader what to use instead,
594596
or why the feature was removed.
595597

596-
.. versionadded:: 7.3
598+
.. version-added:: 7.3
597599

598600
Example::
599601

600-
.. versionremoved:: 4.0
602+
.. version-removed:: 4.0
601603
The :py:func:`spam` function is more flexible, and should be used instead.
602604

603-
.. versionremoved:: 4.0
605+
.. version-removed:: 4.0
604606
The :py:func:`!spam` function is more flexible, and should be used instead.
605607

606608

609+
.. rst:directive:: .. versionadded:: version [brief explanation]
610+
611+
A legacy alias for :rst:dir:`version-added`.
612+
613+
.. version-deprecated:: 8.3
614+
615+
.. rst:directive:: .. versionchanged:: version [brief explanation]
616+
617+
A legacy alias for :rst:dir:`version-changed`.
618+
619+
.. version-deprecated:: 8.3
620+
621+
.. rst:directive:: .. deprecated:: version [brief explanation]
622+
623+
A legacy alias for :rst:dir:`version-deprecated`.
624+
625+
.. version-deprecated:: 8.3
626+
627+
.. rst:directive:: .. versionremoved:: version [brief explanation]
628+
629+
A legacy alias for :rst:dir:`version-removed`.
630+
631+
.. version-deprecated:: 8.3
632+
633+
607634
Presentational
608635
^^^^^^^^^^^^^^
609636

sphinx/addnodes.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -402,8 +402,8 @@ class desc_sig_literal_char(desc_sig_element, _sig_element=True):
402402
class versionmodified(nodes.Admonition, nodes.TextElement):
403403
"""Node for version change entries.
404404
405-
Currently used for "versionadded", "versionchanged", "deprecated"
406-
and "versionremoved" directives.
405+
Currently used for "version-added", "version-changed", "version-deprecated"
406+
and "version-removed" directives, along with their aliases.
407407
"""
408408

409409

sphinx/application.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1118,7 +1118,7 @@ def setup(app):
11181118
11191119
.. versionchanged:: 0.6
11201120
Docutils 0.5-style directive classes are now supported.
1121-
.. deprecated:: 1.8
1121+
.. versionchanged:: 1.8
11221122
Docutils 0.4-style (function based) directives support is deprecated.
11231123
.. versionchanged:: 1.8
11241124
Add *override* keyword.

sphinx/builders/changes.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323

2424

2525
class ChangesBuilder(Builder):
26-
"""Write a summary with all versionadded/changed/deprecated/removed directives."""
26+
"""Write a summary with all version-related directives."""
2727

2828
name = 'changes'
2929
epilog = __('The overview file is in %(outdir)s.')
@@ -43,9 +43,13 @@ def get_outdated_docs(self) -> str:
4343
return str(self.outdir)
4444

4545
typemap = {
46+
'version-added': 'added',
4647
'versionadded': 'added',
48+
'version-changed': 'changed',
4749
'versionchanged': 'changed',
50+
'version-deprecated': 'deprecated',
4851
'deprecated': 'deprecated',
52+
'version-removed': 'removed',
4953
'versionremoved': 'removed',
5054
}
5155

@@ -112,9 +116,13 @@ def write_documents(self, _docnames: Set[str]) -> None:
112116
f.write(self.templates.render('changes/versionchanges.html', ctx))
113117

114118
hltext = [
119+
f'.. version-added:: {version}',
115120
f'.. versionadded:: {version}',
121+
f'.. version-changed:: {version}',
116122
f'.. versionchanged:: {version}',
123+
f'.. version-deprecated:: {version}',
117124
f'.. deprecated:: {version}',
125+
f'.. version-removed:: {version}',
118126
f'.. versionremoved:: {version}',
119127
]
120128

sphinx/domains/changeset.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,12 @@
2121
from sphinx.environment import BuildEnvironment
2222
from sphinx.util.typing import ExtensionMetadata, OptionSpec
2323

24+
name_aliases = {
25+
'version-added': 'versionadded',
26+
'version-changed': 'versionchanged',
27+
'version-deprecated': 'deprecated',
28+
'version-removed': 'versionremoved',
29+
}
2430

2531
versionlabels = {
2632
'versionadded': _('Added in version %s'),
@@ -56,12 +62,13 @@ class VersionChange(SphinxDirective):
5662
option_spec: ClassVar[OptionSpec] = {}
5763

5864
def run(self) -> list[Node]:
65+
name = name_aliases.get(self.name, self.name)
5966
node = addnodes.versionmodified()
6067
node.document = self.state.document
6168
self.set_source_info(node)
62-
node['type'] = self.name
69+
node['type'] = name
6370
node['version'] = self.arguments[0]
64-
text = versionlabels[self.name] % self.arguments[0]
71+
text = versionlabels[name] % self.arguments[0]
6572
if len(self.arguments) == 2:
6673
inodes, messages = self.parse_inline(
6774
self.arguments[1], lineno=self.lineno + 1
@@ -73,7 +80,7 @@ def run(self) -> list[Node]:
7380
messages = []
7481
if self.content:
7582
node += self.parse_content_to_nodes()
76-
classes = ['versionmodified', versionlabel_classes[self.name]]
83+
classes = ['versionmodified', versionlabel_classes[name]]
7784
if len(node) > 0 and isinstance(node[0], nodes.paragraph):
7885
# the contents start with a paragraph
7986
if node[0].rawsource:
@@ -168,9 +175,13 @@ def get_changesets_for(self, version: str) -> list[ChangeSet]:
168175

169176
def setup(app: Sphinx) -> ExtensionMetadata:
170177
app.add_domain(ChangeSetDomain)
178+
app.add_directive('version-deprecated', VersionChange)
171179
app.add_directive('deprecated', VersionChange)
180+
app.add_directive('version-added', VersionChange)
172181
app.add_directive('versionadded', VersionChange)
182+
app.add_directive('version-changed', VersionChange)
173183
app.add_directive('versionchanged', VersionChange)
184+
app.add_directive('version-removed', VersionChange)
174185
app.add_directive('versionremoved', VersionChange)
175186

176187
return {

tests/roots/test-changes/base.rst

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,38 @@
11
Version markup
22
--------------
33

4-
.. versionadded:: 0.6
4+
.. version-added:: 0.6
55
Some funny **stuff**.
66

7-
.. versionchanged:: 0.6
7+
.. version-changed:: 0.6
88
Even more funny stuff.
99

10-
.. deprecated:: 0.6
10+
.. version-deprecated:: 0.6
1111
Boring stuff.
1212

13-
.. versionremoved:: 0.6
13+
.. version-removed:: 0.6
1414
Goodbye boring stuff.
1515

16-
.. versionadded:: 1.2
16+
.. version-added:: 1.2
17+
18+
First paragraph of version-added.
19+
20+
.. version-changed:: 1.2
21+
First paragraph of version-changed.
22+
23+
Second paragraph of version-changed.
1724

18-
First paragraph of versionadded.
25+
.. version-deprecated:: 1.3
26+
First paragraph of version-deprecated.
1927

20-
.. versionchanged:: 1.2
21-
First paragraph of versionchanged.
28+
.. version-added:: 0.6
29+
Deprecated alias
2230

23-
Second paragraph of versionchanged.
31+
.. version-changed:: 0.6
32+
Deprecated alias
33+
34+
.. versionremoved:: 0.6
35+
Deprecated alias
36+
37+
.. deprecated:: 0.6
38+
Deprecated alias

tests/roots/test-changes/c-api.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ Memory
88
99
Allocate *n* bytes of memory.
1010
11-
.. versionchanged:: 0.6
11+
.. version-changed:: 0.6
1212
1313
Can now be replaced with a different allocator.
1414
@@ -17,7 +17,7 @@ System
1717
1818
Access to the system allocator.
1919
20-
.. versionadded:: 0.6
20+
.. version-added:: 0.6
2121
2222
.. c:function:: void* Test_SysMalloc(size_t n)
2323

tests/roots/test-changes/library/utils.rst

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@ Classes
1616

1717
Class for handling paths.
1818

19-
.. versionadded:: 0.5
19+
.. version-added:: 0.5
2020

21-
Innovative new way to handle paths.
21+
Innovative new way to handle paths.
2222

23-
.. deprecated:: 0.6
23+
.. version-deprecated:: 0.6
2424

2525
So, that was a bad idea it turns out.

tests/roots/test-intl/versionchange.txt

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,16 @@
33
i18n with versionchange
44
============================
55

6-
.. deprecated:: 1.0
7-
This is the *first* paragraph of deprecated.
6+
.. version-deprecated:: 1.0
7+
This is the *first* paragraph of version-deprecated.
88

9-
This is the *second* paragraph of deprecated.
9+
This is the *second* paragraph of version-deprecated.
1010

11-
.. versionadded:: 1.0
12-
This is the *first* paragraph of versionadded.
11+
.. version-added:: 1.0
12+
This is the *first* paragraph of version-added.
1313

14-
.. versionchanged:: 1.0
14+
.. version-changed:: 1.0
1515

16-
This is the *first* paragraph of versionchanged.
16+
This is the *first* paragraph of version-changed.
1717

18-
.. versionremoved:: 1.0 This is the *first* paragraph of versionremoved.
18+
.. version-removed:: 1.0 This is the *first* paragraph of version-removed.

tests/roots/test-intl/xx/LC_MESSAGES/versionchange.po

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,24 @@ msgstr ""
1919
msgid "i18n with versionchange"
2020
msgstr "I18N WITH VERSIONCHANGE"
2121

22+
msgid "This is the *first* paragraph of version-deprecated."
23+
msgstr "THIS IS THE *FIRST* PARAGRAPH OF VERSION-DEPRECATED."
24+
25+
msgid "This is the *second* paragraph of version-deprecated."
26+
msgstr "THIS IS THE *SECOND* PARAGRAPH OF VERSION-DEPRECATED."
27+
28+
msgid "This is the *first* paragraph of version-added."
29+
msgstr "THIS IS THE *FIRST* PARAGRAPH OF VERSION-ADDED."
30+
31+
msgid "This is the *first* paragraph of version-changed."
32+
msgstr "THIS IS THE *FIRST* PARAGRAPH OF VERSION-CHANGED."
33+
34+
msgid "This is the *first* paragraph of version-removed."
35+
msgstr "THIS IS THE *FIRST* PARAGRAPH OF VERSION-REMOVED."
36+
2237
msgid "This is the *first* paragraph of deprecated."
2338
msgstr "THIS IS THE *FIRST* PARAGRAPH OF DEPRECATED."
2439

25-
msgid "This is the *second* paragraph of deprecated."
26-
msgstr "THIS IS THE *SECOND* PARAGRAPH OF DEPRECATED."
27-
2840
msgid "This is the *first* paragraph of versionadded."
2941
msgstr "THIS IS THE *FIRST* PARAGRAPH OF VERSIONADDED."
3042

0 commit comments

Comments
 (0)