From a05505a7ed8c8ae5928cd5968806559f65a20755 Mon Sep 17 00:00:00 2001 From: Object905 Date: Sat, 17 Feb 2024 14:59:12 +0500 Subject: [PATCH 1/2] fix: handle exception from autodoc for classes with __slots__ under sphinx_accessor --- sphinx_autosummary_accessors/documenters.py | 31 +++++++++++++++++++-- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/sphinx_autosummary_accessors/documenters.py b/sphinx_autosummary_accessors/documenters.py index 84e12f7..538ea26 100644 --- a/sphinx_autosummary_accessors/documenters.py +++ b/sphinx_autosummary_accessors/documenters.py @@ -1,6 +1,6 @@ from sphinx.ext.autodoc import AttributeDocumenter, Documenter, MethodDocumenter from sphinx.ext.autodoc.importer import import_module - +from sphinx.util import inspect class AccessorLevelDocumenter(Documenter): """ @@ -87,7 +87,32 @@ class AccessorAttributeDocumenter(AccessorLevelDocumenter, AttributeDocumenter): priority = 0.6 -class AccessorMethodDocumenter(AccessorLevelDocumenter, MethodDocumenter): +class SlottedParentMethodDocumenter(MethodDocumenter): + def import_object(self, raiseerror: bool = False) -> bool: + """Copy pasted from MethodDocumenter to handle parent with __slots__""" + ret = super(MethodDocumenter, self).import_object(raiseerror) + if not ret: + return ret + + # handle case when parent is instance with __slots__ + # otherwise autodoc errors, because it expects parents to have __dict__ + if hasattr(self.parent, '__slots__') and not isinstance(self.parent, type): + self.parent = self.parent.__class__ + + # to distinguish classmethod/staticmethod + obj = self.parent.__dict__.get(self.object_name) + + if obj is None: + obj = self.object + + if (inspect.isclassmethod(obj) or + inspect.isstaticmethod(obj, cls=self.parent, name=self.object_name)): + # document class and static members before ordinary ones + self.member_order = self.member_order - 1 + + return ret + +class AccessorMethodDocumenter(AccessorLevelDocumenter, SlottedParentMethodDocumenter): objtype = "accessormethod" directivetype = "method" @@ -95,7 +120,7 @@ class AccessorMethodDocumenter(AccessorLevelDocumenter, MethodDocumenter): priority = 0.6 -class AccessorCallableDocumenter(AccessorLevelDocumenter, MethodDocumenter): +class AccessorCallableDocumenter(AccessorLevelDocumenter, SlottedParentMethodDocumenter): """ This documenter lets us removes .__call__ from the method signature for callable accessors like Series.plot From 9999433200b3f649055a442b1766687908fe89f3 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 17 Feb 2024 10:06:56 +0000 Subject: [PATCH 2/2] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- sphinx_autosummary_accessors/documenters.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/sphinx_autosummary_accessors/documenters.py b/sphinx_autosummary_accessors/documenters.py index 538ea26..d2dcd3d 100644 --- a/sphinx_autosummary_accessors/documenters.py +++ b/sphinx_autosummary_accessors/documenters.py @@ -2,6 +2,7 @@ from sphinx.ext.autodoc.importer import import_module from sphinx.util import inspect + class AccessorLevelDocumenter(Documenter): """ Specialized Documenter subclass for objects on accessor level (methods, @@ -96,7 +97,7 @@ def import_object(self, raiseerror: bool = False) -> bool: # handle case when parent is instance with __slots__ # otherwise autodoc errors, because it expects parents to have __dict__ - if hasattr(self.parent, '__slots__') and not isinstance(self.parent, type): + if hasattr(self.parent, "__slots__") and not isinstance(self.parent, type): self.parent = self.parent.__class__ # to distinguish classmethod/staticmethod @@ -105,13 +106,15 @@ def import_object(self, raiseerror: bool = False) -> bool: if obj is None: obj = self.object - if (inspect.isclassmethod(obj) or - inspect.isstaticmethod(obj, cls=self.parent, name=self.object_name)): + if inspect.isclassmethod(obj) or inspect.isstaticmethod( + obj, cls=self.parent, name=self.object_name + ): # document class and static members before ordinary ones self.member_order = self.member_order - 1 return ret + class AccessorMethodDocumenter(AccessorLevelDocumenter, SlottedParentMethodDocumenter): objtype = "accessormethod" directivetype = "method" @@ -120,7 +123,9 @@ class AccessorMethodDocumenter(AccessorLevelDocumenter, SlottedParentMethodDocum priority = 0.6 -class AccessorCallableDocumenter(AccessorLevelDocumenter, SlottedParentMethodDocumenter): +class AccessorCallableDocumenter( + AccessorLevelDocumenter, SlottedParentMethodDocumenter +): """ This documenter lets us removes .__call__ from the method signature for callable accessors like Series.plot