The sphinx ext is now able to basicaly autodocument the functions (just retrivieve the docstrings for now

This commit is contained in:
Christophe de Vienne
2012-03-29 20:48:44 +02:00
parent f894097536
commit f2fbde0d6f
3 changed files with 85 additions and 3 deletions

View File

@@ -3,6 +3,8 @@ Document your API
.. default-domain:: wsme
.. root:: wsme.sphinxext.SampleService
.. type:: MyType
.. attribute:: test
@@ -11,3 +13,6 @@ Document your API
.. autotype:: wsme.sphinxext.SampleType
:members:
.. autoservice:: wsme.sphinxext.SampleService
:members:

View File

@@ -62,6 +62,7 @@ def funcproxy(func):
return func(*args, **kw)
newfunc._is_wsme_funcproxy = True
newfunc._original_func = func
newfunc.__doc__ = func.__doc__
return newfunc

View File

@@ -6,6 +6,7 @@ from sphinx.util.docfields import Field, GroupedField, TypedField
from sphinx.locale import l_, _
from docutils.parsers.rst import Directive
from docutils.parsers.rst import directives
import wsme
@@ -25,6 +26,17 @@ class SampleType(object):
return SampleType(10)
class SampleService(wsme.WSRoot):
@wsme.expose(SampleType)
@wsme.validate(SampleType, int)
def change_aint(data, aint):
"""
Returns the data object with its aint fields changed
"""
data.aint = aint
return data
class TypeDirective(PyClasslike):
pass
@@ -96,11 +108,12 @@ class TypeDocumenter(autodoc.ClassDocumenter):
u' ' * 8 + line for line in sample.split('\n')))
for line in content:
self.add_line(line, u'<wsme.sphinxext')
self.add_line(u'', '<wsme.sphinxext>')
super(TypeDocumenter, self).add_content(
more_content, no_docstring)
class AttributeDocumenter(autodoc.AttributeDocumenter):
datatype = None
domain = 'wsme'
@@ -125,16 +138,77 @@ class AttributeDocumenter(autodoc.AttributeDocumenter):
super(AttributeDocumenter, self).add_directive_header(sig)
class RootDirective(Directive):
"""
This directive is to tell what class is the Webservice root
"""
has_content = False
required_arguments = 1
optional_arguments = 0
final_argument_whitespace = False
option_spec = {
'webpath': directives.unchanged
}
def run(self):
env = self.state.document.settings.env
rootpath = self.arguments[0].strip()
env.temp_data['wsme:root'] = rootpath
return []
class ServiceDirective(PyClasslike):
name = 'service'
class ServiceDocumenter(autodoc.ClassDocumenter):
domain = 'wsme'
objtype = 'service'
directivetype = 'service'
def add_directive_header(self, sig):
super(ServiceDocumenter, 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 format_signature(self):
return u''
class FunctionDirective(PyClassmember):
name = 'function'
objtype = 'function'
def get_signature_prefix(self, sig):
return 'function '
class FunctionDocumenter(autodoc.MethodDocumenter):
domain = 'wsme'
directivetype = 'function'
objtype = 'function'
@classmethod
def can_document_member(cls, member, membername, isattr, parent):
return isinstance(parent, ServiceDocumenter) \
and wsme.api.isfuncproxy(member)
class WSMEDomain(Domain):
name = 'wsme'
directives = {
'type': TypeDirective,
'attribute': AttributeDirective
'attribute': AttributeDirective,
'service': ServiceDirective,
'root': RootDirective,
'function': FunctionDirective,
}
object_types = {
'type': ObjType(l_('type'), 'type', 'obj')
'type': ObjType(l_('type'), 'type', 'obj'),
'service': ObjType(l_('service'), 'service', 'obj')
}
@@ -142,6 +216,8 @@ def setup(app):
app.add_domain(WSMEDomain)
app.add_autodocumenter(TypeDocumenter)
app.add_autodocumenter(AttributeDocumenter)
app.add_autodocumenter(ServiceDocumenter)
app.add_autodocumenter(FunctionDocumenter)
app.add_config_value('wsme_protocols', ['restjson', 'restxml'], 'env')
app.add_javascript('toggle.js')