Fixes for inheritance diagrams

This commit is contained in:
Robin Dunn
2016-06-08 00:31:10 -07:00
parent af7176bbd9
commit 664d5b765a
3 changed files with 43 additions and 24 deletions

View File

@@ -657,10 +657,10 @@ class ClassDef(BaseDef):
from etgtools import XMLSRC
if not read:
nodename = fullname = self.name
specials = [nodename]
fullname = self.name
specials = [fullname]
else:
nodename = fullname = element.text
fullname = element.text
baselist = []
@@ -678,7 +678,7 @@ class ClassDef(BaseDef):
for c in compounds:
baselist.append(c.text)
all_classes[nodename] = (nodename, fullname, baselist)
all_classes[fullname] = (fullname, baselist)
for c in compounds:
all_classes, specials = self.findHierarchy(c, all_classes, specials, True)
@@ -1276,14 +1276,14 @@ class PyClassDef(BaseDef):
def findHierarchy(self):
all_classes = {}
nodename = fullname = self.name
specials = [nodename]
fullname = self.name
specials = [fullname]
baselist = [base for base in self.bases if base != 'object']
all_classes[nodename] = (nodename, fullname, baselist)
all_classes[fullname] = (fullname, baselist)
for base in baselist:
all_classes[base] = (base, base, [])
all_classes[base] = (base, [])
return all_classes, specials

View File

@@ -2359,9 +2359,6 @@ class XMLDocString(object):
self.Reformat(stream)
if not klass.nodeBases:
klass.nodeBases = ({name: (name, name, [])}, [name])
inheritance_diagram = InheritanceDiagram(klass.nodeBases)
png, map = inheritance_diagram.makeInheritanceDiagram()
@@ -3045,6 +3042,8 @@ class SphinxGenerator(generators.DocsGeneratorBase):
def generatePyClass(self, klass):
self.fixNodeBaseNames(klass, ItemModuleMap())
klass.module = self.current_module
self.current_class = klass
@@ -3120,7 +3119,6 @@ class SphinxGenerator(generators.DocsGeneratorBase):
writeSphinxOutput(stream, filename, append=True)
# -----------------------------------------------------------------------
def generateClass(self, klass):
assert isinstance(klass, extractors.ClassDef)
@@ -3130,6 +3128,8 @@ class SphinxGenerator(generators.DocsGeneratorBase):
imm = ItemModuleMap()
self.fixNodeBaseNames(klass, imm)
# generate nested classes
for item in klass.innerclasses:
self.generateClass(item)
@@ -3217,6 +3217,28 @@ class SphinxGenerator(generators.DocsGeneratorBase):
# -----------------------------------------------------------------------
def fixNodeBaseNames(self, klass, imm):
# convert the names in nodeBases to fullnames
def _fix(name):
return imm.get_fullname(removeWxPrefix(name))
if not klass.nodeBases:
name = klass.pyName if klass.pyName else klass.name
name = _fix(name)
klass.nodeBases = ([(name, [])], [name])
return
bases, specials = klass.nodeBases
bases = list(bases.values())
specials = [_fix(s) for s in specials]
for idx, (name, baselist) in enumerate(bases):
name = _fix(name)
baselist = [_fix(b) for b in baselist]
bases[idx] = (name, baselist)
klass.nodeBases = (bases, specials)
# -----------------------------------------------------------------------
def generateMethod(self, method, name=None, docstring=None):
if method.ignored:
@@ -3392,18 +3414,19 @@ class SphinxGenerator(generators.DocsGeneratorBase):
typedef.module = self.current_module
all_classes = {}
nodename = fullname = name
specials = [nodename]
fullname = name
specials = [fullname]
baselist = [base for base in typedef.bases if base != 'object']
all_classes[nodename] = (nodename, fullname, baselist)
all_classes[fullname] = (fullname, baselist)
for base in baselist:
all_classes[base] = (base, base, [])
all_classes[base] = (base, [])
self.unIndent(typedef)
typedef.nodeBases = all_classes, specials
self.fixNodeBaseNames(typedef, ItemModuleMap())
typedef.subClasses = []
typedef.method_list = typedef.property_list = []
typedef.pyDocstring = typedef.briefDoc

View File

@@ -41,7 +41,6 @@ class InheritanceDiagram(object):
if main_class is None:
self.class_info, self.specials = classes
self.class_info = list(self.class_info.values())
else:
self.class_info, self.specials = self._class_info(classes)
@@ -65,7 +64,7 @@ class InheritanceDiagram(object):
return
baselist = []
all_classes[cls] = (fullname, fullname, baselist)
all_classes[cls] = (fullname, baselist)
for base in cls.__bases__:
name = self.class_name(base)
@@ -163,7 +162,7 @@ class InheritanceDiagram(object):
res.append('digraph %s {\n' % name)
res.append(self._format_graph_attrs(g_attrs))
for _, fullname, bases in self.class_info:
for fullname, bases in self.class_info:
# Write the node
this_node_attrs = n_attrs.copy()
@@ -192,9 +191,6 @@ class InheritanceDiagram(object):
if fullname in self.specials:
this_edge_attrs['color'] = 'red'
if self.main_class is None:
_, base_name = wx2Sphinx(base_name)
res.append(' "%s" -> "%s" [%s];\n' %
(base_name, fullname,
self._format_node_attrs(this_edge_attrs)))
@@ -230,7 +226,7 @@ class InheritanceDiagram(object):
if self.main_class is not None:
filename = self.main_class.name
else:
_, filename = wx2Sphinx(self.specials[0])
filename = self.specials[0]
outfn = os.path.join(static_root, filename + '_inheritance.png')
mapfile = outfn + '.map'