Skip to content

Commit 44a9896

Browse files
Use hyphenated version directives (#13714)
Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com>
1 parent 42aa511 commit 44a9896

File tree

13 files changed

+172
-65
lines changed

13 files changed

+172
-65
lines changed

doc/usage/restructuredtext/directives.rst

Lines changed: 36 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -537,7 +537,8 @@ 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]
541+
.. versionadded:: version [brief explanation]
541542
542543
This directive documents the version of the project
543544
which added the described feature.
@@ -551,56 +552,75 @@ Describing changes between versions
551552
There must be no blank line between the directive head and the explanation;
552553
this is to make these blocks visually continuous in the markup.
553554

555+
.. version-changed:: 8.3
556+
The :rst:dir:`versionadded` directive was renamed to :rst:dir:`version-added`.
557+
The previous name is retained as an alias.
558+
554559
Example::
555560

556-
.. versionadded:: 2.5
561+
.. version-added:: 2.5
557562
The *spam* parameter.
558563

559-
.. versionadded:: 2.5
564+
.. version-added:: 2.5
560565
The *spam* parameter.
561566

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

573+
.. version-changed:: 8.3
574+
The :rst:dir:`versionchanged` directive was renamed to :rst:dir:`version-changed`.
575+
The previous name is retained as an alias.
576+
567577
Example::
568578

569-
.. versionchanged:: 2.8
579+
.. version-changed:: 2.8
570580
The *spam* parameter is now of type *boson*.
571581

572-
.. versionchanged:: 2.8
582+
.. version-changed:: 2.8
573583
The *spam* parameter is now of type *boson*.
574584

575-
.. rst:directive:: .. deprecated:: version [brief explanation]
585+
.. rst:directive:: .. version-deprecated:: version [brief explanation]
586+
.. deprecated:: version [brief explanation]
576587
577-
Similar to :rst:dir:`versionadded`, but describes when the feature was
588+
Similar to :rst:dir:`version-added`, but describes when the feature was
578589
deprecated.
579590
A *brief* explanation can also be given,
580591
for example to tell the reader what to use instead.
581592

593+
.. version-changed:: 8.3
594+
The :rst:dir:`deprecated` directive was renamed to :rst:dir:`version-deprecated`.
595+
The previous name is retained as an alias
596+
582597
Example::
583598

584-
.. deprecated:: 3.1
599+
.. version-deprecated:: 3.1
585600
Use :py:func:`spam` instead.
586601

587-
.. deprecated:: 3.1
602+
.. version-deprecated:: 3.1
588603
Use :py:func:`!spam` instead.
589604

590-
.. rst:directive:: .. versionremoved:: version [brief explanation]
605+
.. rst:directive:: .. version-removed:: version [brief explanation]
606+
.. versionremoved:: version [brief explanation]
591607
592-
Similar to :rst:dir:`versionadded`, but describes when the feature was removed.
608+
Similar to :rst:dir:`version-added`, but describes when the feature was removed.
593609
An explanation may be provided to tell the reader what to use instead,
594610
or why the feature was removed.
595611

596-
.. versionadded:: 7.3
612+
.. version-added:: 7.3
613+
614+
.. version-changed:: 8.3
615+
The :rst:dir:`versionremoved` directive was renamed to :rst:dir:`version-removed`.
616+
The previous name is retained as an alias.
597617

598618
Example::
599619

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

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

606626

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
@@ -1121,7 +1121,7 @@ def setup(app):
11211121
11221122
.. versionchanged:: 0.6
11231123
Docutils 0.5-style directive classes are now supported.
1124-
.. deprecated:: 1.8
1124+
.. versionchanged:: 1.8
11251125
Docutils 0.4-style (function based) directives support is deprecated.
11261126
.. versionchanged:: 1.8
11271127
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)