diff --git a/doc/_static/toggle.css b/doc/_static/toggle.css new file mode 100644 index 0000000..df87bdc --- /dev/null +++ b/doc/_static/toggle.css @@ -0,0 +1,10 @@ +dl.toggle dt { + background-color: #eeffcc; + border: 1px solid #ac9; + display: inline; +} + +dl.toggle dd { + display: none; +} + diff --git a/doc/_static/toggle.js b/doc/_static/toggle.js new file mode 100644 index 0000000..0c779ac --- /dev/null +++ b/doc/_static/toggle.js @@ -0,0 +1,9 @@ +/*global $,document*/ +$(document).ready(function () { + "use strict"; + $("dl.toggle > dt").click( + function (event) { + $(this).next().toggle(250); + } + ); +}); diff --git a/doc/conf.py b/doc/conf.py index 8fb3126..a355a72 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -224,3 +224,7 @@ man_pages = [ autodoc_member_order = 'bysource' + +wsme_protocols = [ + 'restjson', 'restxml', 'soap', 'extdirect' +] diff --git a/wsme/sphinxext.py b/wsme/sphinxext.py index e453105..892cf2f 100644 --- a/wsme/sphinxext.py +++ b/wsme/sphinxext.py @@ -16,6 +16,14 @@ class SampleType(object): #: A Int aint = int + def __init__(self, aint=None): + if aint: + self.aint = aint + + @classmethod + def sample(cls): + return SampleType(10) + class TypeDirective(PyClasslike): pass @@ -35,6 +43,10 @@ class TypeDocumenter(autodoc.ClassDocumenter): required_arguments = 1 + option_spec = dict(autodoc.ClassDocumenter.option_spec, **{ + 'protocols': lambda l: [v.strip() for v in l.split(',')] + }) + @classmethod def can_document_member(cls, member, membername, isattr, parent): # we don't want to be automaticaly used @@ -44,6 +56,9 @@ class TypeDocumenter(autodoc.ClassDocumenter): def format_name(self): return self.object.__name__ + def format_signature(self): + return u'' + def add_directive_header(self, sig): super(TypeDocumenter, self).add_directive_header(sig) # remove the :module: option that was added by ClassDocumenter @@ -57,6 +72,34 @@ class TypeDocumenter(autodoc.ClassDocumenter): else: return False + def add_content(self, more_content, no_docstring=False): + protocols = self.options.protocols or self.env.app.config.wsme_protocols + protocols = [wsme.protocols.getprotocol(p) for p in protocols] + content = [] + if protocols: + sample_obj = getattr(self.object, 'sample', self.object)() + content.extend([ + l_(u'Data samples:'), + u'', + u'.. cssclass:: toggle', + u'' + ]) + for protocol in protocols: + language, sample = protocol.encode_sample_value( + self.object, sample_obj, format=True) + content.extend([ + protocol.displayname or protocol.name, + u' .. code-block:: ' + language, + u'', + ]) + content.extend(( + u' ' * 8 + line for line in sample.split('\n'))) + for line in content: + self.add_line(line, u'') + self.add_line(u':type: %s' % self.datatype.__name__, '') + self.add_line(u'', '') super(AttributeDocumenter, self).add_content( more_content, no_docstring) @@ -98,3 +142,7 @@ def setup(app): app.add_domain(WSMEDomain) app.add_autodocumenter(TypeDocumenter) app.add_autodocumenter(AttributeDocumenter) + + app.add_config_value('wsme_protocols', ['restjson', 'restxml'], 'env') + app.add_javascript('toggle.js') + app.add_stylesheet('toggle.css')