Implemented sphinx.ext.autodoc.MethodDocumenter.import_object for python3

This commit is contained in:
Daniel Neuhäuser 2010-06-19 18:23:49 +02:00
parent b621cfaec1
commit c967651712

View File

@ -251,6 +251,9 @@ class Documenter(object):
self.retann = None self.retann = None
# the object to document (set after import_object succeeds) # the object to document (set after import_object succeeds)
self.object = None self.object = None
self.object_name = None
# the parent/owner of the object to document
self.parent = None
# the module analyzer to get at attribute docs, or None # the module analyzer to get at attribute docs, or None
self.analyzer = None self.analyzer = None
@ -316,9 +319,13 @@ class Documenter(object):
""" """
try: try:
__import__(self.modname) __import__(self.modname)
parent = None
obj = self.module = sys.modules[self.modname] obj = self.module = sys.modules[self.modname]
for part in self.objpath: for part in self.objpath:
parent = obj
obj = self.get_attr(obj, part) obj = self.get_attr(obj, part)
self.object_name = part
self.parent = parent
self.object = obj self.object = obj
return True return True
# this used to only catch SyntaxError, ImportError and AttributeError, # this used to only catch SyntaxError, ImportError and AttributeError,
@ -1007,24 +1014,38 @@ class MethodDocumenter(ClassLevelDocumenter):
return inspect.isroutine(member) and \ return inspect.isroutine(member) and \
not isinstance(parent, ModuleDocumenter) not isinstance(parent, ModuleDocumenter)
def import_object(self): if sys.version_info >= (3, 0):
ret = ClassLevelDocumenter.import_object(self) def import_object(self):
if isinstance(self.object, classmethod) or \ ret = ClassLevelDocumenter.import_object(self)
(isinstance(self.object, MethodType) and obj_from_parent = self.parent.__dict__.get(self.object_name)
self.object.im_self is not None): if isinstance(obj_from_parent, classmethod):
self.directivetype = 'classmethod' self.directivetype = 'classmethod'
# document class and static members before ordinary ones self.member_order = self.member_order - 1
self.member_order = self.member_order - 1 elif isinstance(obj_from_parent, staticmethod):
elif isinstance(self.object, FunctionType) or \ self.directivetype = 'staticmethod'
(isinstance(self.object, BuiltinFunctionType) and self.member_order = self.member_order - 1
hasattr(self.object, '__self__') and else:
self.object.__self__ is not None): self.directivetype = 'method'
self.directivetype = 'staticmethod' return ret
# document class and static members before ordinary ones else:
self.member_order = self.member_order - 1 def import_object(self):
else: ret = ClassLevelDocumenter.import_object(self)
self.directivetype = 'method' if isinstance(self.object, classmethod) or \
return ret (isinstance(self.object, MethodType) and
self.object.im_self is not None):
self.directivetype = 'classmethod'
# document class and static members before ordinary ones
self.member_order = self.member_order - 1
elif isinstance(self.object, FunctionType) or \
(isinstance(self.object, BuiltinFunctionType) and
hasattr(self.object, '__self__') and
self.object.__self__ is not None):
self.directivetype = 'staticmethod'
# document class and static members before ordinary ones
self.member_order = self.member_order - 1
else:
self.directivetype = 'method'
return ret
def format_args(self): def format_args(self):
if inspect.isbuiltin(self.object) or \ if inspect.isbuiltin(self.object) or \