Skip to content

Commit f4c70bc

Browse files
authored
Feat: clean rendered violations from details (#3514)
1 parent ca691a2 commit f4c70bc

File tree

2 files changed

+36
-2
lines changed

2 files changed

+36
-2
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ Semantic versioning in our case means:
2727
### Misc
2828

2929
- Adds custom Sphinx directive `.. plugincodes` for violation rendering, #1318
30+
- Adds violation classes filter for docs rendering, #3490
3031

3132

3233
## 1.3.0

docs/ext/plugincodes.py

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
import importlib
2+
import re
23
from collections.abc import Sequence
34
from inspect import isclass
45
from types import ModuleType
56
from typing import final
67

78
from docutils import nodes
89
from docutils.statemachine import StringList
10+
from sphinx import addnodes
911
from sphinx.application import Sphinx
1012
from sphinx.ext import autosummary
1113
from sphinx.ext.autodoc.directive import AutodocDirective
@@ -93,15 +95,19 @@ def get_autoclass_nodes(
9395
) -> Sequence[nodes.Node]:
9496
"""Use autodoc for build violation docstring nodes."""
9597
violation_class_nodes = []
98+
options = {
99+
'exclude-members': 'error_template,code',
100+
}
96101
for violation_class in violation_classes:
97102
local_autodoc = AutodocDirective(
98103
name='autoclass',
99104
arguments=[violation_class.__name__],
100-
options={},
105+
options=options,
101106
content=StringList(),
102107
**kwargs,
103108
)
104-
violation_class_nodes.extend(local_autodoc.run())
109+
filtered_nodes = self._filter_autoclass_nodes(local_autodoc.run())
110+
violation_class_nodes.extend(filtered_nodes)
105111

106112
return violation_class_nodes
107113

@@ -121,6 +127,33 @@ def get_automodule_nodes(
121127

122128
return local_autodoc.run()
123129

130+
def _filter_autoclass_nodes(
131+
self, nodes_to_filter: Sequence[nodes.Node]
132+
) -> Sequence[nodes.Node]:
133+
all_nodes = (
134+
inner_node
135+
for node in nodes_to_filter
136+
for inner_node in node.traverse(nodes.Node)
137+
)
138+
for node in all_nodes:
139+
text_node = node.astext().strip()
140+
141+
if (
142+
isinstance(node, addnodes.desc_annotation)
143+
and text_node == 'final class'
144+
):
145+
node.parent.remove(node)
146+
147+
if isinstance(node, addnodes.desc_parameterlist):
148+
node.parent.remove(node)
149+
150+
if isinstance(node, nodes.paragraph) and re.match(
151+
r'^Bases: [A-Za-z.]+$', text_node
152+
):
153+
node.parent.remove(node)
154+
155+
return nodes_to_filter
156+
124157

125158
def setup(app: Sphinx) -> None:
126159
"""Setup for sphinx extension."""

0 commit comments

Comments
 (0)