Skip to content

Commit

Permalink
autodoc: Add ObjectMember class
Browse files Browse the repository at this point in the history
To extend Documenter.get_object_member(), this adds a new class
`ObjectMember` to represent a member of the object.
  • Loading branch information
tk0miya committed Aug 14, 2020
1 parent f861b4c commit cd21fcc
Showing 1 changed file with 30 additions and 5 deletions.
35 changes: 30 additions & 5 deletions sphinx/ext/autodoc/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -255,6 +255,31 @@ def __getattr__(self, name: str) -> Any:
return None


class ObjectMember(tuple):
"""A member of object.
This is used for the result of `Documenter.get_object_members()` to
represent each member of the object.
.. Note::
An instance of this class behaves as a tuple of (name, object)
for compatibility to old Sphinx. The behavior will be dropped
in the future. Therefore extensions should not use the tuple
interface.
"""

def __new__(cls, name: str, obj: Any) -> Any:
return super().__new__(cls, (name, obj)) # type: ignore

def __init__(self, name: str, obj: Any) -> None:
self.__name__ = name
self.object = obj


ObjectMembers = Union[List[ObjectMember], List[Tuple[str, Any]]]


class Documenter:
"""
A Documenter knows how to autodocument a single object type. When
Expand Down Expand Up @@ -572,7 +597,7 @@ def add_content(self, more_content: Any, no_docstring: bool = False) -> None:
for line, src in zip(more_content.data, more_content.items):
self.add_line(line, src[0], src[1])

def get_object_members(self, want_all: bool) -> Tuple[bool, List[Tuple[str, Any]]]:
def get_object_members(self, want_all: bool) -> Tuple[bool, ObjectMembers]:
"""Return `(members_check_module, members)` where `members` is a
list of `(membername, member)` pairs of the members of *self.object*.
Expand All @@ -582,10 +607,10 @@ def get_object_members(self, want_all: bool) -> Tuple[bool, List[Tuple[str, Any]
members = get_object_members(self.object, self.objpath, self.get_attr, self.analyzer)
if not want_all:
if not self.options.members:
return False, []
return False, [] # type: ignore
# specific members given
selected = []
for name in self.options.members:
for name in self.options.members: # type: str
if name in members:
selected.append((name, members[name].value))
else:
Expand All @@ -598,7 +623,7 @@ def get_object_members(self, want_all: bool) -> Tuple[bool, List[Tuple[str, Any]
return False, [(m.name, m.value) for m in members.values()
if m.directly_defined]

def filter_members(self, members: List[Tuple[str, Any]], want_all: bool
def filter_members(self, members: ObjectMembers, want_all: bool
) -> List[Tuple[str, Any, bool]]:
"""Filter the given member list.
Expand Down Expand Up @@ -975,7 +1000,7 @@ def add_directive_header(self, sig: str) -> None:
if self.options.deprecated:
self.add_line(' :deprecated:', sourcename)

def get_object_members(self, want_all: bool) -> Tuple[bool, List[Tuple[str, Any]]]:
def get_object_members(self, want_all: bool) -> Tuple[bool, ObjectMembers]:
if want_all:
if self.__all__:
memberlist = self.__all__
Expand Down

0 comments on commit cd21fcc

Please sign in to comment.