Start working on the sphinx extension
This commit is contained in:
parent
9e4df7b407
commit
55cc205ebd
2
doc/_static/wsme.css
vendored
2
doc/_static/wsme.css
vendored
@ -1,4 +1,4 @@
|
||||
@import "agogo.css";
|
||||
@import "sphinxdoc.css";
|
||||
|
||||
table.docutils {
|
||||
margin: 0;
|
||||
|
@ -25,7 +25,7 @@ sys.path.insert(0, os.path.abspath('..'))
|
||||
|
||||
# Add any Sphinx extension module names here, as strings. They can be extensions
|
||||
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
|
||||
extensions = ['sphinx.ext.autodoc', 'sphinx.ext.viewcode']
|
||||
extensions = ['sphinx.ext.autodoc', 'sphinx.ext.viewcode', 'wsme.sphinxext']
|
||||
|
||||
# Add any paths that contain templates here, relative to this directory.
|
||||
templates_path = ['_templates']
|
||||
@ -92,7 +92,7 @@ pygments_style = 'sphinx'
|
||||
|
||||
# The theme to use for HTML and HTML Help pages. See the documentation for
|
||||
# a list of builtin themes.
|
||||
html_theme = 'agogo'
|
||||
html_theme = 'sphinxdoc'
|
||||
|
||||
html_style = 'wsme.css'
|
||||
|
||||
@ -106,7 +106,7 @@ html_style = 'wsme.css'
|
||||
|
||||
# The name for this set of Sphinx documents. If None, it defaults to
|
||||
# "<project> v<release> documentation".
|
||||
#html_title = None
|
||||
html_title = "WSME %s" % release
|
||||
|
||||
# A shorter title for the navigation bar. Default is the same as html_title.
|
||||
#html_short_title = None
|
||||
|
13
doc/document.rst
Normal file
13
doc/document.rst
Normal file
@ -0,0 +1,13 @@
|
||||
Document your API
|
||||
=================
|
||||
|
||||
.. default-domain:: wsme
|
||||
|
||||
.. type:: MyType
|
||||
|
||||
.. attribute:: test
|
||||
|
||||
:type: int
|
||||
|
||||
.. autotype:: wsme.sphinxext.SampleType
|
||||
:members:
|
@ -12,6 +12,7 @@ Contents
|
||||
types
|
||||
protocols
|
||||
integrate
|
||||
document
|
||||
|
||||
todo
|
||||
changes
|
||||
|
100
wsme/sphinxext.py
Normal file
100
wsme/sphinxext.py
Normal file
@ -0,0 +1,100 @@
|
||||
from sphinx.ext import autodoc
|
||||
from sphinx.domains.python import PyClasslike, PyClassmember
|
||||
from sphinx.domains import Domain, ObjType
|
||||
from sphinx.util.docfields import Field, GroupedField, TypedField
|
||||
|
||||
from sphinx.locale import l_, _
|
||||
|
||||
from docutils.parsers.rst import Directive
|
||||
|
||||
import wsme
|
||||
|
||||
|
||||
class SampleType(object):
|
||||
"""A Sample Type"""
|
||||
|
||||
#: A Int
|
||||
aint = int
|
||||
|
||||
|
||||
class TypeDirective(PyClasslike):
|
||||
pass
|
||||
|
||||
|
||||
class AttributeDirective(PyClassmember):
|
||||
doc_field_types = [
|
||||
Field('datatype', label=l_('Type'), has_arg=False,
|
||||
names=('type', 'datatype'))
|
||||
]
|
||||
|
||||
|
||||
class TypeDocumenter(autodoc.ClassDocumenter):
|
||||
objtype = 'type'
|
||||
directivetype = 'type'
|
||||
domain = 'wsme'
|
||||
|
||||
required_arguments = 1
|
||||
|
||||
@classmethod
|
||||
def can_document_member(cls, member, membername, isattr, parent):
|
||||
# we don't want to be automaticaly used
|
||||
# TODO check if the member is registered a an exposed type
|
||||
return False
|
||||
|
||||
def format_name(self):
|
||||
return self.object.__name__
|
||||
|
||||
def add_directive_header(self, sig):
|
||||
super(TypeDocumenter, self).add_directive_header(sig)
|
||||
# remove the :module: option that was added by ClassDocumenter
|
||||
if ':module:' in self.directive.result[-1]:
|
||||
self.directive.result.pop()
|
||||
|
||||
def import_object(self):
|
||||
if super(TypeDocumenter, self).import_object():
|
||||
wsme.types.register_type(self.object)
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
|
||||
class AttributeDocumenter(autodoc.AttributeDocumenter):
|
||||
datatype = None
|
||||
domain = 'wsme'
|
||||
|
||||
@classmethod
|
||||
def can_document_member(cls, member, membername, isattr, parent):
|
||||
return isinstance(parent, TypeDocumenter)
|
||||
|
||||
def import_object(self):
|
||||
success = super(AttributeDocumenter, self).import_object()
|
||||
if success:
|
||||
self.datatype = self.object.datatype
|
||||
return success
|
||||
|
||||
def add_content(self, more_content, no_docstring=False):
|
||||
self.add_line(u':type: %s' % self.datatype.__name__, '<sphinxext>')
|
||||
super(AttributeDocumenter, self).add_content(
|
||||
more_content, no_docstring)
|
||||
|
||||
def add_directive_header(self, sig):
|
||||
super(AttributeDocumenter, self).add_directive_header(sig)
|
||||
|
||||
|
||||
class WSMEDomain(Domain):
|
||||
name = 'wsme'
|
||||
|
||||
directives = {
|
||||
'type': TypeDirective,
|
||||
'attribute': AttributeDirective
|
||||
}
|
||||
|
||||
object_types = {
|
||||
'type': ObjType(l_('type'), 'type', 'obj')
|
||||
}
|
||||
|
||||
|
||||
def setup(app):
|
||||
app.add_domain(WSMEDomain)
|
||||
app.add_autodocumenter(TypeDocumenter)
|
||||
app.add_autodocumenter(AttributeDocumenter)
|
Loading…
x
Reference in New Issue
Block a user