Skip to content

Commit

Permalink
doc: patch Sphinx to detect our @final for marking classes as final
Browse files Browse the repository at this point in the history
Thanks to Dominic Davis-Foster for code & assistance.
  • Loading branch information
bluetech committed Oct 3, 2020
1 parent a6a7ba5 commit 0528d9f
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 1 deletion.
1 change: 1 addition & 0 deletions changelog/7780.doc.rst
@@ -0,0 +1 @@
Classes which should not be inherited from are now marked ``final class`` in the API reference.
22 changes: 21 additions & 1 deletion doc/en/conf.py
Expand Up @@ -15,9 +15,10 @@
#
# The full version, including alpha/beta/rc tags.
# The short X.Y version.
import ast
import os
import sys
from typing import TYPE_CHECKING
from typing import List

from _pytest import __version__ as version

Expand Down Expand Up @@ -398,3 +399,22 @@ def setup(app: "sphinx.application.Sphinx") -> None:
)

configure_logging(app)

# Make Sphinx mark classes with "final" when decorated with @final.
# We need this because we import final from pytest._compat, not from
# typing (for Python < 3.8 compat), so Sphinx doesn't detect it.
# To keep things simple we accept any `@final` decorator.
# Ref: https://github.com/pytest-dev/pytest/pull/7780
import sphinx.pycode.ast
import sphinx.pycode.parser

original_is_final = sphinx.pycode.parser.VariableCommentPicker.is_final

def patched_is_final(self, decorators: List[ast.expr]) -> bool:
if original_is_final(self, decorators):
return True
return any(
sphinx.pycode.ast.unparse(decorator) == "final" for decorator in decorators
)

sphinx.pycode.parser.VariableCommentPicker.is_final = patched_is_final

0 comments on commit 0528d9f

Please sign in to comment.