mirror of
https://github.com/wxWidgets/Phoenix.git
synced 2026-01-05 03:20:08 +01:00
Phoenix:
- Add hyperlinks to external references (such as threading, code, exceptions and so on) to inheritance diagrams and sub/super classes; - Add a stub for the overview "Writing Non-English Applications"; - Better handling of `wx.lib` documentation extraction. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxPython/Phoenix/trunk@71156 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -46,9 +46,9 @@ The left location precedes the protocol in the URL string.
|
|||||||
|
|
||||||
It is not used by global protocols like HTTP but it becomes handy when nesting protocols - for example you may want to access files in a ZIP archive:
|
It is not used by global protocols like HTTP but it becomes handy when nesting protocols - for example you may want to access files in a ZIP archive:
|
||||||
|
|
||||||
file:archives/cpp_doc.zip#zip:reference/fopen.htm#syntax
|
``file:archives/cpp_doc.zip#zip:reference/fopen.htm#syntax``
|
||||||
|
|
||||||
In this example, the protocol is "zip", right location is "reference/fopen.htm", anchor is "syntax" and left location is "file:archives/cpp_doc.zip".
|
In this example, the protocol is "zip", right location is "reference/fopen.htm", anchor is "syntax" and left location is ``file:archives/cpp_doc.zip``.
|
||||||
|
|
||||||
There are two protocols used in this example: "zip" and "file".
|
There are two protocols used in this example: "zip" and "file".
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
.. _writing non-english applications:
|
.. _writing non-english applications:
|
||||||
|
|
||||||
=====================================================
|
=====================================================
|
||||||
|phoenix_title| **writing Non-English Applications**
|
|phoenix_title| **Writing Non-English Applications**
|
||||||
=====================================================
|
=====================================================
|
||||||
|
|
||||||
This article describes how to write applications that communicate with the
|
This article describes how to write applications that communicate with the
|
||||||
|
|||||||
@@ -2237,7 +2237,7 @@ class XMLDocString(object):
|
|||||||
inheritance_diagram = InheritanceDiagram(klass.nodeBases)
|
inheritance_diagram = InheritanceDiagram(klass.nodeBases)
|
||||||
png, map = inheritance_diagram.MakeInheritanceDiagram()
|
png, map = inheritance_diagram.MakeInheritanceDiagram()
|
||||||
|
|
||||||
image_desc = templates.TEMPLATE_INHERITANCE % (name, png, name, map)
|
image_desc = templates.TEMPLATE_INHERITANCE % ('class', name, png, name, map)
|
||||||
stream.write(image_desc)
|
stream.write(image_desc)
|
||||||
|
|
||||||
if self.appearance:
|
if self.appearance:
|
||||||
|
|||||||
@@ -145,6 +145,19 @@ HTML_REPLACE = ['module', 'function', 'method', 'class', 'classmethod', 'staticm
|
|||||||
# Today's date representation for the Sphinx HTML docs
|
# Today's date representation for the Sphinx HTML docs
|
||||||
TODAY = datetime.date.today().strftime('%d %B %Y')
|
TODAY = datetime.date.today().strftime('%d %B %Y')
|
||||||
|
|
||||||
|
# Inheritance diagram external hyperlinks
|
||||||
|
|
||||||
|
PYTHON_DOCS = 'http://docs.python.org/library/'
|
||||||
|
NUMPY_DOCS = 'http://docs.scipy.org/doc/numpy/reference/generated/'
|
||||||
|
|
||||||
|
EXTERN_INHERITANCE = {'UserDict.' : PYTHON_DOCS,
|
||||||
|
'ctypes.' : PYTHON_DOCS,
|
||||||
|
'code.' : PYTHON_DOCS,
|
||||||
|
'exceptions.': PYTHON_DOCS,
|
||||||
|
'threading.' : PYTHON_DOCS,
|
||||||
|
'numpy.' : NUMPY_DOCS
|
||||||
|
}
|
||||||
|
|
||||||
# wx.lib and other pure-Python stuff
|
# wx.lib and other pure-Python stuff
|
||||||
|
|
||||||
class Enumeration(object):
|
class Enumeration(object):
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ from subprocess import Popen, PIPE
|
|||||||
|
|
||||||
# Phoenix-specific imports
|
# Phoenix-specific imports
|
||||||
|
|
||||||
from utilities import Wx2Sphinx
|
from utilities import Wx2Sphinx, FormatExternalLink
|
||||||
from constants import INHERITANCEROOT
|
from constants import INHERITANCEROOT
|
||||||
|
|
||||||
ENOENT = getattr(errno, 'ENOENT', 0)
|
ENOENT = getattr(errno, 'ENOENT', 0)
|
||||||
@@ -91,8 +91,10 @@ class InheritanceDiagram(object):
|
|||||||
nodename = fullname = name_parts[-1]
|
nodename = fullname = name_parts[-1]
|
||||||
else:
|
else:
|
||||||
# Just the last 2 parts
|
# Just the last 2 parts
|
||||||
nodename = '.'.join(name_parts[-2:])
|
nodename = '.'.join(name_parts[-2:])
|
||||||
|
if fullname.startswith('wx.'):
|
||||||
|
fullname = fullname[3:]
|
||||||
|
|
||||||
return nodename, fullname
|
return nodename, fullname
|
||||||
|
|
||||||
|
|
||||||
@@ -120,14 +122,12 @@ class InheritanceDiagram(object):
|
|||||||
def _format_graph_attrs(self, attrs):
|
def _format_graph_attrs(self, attrs):
|
||||||
return ''.join(['%s=%s;\n' % x for x in attrs.items()])
|
return ''.join(['%s=%s;\n' % x for x in attrs.items()])
|
||||||
|
|
||||||
def generate_dot(self, name="dummy", urls={}, graph_attrs={}, node_attrs={}, edge_attrs={}):
|
def generate_dot(self, class_summary, name="dummy", graph_attrs={}, node_attrs={}, edge_attrs={}):
|
||||||
"""Generate a graphviz dot graph from the classes that were passed in
|
"""Generate a graphviz dot graph from the classes that were passed in
|
||||||
to __init__.
|
to __init__.
|
||||||
|
|
||||||
*name* is the name of the graph.
|
*name* is the name of the graph.
|
||||||
|
|
||||||
*urls* is a dictionary mapping class names to HTTP URLs.
|
|
||||||
|
|
||||||
*graph_attrs*, *node_attrs*, *edge_attrs* are dictionaries containing
|
*graph_attrs*, *node_attrs*, *edge_attrs* are dictionaries containing
|
||||||
key/value pairs to pass on as graphviz properties.
|
key/value pairs to pass on as graphviz properties.
|
||||||
"""
|
"""
|
||||||
@@ -165,8 +165,21 @@ class InheritanceDiagram(object):
|
|||||||
newname, fullname = Wx2Sphinx(name)
|
newname, fullname = Wx2Sphinx(name)
|
||||||
else:
|
else:
|
||||||
newname = name
|
newname = name
|
||||||
|
|
||||||
this_node_attrs['URL'] = '"%s.html"'%fullname
|
if class_summary is None:
|
||||||
|
# Phoenix base classes, assume there is always a link
|
||||||
|
this_node_attrs['URL'] = '"%s.html"'%fullname
|
||||||
|
else:
|
||||||
|
if 'wx.' in fullname:
|
||||||
|
fullname = fullname[3:]
|
||||||
|
|
||||||
|
if fullname in class_summary:
|
||||||
|
this_node_attrs['URL'] = '"%s.html"'%fullname
|
||||||
|
else:
|
||||||
|
full_page = FormatExternalLink(fullname, inheritance=True)
|
||||||
|
if full_page:
|
||||||
|
this_node_attrs['URL'] = full_page
|
||||||
|
|
||||||
res.append(' "%s" [%s];\n' %
|
res.append(' "%s" [%s];\n' %
|
||||||
(newname, self._format_node_attrs(this_node_attrs)))
|
(newname, self._format_node_attrs(this_node_attrs)))
|
||||||
|
|
||||||
@@ -189,13 +202,16 @@ class InheritanceDiagram(object):
|
|||||||
|
|
||||||
# ----------------------------------------------------------------------- #
|
# ----------------------------------------------------------------------- #
|
||||||
|
|
||||||
def MakeInheritanceDiagram(self):
|
def MakeInheritanceDiagram(self, class_summary):
|
||||||
"""
|
"""
|
||||||
Actually generates the inheritance diagram as a PNG file plus the corresponding
|
Actually generates the inheritance diagram as a PNG file plus the corresponding
|
||||||
MAP file for mouse navigation over the inheritance boxes.
|
MAP file for mouse navigation over the inheritance boxes.
|
||||||
|
|
||||||
These two files are saved into the ``INHERITANCEROOT`` folder (see `sphinxtools/constants.py`
|
These two files are saved into the ``INHERITANCEROOT`` folder (see `sphinxtools/constants.py`
|
||||||
for more information).
|
for more information).
|
||||||
|
|
||||||
|
:param `class_summary`: if not ``None``, used to identify if a class is actually been
|
||||||
|
wrapped or not (to avoid links pointing to non-existent pages).
|
||||||
|
|
||||||
:rtype: `tuple`
|
:rtype: `tuple`
|
||||||
|
|
||||||
@@ -221,7 +237,7 @@ class InheritanceDiagram(object):
|
|||||||
fid.close()
|
fid.close()
|
||||||
return os.path.split(outfn)[1], map.replace('\n', ' ')
|
return os.path.split(outfn)[1], map.replace('\n', ' ')
|
||||||
|
|
||||||
code = self.generate_dot()
|
code = self.generate_dot(class_summary)
|
||||||
|
|
||||||
# graphviz expects UTF-8 by default
|
# graphviz expects UTF-8 by default
|
||||||
if isinstance(code, unicode):
|
if isinstance(code, unicode):
|
||||||
|
|||||||
@@ -1,22 +1,18 @@
|
|||||||
import sys
|
import sys
|
||||||
import os
|
import os
|
||||||
import operator
|
import operator
|
||||||
import errno
|
|
||||||
import re
|
import re
|
||||||
|
import cPickle
|
||||||
|
|
||||||
from StringIO import StringIO
|
from StringIO import StringIO
|
||||||
from subprocess import Popen, PIPE
|
|
||||||
|
|
||||||
from inspect import getmro, getclasstree, getdoc, getcomments
|
from inspect import getmro, getclasstree, getdoc, getcomments
|
||||||
|
|
||||||
from utilities import MakeSummary, ChopDescription, WriteSphinxOutput
|
from utilities import MakeSummary, ChopDescription, WriteSphinxOutput
|
||||||
from utilities import FindControlImages, PickleClassInfo
|
from utilities import FindControlImages, FormatExternalLink
|
||||||
from constants import object_types, MODULE_TO_ICON, DOXY_2_REST
|
from constants import object_types, MODULE_TO_ICON, DOXY_2_REST, SPHINXROOT
|
||||||
import templates
|
import templates
|
||||||
|
|
||||||
ENOENT = getattr(errno, 'ENOENT', 0)
|
|
||||||
EPIPE = getattr(errno, 'EPIPE', 0)
|
|
||||||
|
|
||||||
EPYDOC_PATTERN = re.compile(r'\S+{\S+}', re.DOTALL)
|
EPYDOC_PATTERN = re.compile(r'\S+{\S+}', re.DOTALL)
|
||||||
|
|
||||||
reload(sys)
|
reload(sys)
|
||||||
@@ -75,7 +71,7 @@ def generic_summary(libraryItem, stream):
|
|||||||
table = []
|
table = []
|
||||||
for item in sub_list:
|
for item in sub_list:
|
||||||
|
|
||||||
if item.is_redundant or item.GetShortName().startswith('__test') or '.extern.' in item.name:
|
if item.is_redundant:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
item_docs = ReplaceWxDot(item.docs)
|
item_docs = ReplaceWxDot(item.docs)
|
||||||
@@ -140,7 +136,13 @@ def ReplaceWxDot(text):
|
|||||||
|
|
||||||
newtext += header + '\n'
|
newtext += header + '\n'
|
||||||
newtext += '-'*len(header) + '\n\n'
|
newtext += '-'*len(header) + '\n\n'
|
||||||
|
|
||||||
|
# Try and replace True with ``True`` and False with ``False``
|
||||||
|
# ``None`` gives trouble sometimes...
|
||||||
|
|
||||||
|
for keyword in ['True', 'False']:
|
||||||
|
newtext = re.sub(r'\s%s\s'%keyword, ' ``%s`` '%keyword, newtext)
|
||||||
|
|
||||||
return newtext
|
return newtext
|
||||||
|
|
||||||
|
|
||||||
@@ -183,8 +185,10 @@ def FindBestLink(klass, newlink):
|
|||||||
return ':mod:`~%s`'%child.name
|
return ':mod:`~%s`'%child.name
|
||||||
elif child.kind in range(object_types.FUNCTION, object_types.INSTANCE_METHOD):
|
elif child.kind in range(object_types.FUNCTION, object_types.INSTANCE_METHOD):
|
||||||
return ':meth:`~%s`'%child.name
|
return ':meth:`~%s`'%child.name
|
||||||
else:
|
elif child.kind == object_types.KLASS:
|
||||||
return ':class:`~%s`'%child.name
|
return ':class:`~%s`'%child.name
|
||||||
|
else:
|
||||||
|
return ':attr:`~%s`'%child.name
|
||||||
|
|
||||||
full_loop = FindInHierarchy(klass, newlink)
|
full_loop = FindInHierarchy(klass, newlink)
|
||||||
|
|
||||||
@@ -290,6 +294,9 @@ class ParentBase(object):
|
|||||||
|
|
||||||
def Save(self):
|
def Save(self):
|
||||||
|
|
||||||
|
if self.GetShortName().startswith('__test') or '.extern.' in self.name:
|
||||||
|
self.is_redundant = True
|
||||||
|
|
||||||
self.children = sorted(self.children, key=lambda k: (getattr(k, "order"), getattr(k, "name").lower()))
|
self.children = sorted(self.children, key=lambda k: (getattr(k, "order"), getattr(k, "name").lower()))
|
||||||
|
|
||||||
if self.docs is None:
|
if self.docs is None:
|
||||||
@@ -377,7 +384,7 @@ class ParentBase(object):
|
|||||||
return items
|
return items
|
||||||
|
|
||||||
|
|
||||||
def ToRest(self):
|
def ToRest(self, class_summary):
|
||||||
|
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@@ -403,10 +410,10 @@ class Library(ParentBase):
|
|||||||
return self.name
|
return self.name
|
||||||
|
|
||||||
|
|
||||||
def Walk(self, obj):
|
def Walk(self, obj, class_summary):
|
||||||
|
|
||||||
if obj == self:
|
if obj == self:
|
||||||
obj.ToRest()
|
obj.ToRest(class_summary)
|
||||||
|
|
||||||
# must have at least root folder
|
# must have at least root folder
|
||||||
children = obj.GetChildren()
|
children = obj.GetChildren()
|
||||||
@@ -420,10 +427,10 @@ class Library(ParentBase):
|
|||||||
if child.is_redundant:
|
if child.is_redundant:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
child.ToRest()
|
child.ToRest(class_summary)
|
||||||
|
|
||||||
# recursively scan other folders, appending results
|
# recursively scan other folders, appending results
|
||||||
self.Walk(child)
|
self.Walk(child, class_summary)
|
||||||
|
|
||||||
|
|
||||||
def FindItem(self, newlink, obj=None):
|
def FindItem(self, newlink, obj=None):
|
||||||
@@ -451,8 +458,10 @@ class Library(ParentBase):
|
|||||||
return ':mod:`~%s`'%child.name
|
return ':mod:`~%s`'%child.name
|
||||||
elif child.kind in range(object_types.FUNCTION, object_types.INSTANCE_METHOD+1):
|
elif child.kind in range(object_types.FUNCTION, object_types.INSTANCE_METHOD+1):
|
||||||
return ':meth:`~%s`'%child.name
|
return ':meth:`~%s`'%child.name
|
||||||
else:
|
elif child.kind == object_types.KLASS:
|
||||||
return ':class:`~%s`'%child.name
|
return ':class:`~%s`'%child.name
|
||||||
|
else:
|
||||||
|
return ':attr:`~%s`'%child.name
|
||||||
|
|
||||||
bestlink = self.FindItem(newlink, child)
|
bestlink = self.FindItem(newlink, child)
|
||||||
|
|
||||||
@@ -467,7 +476,7 @@ class Library(ParentBase):
|
|||||||
return self.python_version
|
return self.python_version
|
||||||
|
|
||||||
|
|
||||||
def ToRest(self):
|
def ToRest(self, class_summary):
|
||||||
|
|
||||||
print '\n\nReST-ifying %s...\n\n'%self.base_name
|
print '\n\nReST-ifying %s...\n\n'%self.base_name
|
||||||
stream = StringIO()
|
stream = StringIO()
|
||||||
@@ -483,7 +492,51 @@ class Library(ParentBase):
|
|||||||
generic_summary(self, stream)
|
generic_summary(self, stream)
|
||||||
WriteSphinxOutput(stream, self.sphinx_file)
|
WriteSphinxOutput(stream, self.sphinx_file)
|
||||||
|
|
||||||
|
|
||||||
|
def ClassesToPickle(self, obj, class_dict):
|
||||||
|
|
||||||
|
# must have at least root folder
|
||||||
|
children = obj.GetChildren()
|
||||||
|
|
||||||
|
if not children:
|
||||||
|
return class_dict
|
||||||
|
|
||||||
|
# check each name
|
||||||
|
for child in children:
|
||||||
|
if child.kind == object_types.KLASS:
|
||||||
|
if child.is_redundant:
|
||||||
|
continue
|
||||||
|
|
||||||
|
class_dict[child.name] = (child.method_list, child.bases)
|
||||||
|
|
||||||
|
# recursively scan other folders, appending results
|
||||||
|
class_dict = self.ClassesToPickle(child, class_dict)
|
||||||
|
|
||||||
|
return class_dict
|
||||||
|
|
||||||
|
|
||||||
|
def Save(self):
|
||||||
|
|
||||||
|
ParentBase.Save(self)
|
||||||
|
|
||||||
|
class_dict = {}
|
||||||
|
class_dict = self.ClassesToPickle(self, class_dict)
|
||||||
|
|
||||||
|
pickle_file = os.path.join(SPHINXROOT, 'class_summary.lst')
|
||||||
|
|
||||||
|
if os.path.isfile(pickle_file):
|
||||||
|
fid = open(pickle_file, 'rb')
|
||||||
|
items = cPickle.load(fid)
|
||||||
|
fid.close()
|
||||||
|
else:
|
||||||
|
items = {}
|
||||||
|
|
||||||
|
items.update(class_dict)
|
||||||
|
fid = open(pickle_file, 'wb')
|
||||||
|
cPickle.dump(items, fid)
|
||||||
|
fid.close()
|
||||||
|
|
||||||
|
|
||||||
class Module(ParentBase):
|
class Module(ParentBase):
|
||||||
|
|
||||||
def __init__(self, name, kind):
|
def __init__(self, name, kind):
|
||||||
@@ -508,9 +561,9 @@ class Module(ParentBase):
|
|||||||
self.inheritance_diagram = None
|
self.inheritance_diagram = None
|
||||||
|
|
||||||
|
|
||||||
def ToRest(self):
|
def ToRest(self, class_summary):
|
||||||
|
|
||||||
if self.is_redundant or self.GetShortName().startswith('__test') or '.extern.' in self.name:
|
if self.is_redundant:
|
||||||
return
|
return
|
||||||
|
|
||||||
stream = StringIO()
|
stream = StringIO()
|
||||||
@@ -537,9 +590,9 @@ class Module(ParentBase):
|
|||||||
if self.kind != object_types.PACKAGE:
|
if self.kind != object_types.PACKAGE:
|
||||||
print '%s - %s (module)'%(spacer, self.name)
|
print '%s - %s (module)'%(spacer, self.name)
|
||||||
if self.inheritance_diagram:
|
if self.inheritance_diagram:
|
||||||
png, map = self.inheritance_diagram.MakeInheritanceDiagram()
|
png, map = self.inheritance_diagram.MakeInheritanceDiagram(class_summary)
|
||||||
short_name = self.GetShortName()
|
short_name = self.GetShortName()
|
||||||
image_desc = templates.TEMPLATE_INHERITANCE % (short_name, png, short_name, map)
|
image_desc = templates.TEMPLATE_INHERITANCE % ('module', short_name, png, short_name, map)
|
||||||
stream.write(image_desc)
|
stream.write(image_desc)
|
||||||
else:
|
else:
|
||||||
print '%s - %s (package)'%(spacer, self.name)
|
print '%s - %s (package)'%(spacer, self.name)
|
||||||
@@ -564,7 +617,14 @@ class Module(ParentBase):
|
|||||||
|
|
||||||
WriteSphinxOutput(stream, self.sphinx_file)
|
WriteSphinxOutput(stream, self.sphinx_file)
|
||||||
|
|
||||||
|
|
||||||
|
def Save(self):
|
||||||
|
|
||||||
|
ParentBase.Save(self)
|
||||||
|
|
||||||
|
if self.GetShortName().startswith('__test') or '.extern.' in self.name:
|
||||||
|
self.is_redundant = True
|
||||||
|
|
||||||
|
|
||||||
class Class(ParentBase):
|
class Class(ParentBase):
|
||||||
|
|
||||||
@@ -635,9 +695,9 @@ class Class(ParentBase):
|
|||||||
self.sphinx_file = MakeSphinxFile(name)
|
self.sphinx_file = MakeSphinxFile(name)
|
||||||
|
|
||||||
|
|
||||||
def ToRest(self):
|
def ToRest(self, class_summary):
|
||||||
|
|
||||||
if self.is_redundant or self.GetShortName().startswith('__test') or '.extern.' in self.name:
|
if self.is_redundant:
|
||||||
return
|
return
|
||||||
|
|
||||||
stream = StringIO()
|
stream = StringIO()
|
||||||
@@ -656,9 +716,9 @@ class Class(ParentBase):
|
|||||||
stream.write(class_docs + '\n\n')
|
stream.write(class_docs + '\n\n')
|
||||||
|
|
||||||
if self.inheritance_diagram:
|
if self.inheritance_diagram:
|
||||||
png, map = self.inheritance_diagram.MakeInheritanceDiagram()
|
png, map = self.inheritance_diagram.MakeInheritanceDiagram(class_summary)
|
||||||
short_name = self.GetShortName()
|
short_name = self.GetShortName()
|
||||||
image_desc = templates.TEMPLATE_INHERITANCE % (short_name, png, short_name, map)
|
image_desc = templates.TEMPLATE_INHERITANCE % ('class', short_name, png, short_name, map)
|
||||||
stream.write(image_desc)
|
stream.write(image_desc)
|
||||||
|
|
||||||
appearance = FindControlImages(self.name.lower())
|
appearance = FindControlImages(self.name.lower())
|
||||||
@@ -667,13 +727,13 @@ class Class(ParentBase):
|
|||||||
stream.write(appearance_desc + '\n\n')
|
stream.write(appearance_desc + '\n\n')
|
||||||
|
|
||||||
if self.subClasses:
|
if self.subClasses:
|
||||||
subs = [':ref:`%s`'%cls for cls in self.subClasses]
|
subs = [FormatExternalLink(cls) for cls in self.subClasses]
|
||||||
subs = ', '.join(subs)
|
subs = ', '.join(subs)
|
||||||
subs_desc = templates.TEMPLATE_SUBCLASSES % subs
|
subs_desc = templates.TEMPLATE_SUBCLASSES % subs
|
||||||
stream.write(subs_desc)
|
stream.write(subs_desc)
|
||||||
|
|
||||||
if self.superClasses:
|
if self.superClasses:
|
||||||
sups = [':ref:`%s`'%cls for cls in self.superClasses]
|
sups = [FormatExternalLink(cls) for cls in self.superClasses]
|
||||||
sups = ', '.join(sups)
|
sups = ', '.join(sups)
|
||||||
sups_desc = templates.TEMPLATE_SUPERCLASSES % sups
|
sups_desc = templates.TEMPLATE_SUPERCLASSES % sups
|
||||||
stream.write(sups_desc)
|
stream.write(sups_desc)
|
||||||
@@ -691,23 +751,16 @@ class Class(ParentBase):
|
|||||||
|
|
||||||
methods = self.GetItemByKind(object_types.METHOD, object_types.INSTANCE_METHOD)
|
methods = self.GetItemByKind(object_types.METHOD, object_types.INSTANCE_METHOD)
|
||||||
properties = self.GetItemByKind(object_types.PROPERTY)
|
properties = self.GetItemByKind(object_types.PROPERTY)
|
||||||
method_list = []
|
|
||||||
|
|
||||||
for meth in methods:
|
for meth in methods:
|
||||||
meth.Write(stream)
|
meth.Write(stream)
|
||||||
if not meth.is_redundant:
|
|
||||||
method_list.append((meth.GetShortName(), ''))
|
|
||||||
|
|
||||||
for prop in properties:
|
for prop in properties:
|
||||||
prop.Write(stream, short_name)
|
prop.Write(stream, short_name)
|
||||||
|
|
||||||
WriteSphinxOutput(stream, self.sphinx_file)
|
WriteSphinxOutput(stream, self.sphinx_file)
|
||||||
|
|
||||||
self.bases = self.superClasses
|
self.bases = self.superClasses
|
||||||
self.method_list = method_list
|
|
||||||
|
|
||||||
PickleClassInfo(self.name, self)
|
|
||||||
|
|
||||||
|
|
||||||
def Save(self):
|
def Save(self):
|
||||||
|
|
||||||
@@ -736,6 +789,22 @@ class Class(ParentBase):
|
|||||||
if len(self.signature) < 2:
|
if len(self.signature) < 2:
|
||||||
self.is_redundant = True
|
self.is_redundant = True
|
||||||
|
|
||||||
|
if self.GetShortName().startswith('__test') or '.extern.' in self.name:
|
||||||
|
self.is_redundant = True
|
||||||
|
|
||||||
|
if self.is_redundant:
|
||||||
|
return
|
||||||
|
|
||||||
|
methods = self.GetItemByKind(object_types.METHOD, object_types.INSTANCE_METHOD)
|
||||||
|
method_list = []
|
||||||
|
|
||||||
|
for meth in methods:
|
||||||
|
if not meth.is_redundant:
|
||||||
|
method_list.append(meth.GetShortName())
|
||||||
|
|
||||||
|
self.method_list = method_list
|
||||||
|
self.bases = self.superClasses
|
||||||
|
|
||||||
|
|
||||||
class ChildrenBase(object):
|
class ChildrenBase(object):
|
||||||
|
|
||||||
@@ -793,7 +862,7 @@ class ChildrenBase(object):
|
|||||||
self.comments = u''
|
self.comments = u''
|
||||||
|
|
||||||
|
|
||||||
def ToRest(self):
|
def ToRest(self, class_summary):
|
||||||
|
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@@ -972,7 +1041,7 @@ class Attribute(ChildrenBase):
|
|||||||
self.order = 7
|
self.order = 7
|
||||||
|
|
||||||
|
|
||||||
def ToRest(self):
|
def ToRest(self, class_summary):
|
||||||
|
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|||||||
@@ -15,6 +15,8 @@ import pkgutil
|
|||||||
|
|
||||||
import __builtin__
|
import __builtin__
|
||||||
|
|
||||||
|
from buildtools.config import phoenixDir
|
||||||
|
|
||||||
from inspect import getargspec, ismodule, getdoc, getmodule, getcomments, isfunction
|
from inspect import getargspec, ismodule, getdoc, getmodule, getcomments, isfunction
|
||||||
from inspect import ismethoddescriptor, getsource, ismemberdescriptor, isgetsetdescriptor
|
from inspect import ismethoddescriptor, getsource, ismemberdescriptor, isgetsetdescriptor
|
||||||
from inspect import isbuiltin, isclass, getfile, ismethod
|
from inspect import isbuiltin, isclass, getfile, ismethod
|
||||||
@@ -491,7 +493,7 @@ def Import(init_name, import_name, full_process=True):
|
|||||||
def PrintProgress(name, looped_names):
|
def PrintProgress(name, looped_names):
|
||||||
|
|
||||||
looped_names.append(name)
|
looped_names.append(name)
|
||||||
if len(looped_names) == 5:
|
if len(looped_names) == 4:
|
||||||
message = ", ".join(looped_names)
|
message = ", ".join(looped_names)
|
||||||
looped_names = []
|
looped_names = []
|
||||||
print message
|
print message
|
||||||
@@ -552,15 +554,29 @@ def SubImport(import_string, module, parent_class, ispkg):
|
|||||||
return module_class, count
|
return module_class, count
|
||||||
|
|
||||||
|
|
||||||
|
def ToRest(import_name):
|
||||||
|
|
||||||
|
sphinxDir = os.path.join(phoenixDir(), 'docs', 'sphinx')
|
||||||
|
pickle_file = os.path.join(sphinxDir, 'wx%s.pkl'%import_name)
|
||||||
|
|
||||||
|
fid = open(pickle_file, 'rb')
|
||||||
|
library_class = cPickle.load(fid)
|
||||||
|
fid.close()
|
||||||
|
|
||||||
|
fid = open(os.path.join(sphinxDir, 'class_summary.lst'), 'rb')
|
||||||
|
class_summary = cPickle.load(fid)
|
||||||
|
fid.close()
|
||||||
|
|
||||||
|
library_class.Walk(library_class, class_summary)
|
||||||
|
|
||||||
|
|
||||||
def ModuleHunter(init_name, import_name, version):
|
def ModuleHunter(init_name, import_name, version):
|
||||||
|
|
||||||
pickle_file = os.path.join(os.getcwd(), 'docs', 'sphinx', 'wx%s.pkl'%import_name)
|
sphinxDir = os.path.join(phoenixDir(), 'docs', 'sphinx')
|
||||||
|
pickle_file = os.path.join(sphinxDir, 'wx%s.pkl'%import_name)
|
||||||
|
|
||||||
if os.path.isfile(pickle_file):
|
if os.path.isfile(pickle_file):
|
||||||
fid = open(pickle_file, 'rb')
|
ToRest(import_name)
|
||||||
library_class = cPickle.load(fid)
|
|
||||||
fid.close()
|
|
||||||
library_class.Walk(library_class)
|
|
||||||
return
|
return
|
||||||
|
|
||||||
path = list(sys.path)
|
path = list(sys.path)
|
||||||
@@ -627,7 +643,7 @@ def ModuleHunter(init_name, import_name, version):
|
|||||||
cPickle.dump(library_class, fid)
|
cPickle.dump(library_class, fid)
|
||||||
fid.close()
|
fid.close()
|
||||||
|
|
||||||
library_class.Walk(library_class)
|
ToRest(import_name)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ TEMPLATE_INHERITANCE = '''
|
|||||||
|class_hierarchy| Inheritance Diagram
|
|class_hierarchy| Inheritance Diagram
|
||||||
=====================================
|
=====================================
|
||||||
|
|
||||||
Inheritance diagram for: **%s**
|
Inheritance diagram for %s **%s**
|
||||||
|
|
||||||
.. raw:: html
|
.. raw:: html
|
||||||
|
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ from templates import TEMPLATE_CONTRIB
|
|||||||
|
|
||||||
from constants import IGNORE, PUNCTUATION
|
from constants import IGNORE, PUNCTUATION
|
||||||
from constants import CPP_ITEMS, VERSION, VALUE_MAP
|
from constants import CPP_ITEMS, VERSION, VALUE_MAP
|
||||||
from constants import RE_KEEP_SPACES
|
from constants import RE_KEEP_SPACES, EXTERN_INHERITANCE
|
||||||
from constants import DOXYROOT, SPHINXROOT, WIDGETS_IMAGES_ROOT
|
from constants import DOXYROOT, SPHINXROOT, WIDGETS_IMAGES_ROOT
|
||||||
|
|
||||||
|
|
||||||
@@ -472,9 +472,11 @@ def MakeSummary(item_list, template, kind, add_tilde=True):
|
|||||||
:param list `item_list`: a list of tuples like `(method/property name, short docstrings)`.
|
:param list `item_list`: a list of tuples like `(method/property name, short docstrings)`.
|
||||||
:param string `template`: the template to use (from `sphinxtools/templates.py`, can
|
:param string `template`: the template to use (from `sphinxtools/templates.py`, can
|
||||||
be the ``TEMPLATE_METHOD_SUMMARY`` or the ``TEMPLATE_PROPERTY_SUMMARY``.
|
be the ``TEMPLATE_METHOD_SUMMARY`` or the ``TEMPLATE_PROPERTY_SUMMARY``.
|
||||||
:param string `kind`: can be ":meth:" or ":attr:" or ":ref:".
|
:param string `kind`: can be ``:meth:`` or ``:attr:`` or ``:ref:`` or ``:mod:``;
|
||||||
|
:param bool `add_tilde`: ``True`` to add the ``~`` character in front of the first
|
||||||
|
summary table column, ``False`` otherwise.
|
||||||
|
|
||||||
:rtype: `string`
|
:rtype: `string`
|
||||||
"""
|
"""
|
||||||
|
|
||||||
maxlen = 0
|
maxlen = 0
|
||||||
@@ -507,7 +509,9 @@ def WriteSphinxOutput(stream, filename, append=False):
|
|||||||
Writes the text contained in the `stream` to the `filename` output file.
|
Writes the text contained in the `stream` to the `filename` output file.
|
||||||
|
|
||||||
:param StringIO.StringIO `stream`: the stream where the text lives.
|
:param StringIO.StringIO `stream`: the stream where the text lives.
|
||||||
:param string `filename`: the output file we want to write the text in.
|
:param string `filename`: the output file we want to write the text in;
|
||||||
|
:param bool `append`: ``True`` to append to the file, ``False`` to simply
|
||||||
|
write to it.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
text_file = os.path.join(SPHINXROOT, filename)
|
text_file = os.path.join(SPHINXROOT, filename)
|
||||||
@@ -587,6 +591,13 @@ def PickleItem(description, current_module, name, kind):
|
|||||||
# ----------------------------------------------------------------------- #
|
# ----------------------------------------------------------------------- #
|
||||||
|
|
||||||
def PickleClassInfo(class_name, element):
|
def PickleClassInfo(class_name, element):
|
||||||
|
"""
|
||||||
|
Saves some information about a class in a cPickle-compatible file., i.e. the
|
||||||
|
list of methods in that class and its super-classes.
|
||||||
|
|
||||||
|
:param string `class_name`: the name of the class we want to pickle;
|
||||||
|
:param xml.etree.ElementTree.Element `element`: the XML element we want to examine.
|
||||||
|
"""
|
||||||
|
|
||||||
pickle_file = os.path.join(SPHINXROOT, 'class_summary.lst')
|
pickle_file = os.path.join(SPHINXROOT, 'class_summary.lst')
|
||||||
|
|
||||||
@@ -649,6 +660,19 @@ RAW_2 = """
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
def FormatContributedSnippets(kind, contrib_snippets):
|
def FormatContributedSnippets(kind, contrib_snippets):
|
||||||
|
"""
|
||||||
|
This method will include and properly ReST-ify contributed snippets
|
||||||
|
of wxPython code (at the moment only 2 snippets are available), by
|
||||||
|
including the Python code into the ReST files and allowing the user to
|
||||||
|
show/hide the snippets using a JavaScript "Accordion" script thanks to
|
||||||
|
the ``.. raw::`` directive (default for snippets is to be hidden).
|
||||||
|
|
||||||
|
:param string `kind`: can be "method", "function" or "class" depending on the
|
||||||
|
current item being scanned by the `sphinxgenerator.py` tool;
|
||||||
|
:param list `contrib_snippets`: a list of file names (with the ``*.py`` extension)
|
||||||
|
containing the contributed snippets of code. Normally these snippets live
|
||||||
|
in the ``SPHINXROOT/rest_substitutions/snippets/python/contrib`` folder.
|
||||||
|
"""
|
||||||
|
|
||||||
spacer = ''
|
spacer = ''
|
||||||
if kind == 'function':
|
if kind == 'function':
|
||||||
@@ -678,3 +702,55 @@ def FormatContributedSnippets(kind, contrib_snippets):
|
|||||||
text += RAW_2%(spacer, spacer)
|
text += RAW_2%(spacer, spacer)
|
||||||
|
|
||||||
return text
|
return text
|
||||||
|
|
||||||
|
|
||||||
|
def FormatExternalLink(fullname, inheritance=False):
|
||||||
|
"""
|
||||||
|
Analyzes the input `fullname` string to check whether a class description
|
||||||
|
is actually coming from an external documentation tool
|
||||||
|
(like http://docs.python.org/library/ or http://docs.scipy.org/doc/numpy/reference/generated/).
|
||||||
|
|
||||||
|
If the method finds such an external link, the associated inheritance
|
||||||
|
diagram (if `inheritance` is ``True``) or the ``:ref:`` directive are
|
||||||
|
modified accordingly to link it to the correct external documentation.
|
||||||
|
|
||||||
|
:param string `fullname`: the fully qualified name for a class, method or function,
|
||||||
|
i.e. `exceptions.Exception` or `threading.Thread`;
|
||||||
|
:param bool `inheritance`: ``True`` if the call is coming from :mod:`inheritance`,
|
||||||
|
``False`` otherwise.
|
||||||
|
"""
|
||||||
|
|
||||||
|
if fullname.count('.') == 0:
|
||||||
|
if not inheritance:
|
||||||
|
return ':class:`%s`'%fullname
|
||||||
|
return ''
|
||||||
|
|
||||||
|
parts = fullname.split('.')
|
||||||
|
possible_external = parts[-2] + '.'
|
||||||
|
real_name = '.'.join(parts[-2:])
|
||||||
|
|
||||||
|
if possible_external.startswith('_'):
|
||||||
|
# funny ctypes...
|
||||||
|
possible_external = possible_external[1:]
|
||||||
|
real_name = real_name[1:]
|
||||||
|
|
||||||
|
if possible_external not in EXTERN_INHERITANCE:
|
||||||
|
if not inheritance:
|
||||||
|
return ':class:`%s`'%fullname
|
||||||
|
|
||||||
|
return ''
|
||||||
|
|
||||||
|
base_address = EXTERN_INHERITANCE[possible_external]
|
||||||
|
|
||||||
|
if 'numpy' in real_name:
|
||||||
|
htmlpage = '%s.html#%s'%(real_name.lower(), real_name)
|
||||||
|
else:
|
||||||
|
htmlpage = '%shtml#%s'%(possible_external.lower(), real_name)
|
||||||
|
|
||||||
|
if inheritance:
|
||||||
|
full_page = '"%s"'%(base_address + htmlpage)
|
||||||
|
else:
|
||||||
|
full_page = '`%s <%s>`_'%(fullname, base_address + htmlpage)
|
||||||
|
|
||||||
|
return full_page
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user