1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
|
# stdlib
from typing import Any, List, Tuple
# 3rd party
from sphinx.application import Sphinx
from sphinx.ext.autodoc import INSTANCEATTR
from sphinx.util.inspect import safe_getattr
from sphinx_toolbox.more_autodoc.autoprotocol import ProtocolDocumenter
from sphinx_toolbox.utils import SphinxExtMetadata, allow_subclass_add, filter_members_warning
class CoincidenceProtocolDocumenter(ProtocolDocumenter):
def filter_members(
self,
members: List[Tuple[str, Any]],
want_all: bool,
) -> List[Tuple[str, Any, bool]]:
"""
Filter the given member list.
:param members:
:param want_all:
"""
ret = []
# process members and determine which to skip
for (membername, member) in members:
# if isattr is True, the member is documented as an attribute
if safe_getattr(member, "__sphinx_mock__", False):
# mocked module or object
keep = False # pragma: no cover
elif (
self.options.get("exclude-protocol-members", [])
and membername in self.options["exclude-protocol-members"]
):
# remove members given by exclude-protocol-members
keep = False # pragma: no cover
elif membername in {"_abc_impl", "_is_runtime_protocol"}:
keep = False
elif membername not in self.globally_excluded_methods:
# Magic method you wouldn't overload, or private method.
if membername in dir(self.object.__base__):
keep = member is not getattr(self.object.__base__, membername)
else:
keep = True
else:
keep = False
# give the user a chance to decide whether this member
# should be skipped
if self.env.app:
# let extensions preprocess docstrings
try:
skip_user = self.env.app.emit_firstresult(
"autodoc-skip-member",
self.objtype,
membername,
member,
not keep,
self.options,
)
if skip_user is not None:
keep = not skip_user
except Exception as exc:
filter_members_warning(member, exc)
keep = False
if keep:
ret.append((membername, member, member is INSTANCEATTR))
return ret
def setup(app: Sphinx) -> SphinxExtMetadata:
app.setup_extension("sphinx_toolbox.more_autodoc.autoprotocol")
allow_subclass_add(app, CoincidenceProtocolDocumenter)
return {"parallel_read_safe": True}
|