Skip to content

Commit a3b872a

Browse files
committed
Improve the displayed signature for abstract methods
1 parent 7406d42 commit a3b872a

File tree

4 files changed

+134
-49
lines changed

4 files changed

+134
-49
lines changed

doc/usage/domains/python.rst

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,13 @@ The following directives are provided for module and class contents:
324324
:type: no value
325325
326326
Indicate the property is abstract.
327+
This produces the following output:
328+
329+
.. py:property:: Cheese.amount_in_stock
330+
:no-index:
331+
:abstractmethod:
332+
333+
Cheese levels at the *National Cheese Emporium*.
327334
328335
.. rst:directive:option:: classmethod
329336
:type: no value
@@ -416,6 +423,13 @@ The following directives are provided for module and class contents:
416423
:type: no value
417424
418425
Indicate the method is an abstract method.
426+
This produces the following output:
427+
428+
.. py:method:: Cheese.order_more_stock
429+
:no-index:
430+
:abstractmethod:
431+
432+
Order more cheese (we're fresh out!).
419433
420434
.. versionadded:: 2.1
421435

sphinx/domains/python/__init__.py

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -88,13 +88,13 @@ class PyFunction(PyObject):
8888
})
8989

9090
def get_signature_prefix(self, sig: str) -> list[nodes.Node]:
91+
prefix: list[addnodes.desc_sig_element] = []
9192
if 'async' in self.options:
92-
return [
93+
prefix.extend((
9394
addnodes.desc_sig_keyword('', 'async'),
9495
addnodes.desc_sig_space(),
95-
]
96-
else:
97-
return []
96+
))
97+
return prefix
9898

9999
def needs_arglist(self) -> bool:
100100
return True
@@ -192,15 +192,17 @@ class PyClasslike(PyObject):
192192
allow_nesting = True
193193

194194
def get_signature_prefix(self, sig: str) -> list[nodes.Node]:
195+
prefix: list[addnodes.desc_sig_element] = []
195196
if 'final' in self.options:
196-
return [
197-
nodes.Text('final'),
198-
addnodes.desc_sig_space(),
199-
nodes.Text(self.objtype),
197+
prefix.extend((
198+
addnodes.desc_sig_keyword('', 'final'),
200199
addnodes.desc_sig_space(),
201-
]
202-
else:
203-
return [nodes.Text(self.objtype), addnodes.desc_sig_space()]
200+
))
201+
prefix.extend((
202+
addnodes.desc_sig_keyword('', self.objtype),
203+
addnodes.desc_sig_space(),
204+
))
205+
return prefix
204206

205207
def get_index_text(self, modname: str, name_cls: tuple[str, str]) -> str:
206208
if self.objtype == 'class':
@@ -229,30 +231,30 @@ def needs_arglist(self) -> bool:
229231
return True
230232

231233
def get_signature_prefix(self, sig: str) -> list[nodes.Node]:
232-
prefix: list[nodes.Node] = []
234+
prefix: list[addnodes.desc_sig_element] = []
233235
if 'final' in self.options:
234236
prefix.extend((
235-
nodes.Text('final'),
237+
addnodes.desc_sig_keyword('', 'final'),
236238
addnodes.desc_sig_space(),
237239
))
238240
if 'abstractmethod' in self.options:
239241
prefix.extend((
240-
nodes.Text('abstract'),
242+
addnodes.desc_sig_keyword('', 'abstractmethod'),
241243
addnodes.desc_sig_space(),
242244
))
243245
if 'async' in self.options:
244246
prefix.extend((
245-
nodes.Text('async'),
247+
addnodes.desc_sig_keyword('', 'async'),
246248
addnodes.desc_sig_space(),
247249
))
248250
if 'classmethod' in self.options:
249251
prefix.extend((
250-
nodes.Text('classmethod'),
252+
addnodes.desc_sig_keyword('', 'classmethod'),
251253
addnodes.desc_sig_space(),
252254
))
253255
if 'staticmethod' in self.options:
254256
prefix.extend((
255-
nodes.Text('static'),
257+
addnodes.desc_sig_keyword('', 'static'),
256258
addnodes.desc_sig_space(),
257259
))
258260
return prefix
@@ -395,20 +397,19 @@ def handle_signature(self, sig: str, signode: desc_signature) -> tuple[str, str]
395397
return fullname, prefix
396398

397399
def get_signature_prefix(self, sig: str) -> list[nodes.Node]:
398-
prefix: list[nodes.Node] = []
400+
prefix: list[addnodes.desc_sig_element] = []
399401
if 'abstractmethod' in self.options:
400402
prefix.extend((
401-
nodes.Text('abstract'),
403+
addnodes.desc_sig_keyword('', 'abstract'),
402404
addnodes.desc_sig_space(),
403405
))
404406
if 'classmethod' in self.options:
405407
prefix.extend((
406-
nodes.Text('class'),
408+
addnodes.desc_sig_keyword('', 'class'),
407409
addnodes.desc_sig_space(),
408410
))
409-
410411
prefix.extend((
411-
nodes.Text('property'),
412+
addnodes.desc_sig_keyword('', 'property'),
412413
addnodes.desc_sig_space(),
413414
))
414415
return prefix
@@ -437,7 +438,7 @@ class PyTypeAlias(PyObject):
437438
})
438439

439440
def get_signature_prefix(self, sig: str) -> list[nodes.Node]:
440-
return [nodes.Text('type'), addnodes.desc_sig_space()]
441+
return [addnodes.desc_sig_keyword('', 'type'), addnodes.desc_sig_space()]
441442

442443
def handle_signature(self, sig: str, signode: desc_signature) -> tuple[str, str]:
443444
fullname, prefix = super().handle_signature(sig, signode)

tests/test_domains/test_domain_py_fields.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,10 @@ def test_info_field_list(app):
5151
[
5252
desc_signature,
5353
(
54-
[desc_annotation, ('class', desc_sig_space)],
54+
[
55+
desc_annotation,
56+
([desc_sig_keyword, 'class'], desc_sig_space),
57+
],
5558
[desc_addname, 'example.'],
5659
[desc_name, 'Class'],
5760
),
@@ -220,7 +223,10 @@ def test_info_field_list_piped_type(app):
220223
[
221224
desc_signature,
222225
(
223-
[desc_annotation, ('class', desc_sig_space)],
226+
[
227+
desc_annotation,
228+
([desc_sig_keyword, 'class'], desc_sig_space),
229+
],
224230
[desc_addname, 'example.'],
225231
[desc_name, 'Class'],
226232
),
@@ -294,7 +300,10 @@ def test_info_field_list_Literal(app):
294300
[
295301
desc_signature,
296302
(
297-
[desc_annotation, ('class', desc_sig_space)],
303+
[
304+
desc_annotation,
305+
([desc_sig_keyword, 'class'], desc_sig_space),
306+
],
298307
[desc_addname, 'example.'],
299308
[desc_name, 'Class'],
300309
),

0 commit comments

Comments
 (0)