"""autodoc extension for configurable traits""" from traitlets import TraitType from sphinx.domains.python import PyClassmember from sphinx.ext.autodoc import ClassDocumenter, AttributeDocumenter class ConfigurableDocumenter(ClassDocumenter): """Specialized Documenter subclass for traits with config=True""" objtype = 'configurable' directivetype = 'class' def get_object_members(self, want_all): """Add traits with .tag(config=True) to members list""" check, members = super().get_object_members(want_all) get_traits = self.object.class_own_traits if self.options.inherited_members \ else self.object.class_traits trait_members = [] for name, trait in sorted(get_traits(config=True).items()): # put help in __doc__ where autodoc will look for it trait.__doc__ = trait.help trait_members.append((name, trait)) return check, trait_members + members class TraitDocumenter(AttributeDocumenter): objtype = 'trait' directivetype = 'attribute' member_order = 1 priority = 100 @classmethod def can_document_member(cls, member, membername, isattr, parent): return isinstance(member, TraitType) def format_name(self): return 'config c.' + super().format_name() def add_directive_header(self, sig): sig = ' = {}(default={!r})'.format( self.object.__class__.__name__, self.object.default(), ) return super().add_directive_header(sig) def setup(app): app.add_autodocumenter(ConfigurableDocumenter) app.add_autodocumenter(TraitDocumenter)