def __init__(self, name, names=(), typenames=(), label=None,
              rolename=None, typerolename=None, 
              shapenames=None, attrnames=None,
              prefix=None,
              strong=True,
              can_collapse=False):
     GroupedField.__init__(self, name, names, label, rolename, can_collapse)
     self.typenames = typenames
     self.typerolename = typerolename
     self.shapenames = shapenames
     self.attrnames = attrnames
     self.prefix = prefix
     if strong:
         self.namefmt = nodes.strong
     else:
         self.namefmt = addnodes.desc_name
예제 #2
0
class JoernTraversal(JoernObj):
    doc_field_types = [
        GroupedField('param',
                     label='Parameter',
                     names=('param', ),
                     can_collapse=False),
        Field('in*', label='Ingoing nodes', names=('in*', ), has_arg=False),
        NodeField('in', label='Ingoing nodes', names=('in', ), rolename='ref'),
        Field('out*', label='Outgoing nodes', names=('out*', ), has_arg=False),
        NodeField('out',
                  label='Outgoing nodes',
                  names=('out', ),
                  rolename='ref'),
    ]

    desc_annotation = 'traversal'
예제 #3
0
def setup(app):
    from sphinx.util.docfields import GroupedField
    app.connect('autodocsumm-grouper', example_grouper)
    app.add_object_type('confval',
                        'confval',
                        objname='configuration value',
                        indextemplate='pair: %s; configuration value')
    fdesc = GroupedField('parameter',
                         label='Parameters',
                         names=['param'],
                         can_collapse=True)
    app.add_object_type('event',
                        'event',
                        'pair: %s; event',
                        parse_event,
                        doc_field_types=[fdesc])
예제 #4
0
def setup(app):
    from sphinx.ext.autodoc import cut_lines
    from sphinx.util.docfields import GroupedField
    app.connect('autodoc-process-docstring', cut_lines(4, what=['module']))
    app.add_object_type('confval',
                        'confval',
                        objname='configuration value',
                        indextemplate='pair: %s; configuration value')
    fdesc = GroupedField('parameter',
                         label='Parameters',
                         names=['param'],
                         can_collapse=True)
    app.add_object_type('event',
                        'event',
                        'pair: %s; event',
                        parse_event,
                        doc_field_types=[fdesc])
예제 #5
0
파일: conf.py 프로젝트: yassu/sphinx
def setup(app):
    from sphinx.ext.autodoc import cut_lines
    from sphinx.util.docfields import GroupedField
    app.connect('autodoc-process-docstring', cut_lines(4, what=['module']))
    app.add_object_type('confval', 'confval',
                        objname='configuration value',
                        indextemplate='pair: %s; configuration value')
    fdesc = GroupedField('parameter', label='Parameters',
                         names=['param'], can_collapse=True)
    app.add_object_type('event', 'event', 'pair: %s; event', parse_event,
                        doc_field_types=[fdesc])

    # workaround for RTD
    from sphinx.util import logging
    logger = logging.getLogger(__name__)
    app.info = lambda *args, **kwargs: logger.info(*args, **kwargs)
    app.warn = lambda *args, **kwargs: logger.warning(*args, **kwargs)
    app.debug = lambda *args, **kwargs: logger.debug(*args, **kwargs)
예제 #6
0
class DylanFunctionDesc(DylanBindingDesc):
    """A Dylan function, method, or generic function."""

    doc_field_types = [
        TypedField(
            'parameters', label="Parameters", names=('param', 'parameter')),
        GroupedField('values',
                     label="Values",
                     names=('value', 'val', 'retval', 'return')),
        Field('signature',
              label="Signature",
              has_arg=False,
              names=('sig', 'signature')),
        Field('conditions',
              label="Conditions",
              has_arg=False,
              names=('conditions', 'exceptions', 'signals', 'throws')),
    ] + DylanBindingDesc.doc_field_types
예제 #7
0
class JavaConstructor(JavaObject):
    doc_field_types = [
        TypedField('parameter',
                   label=_('Parameters'),
                   names=('param', 'parameter', 'arg', 'argument'),
                   typerolename='type',
                   typenames=('type', )),
        GroupedField('throws', names=('throws', ), label=_('Throws'))
    ]

    def handle_constructor_signature(self, sig, signode):
        try:
            member = javalang.parse.parse_constructor_signature(sig)
        except javalang.parser.JavaSyntaxError:
            raise self.error("syntax error in constructor signature")

        if not isinstance(member, javalang.tree.ConstructorDeclaration):
            raise self.error("expected constructor declaration")

        mods = formatter.output_modifiers(member.modifiers).build()
        signode += nodes.Text(mods + ' ', mods + ' ')

        signode += addnodes.desc_name(member.name, member.name)

        paramlist = addnodes.desc_parameterlist()
        for parameter in member.parameters:
            param = addnodes.desc_parameter('', '', noemph=True)
            param += self._build_type_node(parameter.type)

            if parameter.varargs:
                param += nodes.Text('...', '')

            param += nodes.emphasis(' ' + parameter.name, ' ' + parameter.name)
            paramlist += param
        signode += paramlist

        param_reprs = [
            formatter.output_type(param.type, with_generics=False).build()
            for param in member.parameters
        ]
        return '%s(%s)' % (member.name, ', '.join(param_reprs))

    def get_index_text(self, package, type, name):
        return _('%s (Java constructor)' % (name, ))
예제 #8
0
 def get_doc_field_types(self):
     return [
         TypedField(self.field_name,
                    label=l_(self.field_label),
                    names=(self.field_name, ),
                    typerolename='msg',
                    typenames=('{0}-{1}'.format(self.field_name,
                                                TYPE_SUFFIX), )),
         TypedField(self.constant_name,
                    label=l_(self.constant_label),
                    names=(self.constant_name, ),
                    typerolename='msg',
                    typenames=('{0}-{1}'.format(self.constant_name,
                                                TYPE_SUFFIX), )),
         GroupedField('{0}-{1}'.format(self.constant_name, VALUE_SUFFIX),
                      label=l_('{0} (Value)'.format(self.constant_label)),
                      names=('{0}-{1}'.format(self.constant_name,
                                              VALUE_SUFFIX), )),
     ]
예제 #9
0
class DmlProperty(DmlObject):
    """Description of a function."""

    option_spec: OptionSpec = DmlObject.option_spec.copy()
    option_spec.update({
        'const': directives.flag,
        'readonly': directives.flag,
        'type': directives.unchanged,
    })
    
    doc_field_types = [
        Field('default', label=_('Default'), names=('default')),
        GroupedField('throws', label=_('Throws'), names=('throws', 'throw', 'error', 'err'), can_collapse=True)
    ]

    def split_signature(self, sig: str) -> Tuple[str, str, List[str], List[str]]:
        
        # return tuple:
        #   - type (class, property, event, function) -> str
        #   - name -> str
        #   - arglist -> List[str]
        #   - annotations -> List[str]
           
        if not "type" in self.options:
            raise Exception("DML property always needs type assigned")
        
        typ = "property " + self.options["type"]
        name = sig
        arglist = None

        annotations = []
        if 'const' in self.options:
            annotations.append("constant")
        if 'readonly' in self.options:
            annotations.append("readonly")   
            
        return (typ, name, arglist, annotations)


    def get_index_text(self, name_cls: Tuple[str, str]) -> str:
        # add index in own add_target_and_index() instead.
        return "PropertyName " + name_cls[0]
예제 #10
0
class DylanClassDesc(DylanBindingDesc):
    """A Dylan class."""

    display_name = "class"

    annotations = [
        'open', 'primary', 'free', 'abstract', 'concrete', 'instantiable',
        'uninstantiable', 'sealed'
    ] + DylanBindingDesc.annotations

    option_spec = dict(DylanBindingDesc.option_spec.items())
    option_spec.update(
        dict({
            'open': DIRECTIVES.flag,
            'primary': DIRECTIVES.flag,
            'free': DIRECTIVES.flag,
            'abstract': DIRECTIVES.flag,
            'sealed': DIRECTIVES.flag,
            'concrete': DIRECTIVES.flag,
            'instantiable': DIRECTIVES.flag,
            'uninstantiable': DIRECTIVES.flag,
        }.items()))

    doc_field_types = [
        Field('superclasses',
              label="Superclasses",
              has_arg=False,
              names=('supers', 'superclasses', 'super', 'superclass')),
        TypedField('keyword',
                   label="Init-Keywords",
                   names=('keyword', 'init-keyword')),
        GroupedField('slots', label="Slots", names=('slot', 'getter')),
        Field('conditions',
              label="Conditions",
              has_arg=False,
              names=('conditions', 'exceptions', 'condition', 'exception',
                     'signals', 'throws')),
        Field('operations',
              label="Operations",
              has_arg=False,
              names=('operations', 'methods', 'functions')),
    ] + DylanBindingDesc.doc_field_types
예제 #11
0
파일: conf.py 프로젝트: tknv/ablog
def setup(app):
    from sphinx.ext.autodoc import cut_lines
    from sphinx.util.docfields import GroupedField

    app.connect("autodoc-process-docstring", cut_lines(4, what=["module"]))
    app.add_object_type(
        "confval",
        "confval",
        objname="configuration value",
        indextemplate="pair: %s; configuration value",
    )
    fdesc = GroupedField("parameter",
                         label="Parameters",
                         names=["param"],
                         can_collapse=True)
    app.add_object_type("event",
                        "event",
                        "pair: %s; event",
                        parse_event,
                        doc_field_types=[fdesc])
예제 #12
0
파일: conf.py 프로젝트: mdxs/blockdiag.com
def setup(app):
    app.add_description_unit('confval', 'confval',
                             'pair: %s; configuration value')

    # original directives for index
    from sphinx.util.docfields import GroupedField
    fdesc = GroupedField('parameter', label='Parameters',
                         names=['param'], can_collapse=True)
    app.add_object_type('blockdiag_diagram_attr',
                        'blockdiag_diagram_attr',
                        'pair: %s; diagram atttribute(blockdiag)',
                        parse_event, doc_field_types=[fdesc])
    app.add_object_type('blockdiag_edge_attr',
                        'blockdiag_egde_attr',
                        'pair: %s; edge attribute(blockdiag)',
                        parse_event, doc_field_types=[fdesc])
    app.add_object_type('blockdiag_node_attr',
                        'blockdiag_node_attr',
                        'pair: %s; node attribute(blockdiag)',
                        parse_event, doc_field_types=[fdesc])
예제 #13
0
class JSCallable(JSObject):
    """Description of a JavaScript function, method or constructor."""
    has_arguments = True

    doc_field_types = [
        TypedField('arguments',
                   label=l_('Arguments'),
                   names=('argument', 'arg', 'parameter', 'param'),
                   typerolename='func',
                   typenames=('paramtype', 'type')),
        GroupedField('errors',
                     label=l_('Throws'),
                     rolename='err',
                     names=('throws', ),
                     can_collapse=True),
        Field('returnvalue',
              label=l_('Returns'),
              has_arg=False,
              names=('returns', 'return')),
    ]
예제 #14
0
def setup(app):
    from sphinx.util.docfields import GroupedField

    app.add_object_type('confval',
                        'confval',
                        objname='configuration value',
                        indextemplate='pair: %s; configuration value')
    fdesc = GroupedField('parameter',
                         label='Parameters',
                         names=['param'],
                         can_collapse=True)
    app.add_object_type('event',
                        'event',
                        'pair: %s; event',
                        parse_event,
                        doc_field_types=[fdesc])

    app.add_object_type('xpath-func', 'xpath', 'pair: %s; xpath-func',
                        parse_event)

    app.connect('autodoc-skip-member', include_enum_values)
예제 #15
0
def setup(app: Sphinx) -> None:
    """
    A `sphinx` ``setup()`` function setting up the :rst:dir:`event` directive
    and :rst:role:`event` role.
    """
    # this was taken from the sphinx conf.py file and creates the documenting
    # directive `.. event::` and role `:event:` for documenting sphinx events
    app.add_object_type(
        directivename="event",
        rolename="event",
        indextemplate="pair: %s; event",
        parse_node=parse_event,
        doc_field_types=[
            GroupedField(
                "parameter",
                label="Parameters",
                names=("param", ),
                can_collapse=True,
            )
        ],
    )
예제 #16
0
파일: conf.py 프로젝트: jfbu/sphinx
def setup(app):
    from sphinx.ext.autodoc import cut_lines
    from sphinx.util.docfields import GroupedField
    app.connect('autodoc-process-docstring', cut_lines(4, what=['module']))
    app.connect('source-read', linkify_issues_in_changelog)
    app.add_object_type('confval',
                        'confval',
                        objname='configuration value',
                        indextemplate='pair: %s; configuration value')
    app.add_object_type(
        'setuptools-confval',
        'setuptools-confval',
        objname='setuptools configuration value',
        indextemplate='pair: %s; setuptools configuration value')
    fdesc = GroupedField('parameter',
                         label='Parameters',
                         names=['param'],
                         can_collapse=True)
    app.add_object_type('event',
                        'event',
                        'pair: %s; event',
                        parse_event,
                        doc_field_types=[fdesc])

    # Load jQuery and patches to make readthedocs-doc-embed.js available (refs: #10574)
    app.add_js_file(
        'https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js',
        priority=100)
    app.add_js_file(
        'https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.13.1/underscore-min.js',  # NoQA
        priority=100)
    app.add_js_file('_sphinx_javascript_frameworks_compat.js', priority=105)

    # workaround for RTD
    from sphinx.util import logging
    logger = logging.getLogger(__name__)
    app.info = lambda *args, **kwargs: logger.info(*args, **kwargs)
    app.warn = lambda *args, **kwargs: logger.warning(*args, **kwargs)
    app.debug = lambda *args, **kwargs: logger.debug(*args, **kwargs)
예제 #17
0
def setup(app):
    from sphinx.util.docfields import GroupedField

    app.srcdir = basedir
    app.confdir = app.srcdir
    app.add_object_type(
        "confval",
        "confval",
        objname="configuration value",
        indextemplate="pair: %s; configuration value",
    )
    fdesc = GroupedField(
        "parameter", label="Parameters", names=["param"], can_collapse=True
    )

    # workaround for RTD
    from sphinx.util import logging

    logger = logging.getLogger(__name__)
    app.info = lambda *args, **kwargs: logger.info(*args, **kwargs)
    app.warn = lambda *args, **kwargs: logger.warning(*args, **kwargs)
    app.debug = lambda *args, **kwargs: logger.debug(*args, **kwargs)
예제 #18
0
class Cmd(ObjectDescription):
    doc_field_types = [
        GroupedField('scope', label=('Scopes'), names=('scope',),
               rolename='cmd'),
        TypedField('parameter', label=('Parameters'),
               names=('param', 'parameter', 'arg', 'argument'),
               typerolename='type', typenames=('paramtype', 'type')),
    ]

    def handle_signature(self, sig, signode):
        sig = sig.split()
        name = sig.pop(0)
        cmd = [name]
        while sig[0] != '|':
            cmd.append(sig.pop(0))
        cmd = ' '.join(cmd)
        sig.pop(0)

        signode += addnodes.desc_name(cmd, cmd)
        signode += nodes.inline(' ', ' ')
        signode += nodes.Text(' '.join(sig))
        return cmd

    def add_target_and_index(self, name, sig, signode):
        target = 'lsctl.cmd.' + name

        if target not in self.state.document.ids:
            signode['names'].append(target)
            signode['ids'].append(target)
            signode['first'] = (not self.names)
            self.state.document.note_explicit_target(signode)

            cmds = self.env.domaindata['lsctl']['cmd']
            cmds[name] = self.env.docname

        index_name = '{} (LSCTL directive)'.format(name)
        self.indexnode['entries'].append(('single', index_name, target, '', None))
예제 #19
0
class MatObject(ObjectDescription):
    """
    Description of a general MATLAB object.
    """
    option_spec = {
        'noindex': directives.flag,
        'module': directives.unchanged,
        'annotation': directives.unchanged,
    }

    doc_field_types = [
        TypedField('parameter',
                   label=_('Parameters'),
                   names=('param', 'parameter', 'arg', 'argument', 'keyword',
                          'kwarg', 'kwparam'),
                   typerolename='obj',
                   typenames=('paramtype', 'type'),
                   can_collapse=True),
        TypedField('variable',
                   label=_('Variables'),
                   rolename='obj',
                   names=('var', 'ivar', 'cvar'),
                   typerolename='obj',
                   typenames=('vartype', ),
                   can_collapse=True),
        GroupedField('exceptions',
                     label=_('Raises'),
                     rolename='exc',
                     names=('raises', 'raise', 'exception', 'except'),
                     can_collapse=True),
        Field('returnvalue',
              label=_('Returns'),
              has_arg=False,
              names=('returns', 'return')),
        Field('returntype',
              label=_('Return type'),
              has_arg=False,
              names=('rtype', )),
    ]

    def get_signature_prefix(self, sig):
        """May return a prefix to put before the object name in the
        signature.
        """
        return ''

    def needs_arglist(self):
        """May return true if an empty argument list is to be generated even if
        the document contains none.
        """
        return False

    def handle_signature(self, sig, signode):
        """Transform a MATLAB signature into RST nodes.

        Return (fully qualified name of the thing, classname if any).

        If inside a class, the current class name is handled intelligently:
        * it is stripped from the displayed name if present
        * it is added to the full name (return value) if not present
        """
        m = mat_sig_re.match(sig)
        if m is None:
            raise ValueError
        name_prefix, name, arglist, retann = m.groups()

        # determine module and class name (if applicable), as well as full name
        modname = self.options.get('module',
                                   self.env.temp_data.get('mat:module'))

        if not self.env.config.matlab_keep_package_prefix:
            modname = strip_package_prefix(modname)
            name_prefix = strip_package_prefix(name_prefix)
            name = strip_package_prefix(name)

        classname = self.env.temp_data.get('mat:class')
        if classname:
            add_module = False
            if name_prefix and name_prefix.startswith(classname):
                fullname = name_prefix + name
                # class name is given again in the signature
                name_prefix = name_prefix[len(classname):].lstrip('.')
            elif name_prefix:
                # class name is given in the signature, but different
                # (shouldn't happen)
                fullname = classname + '.' + name_prefix + name
            else:
                # class name is not given in the signature
                fullname = classname + '.' + name
        else:
            add_module = True
            if name_prefix:
                classname = name_prefix.rstrip('.')
                fullname = name_prefix + name
            else:
                classname = ''
                fullname = name

        signode['module'] = modname
        signode['class'] = classname
        signode['fullname'] = fullname

        sig_prefix = self.get_signature_prefix(sig)
        if sig_prefix:
            signode += addnodes.desc_annotation(sig_prefix, sig_prefix)

        if name_prefix:
            signode += addnodes.desc_addname(name_prefix, name_prefix)
        # exceptions are a special case, since they are documented in the
        # 'exceptions' module.
        elif add_module and self.env.config.add_module_names:
            modname = self.options.get('module',
                                       self.env.temp_data.get('mat:module'))
            if modname and modname != 'exceptions':
                if not self.env.config.matlab_keep_package_prefix:
                    modname = strip_package_prefix(modname)
                nodetext = modname + '.'
                signode += addnodes.desc_addname(nodetext, nodetext)

        anno = self.options.get('annotation')

        signode += addnodes.desc_name(name, name)
        if not arglist:
            if self.needs_arglist():
                # for callables, add an empty parameter list
                signode += addnodes.desc_parameterlist()
            if retann:
                signode += addnodes.desc_returns(retann, retann)
            if anno:
                signode += addnodes.desc_annotation(' ' + anno, ' ' + anno)
            return fullname, name_prefix

        _pseudo_parse_arglist(signode, arglist)
        if retann:
            signode += addnodes.desc_returns(retann, retann)
        if anno:
            signode += addnodes.desc_annotation(' ' + anno, ' ' + anno)
        return fullname, name_prefix

    def get_index_text(self, modname, name):
        """Return the text for the index entry of the object."""
        raise NotImplementedError('must be implemented in subclasses')

    def add_target_and_index(self, name_cls, sig, signode):
        modname = self.options.get('module',
                                   self.env.temp_data.get('mat:module'))
        fullname = (modname and modname + '.' or '') + name_cls[0]

        if not self.env.config.matlab_keep_package_prefix:
            modname_out = strip_package_prefix(modname)
            fullname_out = (modname_out and modname_out + '.'
                            or '') + name_cls[0]
        else:
            modname_out, fullname_out = modname, fullname

        # note target
        if fullname not in self.state.document.ids:
            signode['names'].append(fullname_out)
            signode['ids'].append(fullname)
            signode['first'] = (not self.names)
            self.state.document.note_explicit_target(signode)
            objects = self.env.domaindata['mat']['objects']
            if fullname in objects:
                self.state_machine.reporter.warning(
                    'duplicate object description of %s, ' % fullname +
                    'other instance in ' +
                    self.env.doc2path(objects[fullname][0]) +
                    ', use :noindex: for one of them',
                    line=self.lineno)
            objects[fullname] = (self.env.docname, self.objtype)

        indextext = self.get_index_text(modname_out, name_cls)
        if indextext:
            entry = ('single', indextext, fullname, '', None)
            self.indexnode['entries'].append(entry)

    def before_content(self):
        # needed for automatic qualification of members (reset in subclasses)
        self.clsname_set = False

    def after_content(self):
        if self.clsname_set:
            self.env.temp_data['mat:class'] = None
class ChapelObject(ObjectDescription):
    """Base class for Chapel directives. It has methods for parsing signatures of
    any form, and generating target and index text.
    """

    option_spec = {
        'noindex': directives.flag,
        'module': directives.unchanged,
        'annotation': directives.unchanged,
    }

    doc_field_types = [
        ChapelTypedField('parameter', label=_('Arguments'),
                         names=('param', 'parameter', 'arg', 'argument'),
                         typerolename='chplref',
                         typenames=('paramtype', 'type'),
                         can_collapse=True),
        Field('returnvalue', label=_('Returns'), has_arg=False,
              names=('returns', 'return')),
        Field('yieldvalue', label=_('Yields'), has_arg=False,
              names=('yields', 'yield')),
        Field('returntype', label=_('Return type'), has_arg=False,
              names=('rtype',)),
        Field('yieldtype', label=_('Yield type'), has_arg=False,
              names=('ytype',)),
        GroupedField('errorhandling', label=_('Throws'),
                     names=('throw', 'throws'), can_collapse=True),
    ]

    @staticmethod
    def _pseudo_parse_arglist(signode, arglist):
        """Parse list of comma separated arguments.

        Arguments can have optional types.
        """
        paramlist = addnodes.desc_parameterlist()
        stack = [paramlist]
        try:
            for argument in arglist.split(','):
                argument = argument.strip()
                ends_open = 0
                ends_close = 0
                while argument.startswith('['):
                    stack.append(addnodes.desc_optional())
                    stack[-2] += stack[-1]
                    argument = argument[1:].strip()
                while argument.startswith(']'):
                    stack.pop()
                    argument = argument[1:].strip()
                while argument.endswith(']') and not argument.endswith('[]'):
                    ends_close += 1
                    argument = argument[:-1].strip()
                while argument.endswith('['):
                    ends_open += 1
                    argument = argument[:-1].strip()
                if argument:
                    stack[-1] += addnodes.desc_parameter(argument, argument)
                while ends_open:
                    stack.append(addnodes.desc_optional())
                    stack[-2] += stack[-1]
                    ends_open -= 1
                while ends_close:
                    stack.pop()
                    ends_close -= 1
            if len(stack) != 1:
                raise IndexError
        except IndexError:
            # If there are too few or too many elements on the stack, just give
            # up and treat the whole argument list as one argument, discarding
            # the already partially populated paramlist node.
            signode += addnodes.desc_parameterlist()
            signode[-1] += addnodes.desc_parameter(arglist, arglist)
        else:
            signode += paramlist

    def _get_attr_like_prefix(self, sig):
        """Return prefix text for attribute or data directive."""
        sig_match = chpl_attr_sig_pattern.match(sig)
        if sig_match is None:
            return ChapelObject.get_signature_prefix(self, sig)

        prefixes, _, _, _ = sig_match.groups()
        if prefixes:
            return prefixes.strip() + ' '
        elif self.objtype == 'type':
            return 'type' + ' '
        else:
            return ChapelObject.get_signature_prefix(self, sig)

    def _get_proc_like_prefix(self, sig):
        """Return prefix text for function or method directive
        (and similar).
        """
        sig_match = chpl_sig_pattern.match(sig)
        if sig_match is None:
            return ChapelObject.get_signature_prefix(self, sig)

        prefixes, _, _, _, _ = sig_match.groups()
        if prefixes:
            return prefixes.strip() + ' '
        elif self.objtype.startswith('iter'):
            return 'iter' + ' '
        elif self.objtype in ('method', 'function'):
            return 'proc' + ' '
        else:
            return ChapelObject.get_signature_prefix(self, sig)

    def _is_attr_like(self):
        """Returns True when objtype is attribute or data."""
        return self.objtype in ('attribute', 'data', 'type', 'enum')

    def _is_proc_like(self):
        """Returns True when objtype is *function or *method."""
        return (self.objtype in
                ('function', 'iterfunction', 'method', 'itermethod'))

    def _get_sig_prefix(self, sig):
        """Return signature prefix text. For attribute, data, and proc/iter directives
        this might be part of the signature. E.g. `type myNewType` will return
        a prefix of 'type' and `inline proc foo()` will return 'inline proc'.
        """
        if self._is_proc_like():
            return self._get_proc_like_prefix(sig)
        elif self._is_attr_like():
            return self._get_attr_like_prefix(sig)
        else:
            return ChapelObject.get_signature_prefix(self, sig)

    def get_signature_prefix(self, sig):
        """May return a prefix to put before the object name in
        the signature.
        """
        return ''

    def needs_arglist(self):
        """May return True if an empty argument list is to be generated even if the
        document contains none.
        """
        return False

    def handle_signature(self, sig, signode):
        """Parse the signature *sig* into individual nodes and append them to the
        *signode*. If ValueError is raises, parsing is aborted and the whole
        *sig* string is put into a single desc_name node.

        The return value is the value that identifies the object. IOW, it is
        the identifier that will be used to reference this object, datum,
        attribute, proc, etc. It is a tuple of "fullname" (including module and
        class(es)) and the classes. See also :py:meth:`add_target_and_index`.
        """
        if self._is_attr_like():
            sig_match = chpl_attr_sig_pattern.match(sig)
            if sig_match is None:
                raise ValueError('Signature does not parse: {0}'.format(sig))
            func_prefix, name_prefix, name, retann = sig_match.groups()
            arglist = None
        else:
            sig_match = chpl_sig_pattern.match(sig)
            if sig_match is None:
                raise ValueError('Signature does not parse: {0}'.format(sig))

            func_prefix, name_prefix, name, arglist, retann = \
                sig_match.groups()

        modname = self.options.get(
            'module', self.env.temp_data.get('chpl:module'))
        classname = self.env.temp_data.get('chpl:class')

        if classname:
            if name_prefix and name_prefix.startswith(classname):
                fullname = name_prefix + name
                # class name is given again in the signature
                name_prefix = name_prefix[len(classname):].lstrip('.')
            elif name_prefix:
                # class name is given in the signature, but different
                # (shouldn't happen)
                fullname = classname + '.' + name_prefix + name
            else:
                # class name is not given in the signature
                fullname = classname + '.' + name
        else:
            if name_prefix:
                classname = name_prefix.rstrip('.')
                fullname = name_prefix + name
            else:
                classname = ''
                fullname = name

        signode['module'] = modname
        signode['class'] = classname
        signode['fullname'] = fullname

        sig_prefix = self.get_signature_prefix(sig)
        if sig_prefix:
            signode += addnodes.desc_annotation(sig_prefix, sig_prefix)
        # if func_prefix:
        #     signode += addnodes.desc_addname(func_prefix, func_prefix)
        if name_prefix:
            signode += addnodes.desc_addname(name_prefix, name_prefix)

        anno = self.options.get('annotation')

        signode += addnodes.desc_name(name, name)

        if not arglist:
            # If this needs an arglist, and parens were provided in the
            # signature, add a parameterlist. Chapel supports paren-less
            # functions and methods, which can act as computed properties. If
            # arglist is the empty string, the signature included parens. If
            # arglist is None, it did not include parens.
            if self.needs_arglist() and arglist is not None:
                # for callables, add an empty parameter list
                signode += addnodes.desc_parameterlist()
            if retann:
                signode += addnodes.desc_type(retann, retann)
            if anno:
                signode += addnodes.desc_annotation(' ' + anno, ' ' + anno)
            return fullname, name_prefix

        self._pseudo_parse_arglist(signode, arglist)
        if retann:
            signode += addnodes.desc_type(retann, retann)
        if anno:
            signode += addnodes.desc_annotation(' ' + anno, ' ' + anno)
        return fullname, name_prefix

    def get_index_text(self, modname, name):
        """Return the text for the index entry of the object."""
        raise NotImplementedError('must be implemented in subclasses')

    def add_target_and_index(self, name_cls, sig, signode):
        """Add cross-reference IDs and entries to the index node, if
        applicable. *name_cls* is the return value of
        :py:meth:`handle_signature`.
        """
        modname = self.options.get(
            'module', self.env.temp_data.get('chpl:module'))
        fullname = (modname and modname + '.' or '') + name_cls[0]
        # note target
        if fullname not in self.state.document.ids:
            signode['names'].append(fullname)
            signode['ids'].append(fullname)
            signode['first'] = (not self.names)
            self.state.document.note_explicit_target(signode)
            objects = self.env.domaindata['chpl']['objects']
            if fullname in objects:
                self.state_machine.reporter.warning(
                    'duplicate object description of %s, ' % fullname +
                    'other instance in ' +
                    self.env.doc2path(objects[fullname][0]) +
                    ', use :noindex: for one of them',
                    line=self.lineno)
            objects[fullname] = (self.env.docname, self.objtype)

        indextext = self.get_index_text(modname, name_cls)
        if indextext:
            self.indexnode['entries'].append(('single', indextext,
                                              fullname, '', None))

    def before_content(self):
        """Called before parsing content. Set flag to help with class scoping.
        """
        self.clsname_set = False

    def after_content(self):
        """Called after parsing content. If any classes were added to the env
        temp_data, make sure they are removed.
        """
        if self.clsname_set:
            self.env.temp_data.pop('chpl:class', None)
예제 #21
0
파일: cpp.py 프로젝트: yhalapup/sphinx
class CPPObject(ObjectDescription):
    """Description of a C++ language object."""

    doc_field_types = [
        GroupedField('parameter', label=l_('Parameters'),
                     names=('param', 'parameter', 'arg', 'argument'),
                     can_collapse=True),
        GroupedField('exceptions', label=l_('Throws'), rolename='cpp:class',
                     names=('throws', 'throw', 'exception'),
                     can_collapse=True),
        Field('returnvalue', label=l_('Returns'), has_arg=False,
              names=('returns', 'return')),
    ]

    def attach_name(self, node, name):
        owner, name = name.split_owner()
        varname = unicode(name)
        if owner is not None:
            owner = unicode(owner) + '::'
            node += addnodes.desc_addname(owner, owner)
        node += addnodes.desc_name(varname, varname)

    def attach_type_suffixes(self, node, suffixes):
        for suffix in suffixes:
            node += nodes.Text(unicode(suffix))

    def attach_type(self, node, type):
        # XXX: link to c?
        text = unicode(type)
        pnode = addnodes.pending_xref(
            '', refdomain='cpp', reftype='type',
            reftarget=text, modname=None, classname=None)
        pnode['cpp:parent'] = self.env.temp_data.get('cpp:parent')
        pnode += nodes.Text(text)
        node += pnode

    def attach_modifiers(self, node, obj, visibility='public'):
        if obj.visibility != visibility:
            node += addnodes.desc_annotation(obj.visibility,
                                             obj.visibility)
            node += nodes.Text(' ')
        if obj.static:
            node += addnodes.desc_annotation('static', 'static')
            node += nodes.Text(' ')
        if getattr(obj, 'constexpr', False):
            node += addnodes.desc_annotation('constexpr', 'constexpr')
            node += nodes.Text(' ')

    def add_target_and_index(self, sigobj, sig, signode):
        theid = sigobj.get_id()
        name = unicode(sigobj.name)
        if theid not in self.state.document.ids:
            signode['names'].append(theid)
            signode['ids'].append(theid)
            signode['first'] = (not self.names)
            self.state.document.note_explicit_target(signode)

            self.env.domaindata['cpp']['objects'].setdefault(name,
                (self.env.docname, self.objtype, theid))

        indextext = self.get_index_text(name)
        if indextext:
            self.indexnode['entries'].append(('single', indextext, theid, ''))

    def before_content(self):
        lastname = self.names and self.names[-1]
        if lastname and not self.env.temp_data.get('cpp:parent'):
            assert isinstance(lastname, NamedDefExpr)
            self.env.temp_data['cpp:parent'] = lastname.name
            self.parentname_set = True
        else:
            self.parentname_set = False

    def after_content(self):
        if self.parentname_set:
            self.env.temp_data['cpp:parent'] = None

    def parse_definition(self, parser):
        raise NotImplementedError()

    def describe_signature(self, signode, arg):
        raise NotImplementedError()

    def handle_signature(self, sig, signode):
        parser = DefinitionParser(sig)
        try:
            rv = self.parse_definition(parser)
            parser.assert_end()
        except DefinitionError, e:
            self.state_machine.reporter.warning(e.description, line=self.lineno)
            raise ValueError
        self.describe_signature(signode, rv)

        parent = self.env.temp_data.get('cpp:parent')
        if parent is not None:
            rv = rv.clone()
            rv.name = rv.name.prefix(parent)
        return rv
예제 #22
0
class PhpObject(ObjectDescription):
    """
    Description of a general PHP object.
    """
    option_spec = {
        'noindex': directives.flag,
        'module': directives.unchanged,
    }

    doc_field_types = [
        TypedField('parameter', label=l_('Parameters'),
                   names=('param', 'parameter', 'arg', 'argument'),
                   typerolename='obj', typenames=('paramtype', 'type')),
        TypedField('variable', label=l_('Variables'), rolename='obj',
                   names=('var', 'ivar', 'cvar'),
                   typerolename='obj', typenames=('vartype',)),
        GroupedField('exceptions', label=l_('Throws'), rolename='exc',
                     names=('throws', 'throw', 'exception', 'except'),
                     can_collapse=True),
        Field('returnvalue', label=l_('Returns'), has_arg=False,
              names=('returns', 'return')),
        Field('returntype', label=l_('Return type'), has_arg=False,
              names=('rtype', 'returntype')),
    ]

    def get_signature_prefix(self, sig):
        """
        May return a prefix to put before the object name in the signature.
        """
        return ''

    def needs_arglist(self):
        """
        May return true if an empty argument list is to be generated even if
        the document contains none.
        """
        return False

    def handle_signature(self, sig, signode):
        """
        Transform a PHP signature into RST nodes.
        Returns (fully qualified name of the thing, classname if any).

        If inside a class, the current class name is handled intelligently:
        * it is stripped from the displayed name if present
        * it is added to the full name (return value) if not present
        """
        m = php_sig_re.match(sig)
        if m is None:
            raise ValueError

        name_prefix, name, arglist, retann = m.groups()

        if not name_prefix:
            name_prefix = ""

        # determine module and class name (if applicable), as well as full name
        modname = self.options.get(
            'namespace', self.env.temp_data.get('php:namespace'))

        classname = self.env.temp_data.get('php:class')
        separator = separators[self.objtype]

        if self.objtype == 'global' or self.objtype == 'function':
            add_module = False
            modname = None
            classname = None
            fullname = name
        else:
            add_module = True
            # name_prefix and a non-static method, means the classname was 
            # repeated. Trim off the <class>::
            if name_prefix and self.objtype != 'staticmethod':
                if name_prefix.startswith(classname):
                    name_prefix = name_prefix[len(classname):].rstrip('::')
                classname = classname.rstrip('::')
                fullname = name_prefix + classname + separator + name
            elif name_prefix:
                classname = classname.rstrip('::')
                fullname = name_prefix + name

            # Currently in a class, but not creating another class,
            elif classname and not self.objtype in ['class', 'exception', 'interface', 'trait']:
                if not self.env.temp_data['php:in_class']:
                    name_prefix = classname + separator

                fullname = classname + separator + name
            else:
                classname = ''
                fullname = name

        signode['namespace'] = modname
        signode['class'] = self.class_name = classname
        signode['fullname'] = fullname

        sig_prefix = self.get_signature_prefix(sig)

        if sig_prefix:
            signode += addnodes.desc_annotation(sig_prefix, sig_prefix)

        if name_prefix:
            if modname and not self.env.temp_data['php:in_class']:
                name_prefix = modname + NS + name_prefix
            signode += addnodes.desc_addname(name_prefix, name_prefix)

        elif add_module and self.env.config.add_module_names:
            if self.objtype == 'global':
                nodetext = ''
                signode += addnodes.desc_addname(nodetext, nodetext)
            else:
                modname = self.options.get(
                    'namespace', self.env.temp_data.get('php:namespace'))

                if modname and not self.env.temp_data.get('php:in_class', False):
                    nodetext = modname + NS
                    signode += addnodes.desc_addname(nodetext, nodetext)

        signode += addnodes.desc_name(name, name)
        if not arglist:
            if self.needs_arglist():
                # for callables, add an empty parameter list
                signode += addnodes.desc_parameterlist()
            if retann:
                signode += addnodes.desc_returns(retann, retann)
            return fullname, name_prefix

        signode += addnodes.desc_parameterlist()

        stack = [signode[-1]]
        for token in php_paramlist_re.split(arglist):
            if token == '[':
                opt = addnodes.desc_optional()
                stack[-1] += opt
                stack.append(opt)
            elif token == ']':
                try:
                    stack.pop()
                except IndexError:
                    raise ValueError
            elif not token or token == ',' or token.isspace():
                pass
            else:
                token = token.strip()
                stack[-1] += addnodes.desc_parameter(token, token)
        if len(stack) != 1:
            raise ValueError
        if retann:
            signode += addnodes.desc_returns(retann, retann)
        return fullname, name_prefix

    def get_index_text(self, modname, name):
        """
        Return the text for the index entry of the object.
        """
        raise NotImplementedError('must be implemented in subclasses')

    def _is_class_member(self):
        return self.objtype.startswith('method') or self.objtype.startswith('attr')

    def add_target_and_index(self, name_cls, sig, signode):
        if self.objtype == 'global':
            modname = ''
        else:
            modname = self.options.get(
                'namespace', self.env.temp_data.get('php:namespace'))
        separator = separators[self.objtype]
        if self._is_class_member():
            if signode['class']:
                prefix = modname and modname + NS or ''
            else:
                prefix = modname and modname + NS or ''
        else:
            prefix = modname and modname + NS or ''
        fullname = prefix + name_cls[0]

        # note target
        if fullname not in self.state.document.ids:
            signode['names'].append(fullname)
            signode['ids'].append(fullname)
            signode['first'] = (not self.names)
            self.state.document.note_explicit_target(signode)
            objects = self.env.domaindata['php']['objects']
            if fullname in objects:
                self.env.warn(
                    self.env.docname,
                    'duplicate object description of %s, ' % fullname +
                    'other instance in ' +
                    self.env.doc2path(objects[fullname][0]),
                    self.lineno)
            objects[fullname] = (self.env.docname, self.objtype)

        indextext = self.get_index_text(modname, name_cls)
        if indextext:
            self.indexnode['entries'].append(('single', indextext,
                                              fullname, fullname))
예제 #23
0
class JavaType(JavaObject):
    doc_field_types = [
        GroupedField(
            'parameter',
            names=('param', ),
            label=_('Parameters')  # replaced the old "label=l_('Parameters')"
        )
    ]

    declaration_type = None

    def handle_type_signature(self, sig, signode):
        try:
            member = javalang.parse.parse_type_signature(sig)
        except javalang.parser.JavaSyntaxError:
            raise self.error("syntax error in field signature")

        if isinstance(member, javalang.tree.ClassDeclaration):
            self.declaration_type = 'class'
        elif isinstance(member, javalang.tree.InterfaceDeclaration):
            self.declaration_type = 'interface'
        elif isinstance(member, javalang.tree.EnumDeclaration):
            self.declaration_type = 'enum'
        elif isinstance(member, javalang.tree.AnnotationDeclaration):
            self.declaration_type = 'annotation'
        else:
            raise self.error("expected type declaration")

        mods = formatter.output_modifiers(member.modifiers).build()
        signode += nodes.Text(mods + ' ', mods + ' ')

        if self.declaration_type == 'class':
            signode += nodes.Text('class ', 'class ')
        elif self.declaration_type == 'interface':
            signode += nodes.Text('interface ', 'interface ')
        elif self.declaration_type == 'enum':
            signode += nodes.Text('enum ', 'enum ')
        elif self.declaration_type == 'annotation':
            signode += nodes.Text('@interface ', '@interface ')

        signode += addnodes.desc_name(member.name, member.name)

        if self.declaration_type in ('class',
                                     'interface') and member.type_parameters:
            type_params = formatter.output_type_params(
                member.type_parameters).build()
            signode += nodes.Text(type_params, type_params)

        if self.declaration_type == 'class':
            if member.extends:
                extends = ' extends '
                signode += nodes.Text(extends, extends)
                signode += self._build_type_node(member.extends)
            if member.implements:
                implements = ' implements '
                signode += nodes.Text(implements, implements)
                signode += self._build_type_node_list(member.implements)
        elif self.declaration_type == 'interface':
            if member.extends:
                extends = ' extends '
                signode += nodes.Text(extends, extends)
                signode += self._build_type_node_list(member.extends)
        elif self.declaration_type == 'enum':
            if member.implements:
                implements = ' implements '
                signode += nodes.Text(implements, implements)
                signode += self._build_type_node_list(member.implements)

        return member.name

    def get_index_text(self, package, type, name):
        return _('%s (Java %s)' % (name, self.declaration_type))
예제 #24
0
class MongoDBObject(ObjectDescription):
    """
    Description of a MongoDB object.
    """
    #: If set to ``True`` this object is callable and a `desc_parameterlist` is
    #: added
    has_arguments = False

    #: what is displayed right before the documentation entry
    display_prefix = None

    def handle_signature(self, sig, signode):
        sig = sig.strip()
        if '(' in sig and sig[-1:] == ')':
            prefix, arglist = sig.split('(', 1)
            prefix = prefix.strip()
            arglist = arglist[:-1].strip()
        else:
            prefix = sig
            arglist = None
        if '.' in prefix:
            nameprefix, name = prefix.rsplit('.', 1)
        else:
            nameprefix = None
            name = prefix

        objectname = self.env.temp_data.get('mongodb:object')
        if nameprefix:
            if objectname:
                # someone documenting the method of an attribute of the current
                # object? shouldn't happen but who knows...
                nameprefix = objectname + '.' + nameprefix
            fullname = nameprefix + '.' + name
        elif objectname:
            fullname = objectname + '.' + name
        else:
            # just a function or constructor
            objectname = ''
            fullname = name

        signode['object'] = objectname
        signode['fullname'] = fullname

        if self.display_prefix:
            signode += addnodes.desc_annotation(self.display_prefix,
                                                self.display_prefix)
        if nameprefix:
            signode += addnodes.desc_addname(nameprefix + '.', nameprefix + '.')
        signode += addnodes.desc_name(name, name)
        if self.has_arguments:
            if not arglist:
                signode += addnodes.desc_parameterlist()
            else:
                _pseudo_parse_arglist(signode, arglist)
        return fullname, nameprefix

    def add_target_and_index(self, name_obj, sig, signode):
        objectname = self.options.get(
            'object', self.env.temp_data.get('mongodb:object'))
        fullname = name_obj[0]
        if fullname not in self.state.document.ids:
            signode['names'].append(fullname)
            signode['ids'].append(fullname.replace('$', '_S_'))
            signode['first'] = not self.names
            self.state.document.note_explicit_target(signode)
            objects = self.env.domaindata['mongodb']['objects']
            # if fullname in objects:
            #     self.state_machine.reporter.warning(
            #         'duplicate object description of %s, ' % fullname +
            #         'other instance in ' +
            #         self.env.doc2path(objects[fullname][0]),
            #         line=self.lineno)
            objects[fullname] = self.env.docname, self.objtype
        # elif self.objtype == "binary":
        #     signode['names'].append(fullname)
        #     signode['ids'].append(fullname.replace('$', '_S_'))
        #     signode['first'] = not self.names
        #     self.state.document.note_explicit_target(signode)

        indextext = self.get_index_text(objectname, name_obj)
        if indextext:
            self.indexnode['entries'].append(('single', indextext,
                                              fullname.replace('$', '_S_'),
                                              ''))

    def get_index_text(self, objectname, name_obj):
        name, obj = name_obj
        if self.objtype == 'dbcommand':
            return _('%s (database command)') % name
        elif self.objtype == 'operator':
            return _('%s (operator)') % name
        elif self.objtype == 'projection':
            return _('%s (projection operator)') % name
        elif self.objtype == 'program':
            return _('%s (program)') % name
        elif self.objtype == 'setting':
            return _('%s (setting)') % (name)
        elif self.objtype == 'status':
            return _('%s (status)') % (name)
        elif self.objtype == 'stats':
            return _('%s (statistic)') % (name)
        elif self.objtype == 'data':
            return _('%s (shell output)') % (name)
        elif self.objtype == 'method':
            return _('%s (shell method)') % (name)
        elif self.objtype == 'collflag':
            return _('%s (collection flag)') % (name)
        elif self.objtype == 'readmode':
            return _('%s (read preference mode)') % (name)
        elif self.objtype == 'error':
            return _('%s (error code)') % (name)
        elif self.objtype == 'macro':
            return _('%s (JavaScript shell macro)') % (name)
        elif self.objtype == 'limit':
            return _('%s (MongoDB system limit)') % (name)
        return ''

    def run(self):
        return super(MongoDBObject, self).run()

    doc_field_types = [
        TypedField('arguments', label=l_('Arguments'),
                   names=('argument', 'arg', 'parameter', 'param'),
                   typerolename='method', typenames=('paramtype', 'type')),
        TypedField('options', label=l_('Options'),
                   names=('options', 'opts', 'option', 'opt'),
                   typerolename=('dbcommand', 'setting', 'status', 'stats', 'aggregator'),
                   typenames=('optstype', 'type')),
        TypedField('fields', label=l_('Fields'),
                   names=('fields', 'fields', 'field', 'field'),
                   typerolename=('dbcommand', 'setting', 'status', 'stats', 'aggregator'),
                   typenames=('fieldtype', 'type')),
        TypedField('flags', label=l_('Flags'),
                   names=('flags', 'flags', 'flag', 'flag'),
                   typerolename=('dbcommand', 'setting', 'status', 'stats', 'aggregator'),
                   typenames=('flagtype', 'type')),
        GroupedField('errors', label=l_('Throws'), rolename='err',
                     names=('throws', ),
                     can_collapse=True),
        GroupedField('exception', label=l_('Exception'), rolename='err',
                     names=('exception', ),
                     can_collapse=True),
        Field('returnvalue', label=l_('Returns'), has_arg=False,
              names=('returns', 'return')),
        Field('returntype', label=l_('Return type'), has_arg=False,
              names=('rtype',)),
    ]
예제 #25
0
class JavaMethod(JavaObject):
    doc_field_types = [
        TypedField(
            'parameter',
            label=_('Parameters'),  # replaced the old "label=l_('Parameters')"
            names=('param', 'parameter', 'arg', 'argument'),
            typerolename='type',
            typenames=('type', )),
        Field(
            'returnvalue',
            label=_('Returns'),  # replaced the old "label=l_('Returns')"
            has_arg=False,
            names=('returns', 'return')),
        GroupedField(
            'throws',
            names=('throws', ),
            label=_('Throws'),  # replaced the old "label=l_('Throws')"
            rolename='type')
    ]

    def handle_method_signature(self, sig, signode):
        try:
            member = javalang.parse.parse_member_signature(sig)
        except javalang.parser.JavaSyntaxError:
            raise self.error("syntax error in method signature")

        if not isinstance(member, javalang.tree.MethodDeclaration):
            raise self.error("expected method declaration")

        mods = formatter.output_modifiers(member.modifiers).build()
        signode += nodes.Text(mods + ' ', mods + ' ')

        if member.type_parameters:
            type_params = formatter.output_type_params(
                member.type_parameters).build()
            signode += nodes.Text(type_params, type_params)
            signode += nodes.Text(' ', ' ')

        rnode = addnodes.desc_type('', '')
        rnode += self._build_type_node(member.return_type)

        signode += rnode
        signode += nodes.Text(' ', ' ')
        signode += addnodes.desc_name(member.name, member.name)

        paramlist = addnodes.desc_parameterlist()
        for parameter in member.parameters:
            param = addnodes.desc_parameter('', '', noemph=True)
            param += self._build_type_node(parameter.type)

            if parameter.varargs:
                param += nodes.Text('...', '')

            param += nodes.emphasis(' ' + parameter.name, ' ' + parameter.name)
            paramlist += param
        signode += paramlist

        param_reprs = [
            formatter.output_type(param.type, with_generics=False).build()
            for param in member.parameters
        ]
        return member.name + '(' + ', '.join(param_reprs) + ')'

    def get_index_text(self, package, type, name):
        return _('%s (Java method)' % (name, ))
예제 #26
0
class BsvObject(ObjectDescription):
    """
    Description of a general Bsv object.
    """
    option_spec = {
        'noindex': directives.flag,
        'package': directives.unchanged,
        'annotation': directives.unchanged,
        'parameter': directives.unchanged,
        'returntype': directives.unchanged,
    }

    doc_field_types = [
        TypedField('parameter',
                   label=l_('Parameters'),
                   names=('param', 'parameter', 'arg', 'argument', 'keyword',
                          'kwarg', 'kwparam'),
                   typerolename='obj',
                   typenames=('paramtype', 'type'),
                   can_collapse=True),
        TypedField('variable',
                   label=l_('Variables'),
                   rolename='obj',
                   names=('var', 'ivar', 'cvar'),
                   typerolename='obj',
                   typenames=('vartype', ),
                   can_collapse=True),
        GroupedField('exceptions',
                     label=l_('Raises'),
                     rolename='exc',
                     names=('raises', 'raise', 'exception', 'except'),
                     can_collapse=True),
        Field('returnvalue',
              label=l_('Returns'),
              has_arg=False,
              names=('returns', 'return')),
        Field('returntype',
              label=l_('Return type'),
              has_arg=False,
              names=('rtype', )),
    ]

    def get_signatures(self):
        siglines = ObjectDescription.get_signatures(self)
        return siglines

    def get_signature_prefix(self, sig):
        """May return a prefix to put before the object name in the
        signature.
        """
        return ''

    def needs_arglist(self):
        """May return true if an empty argument list is to be generated even if
        the document contains none.
        """
        return False

    def handle_signature(self, sig, signode):
        """Transform a Bsv signature into RST nodes.

        Return (fully qualified name of the thing, interfacename if any).

        If inside a interface, the current interface name is handled intelligently:
        * it is stripped from the displayed name if present
        * it is added to the full name (return value) if not present
        """
        print('BsvObject.handle_signature', sig)
        name_prefix = ''
        name = sig
        arglist = ''
        retann = ''
        if self.objtype in ['interface', 'instance', 'typeclass']:
            split = sig.split('#', 1)
            name = split[0]
            if len(split) > 1:
                arglist = split[1]
                m = bsv_param_re.match(arglist)
                if m: arglist = m.group(1)
        elif self.objtype in ['subinterface', 'field']:
            split = sig.rsplit(' ', 1)
            print('rsplit', split)
            name = split[-1]
            if len(split) > 1:
                retann = split[0]
        elif self.objtype in ['method', 'function']:
            split = sig.split(' ', 1)
            retann = split[0]
            nameparams = split[1]
            split = nameparams.split('(', 1)
            name = split[0]
            if len(split) > 1:
                arglist = split[1][0:-1]
        elif self.objtype in ['module']:
            split = sig.split('#', 1)
            name = split[0]
            if len(split) > 1:
                depth = 0
                paramreturn = split[1]
                #print('module', paramreturn, len(paramreturn))
                for i in range(0, len(paramreturn)):
                    c = paramreturn[i]
                    if c == '(': depth = depth + 1
                    elif c == ')': depth = depth - 1

                    #print(i, c, depth)
                    if depth == 0:
                        endofparam = i
                        break
                arglist = paramreturn[1:endofparam]
                retann = paramreturn[endofparam + 1:-1]
                #print(arglist)
                #print(endofparam, retann)

        # determine package and interface name (if applicable), as well as full name
        modname = self.options.get('package',
                                   self.env.temp_data.get('bsv:package'))
        interfacename = self.env.temp_data.get('bsv:interface')
        if interfacename:
            add_package = False
            if name_prefix and name_prefix.startswith(interfacename):
                fullname = name_prefix + name
                # interface name is given again in the signature
                name_prefix = name_prefix[len(interfacename):].lstrip('.')
            elif name_prefix:
                # interface name is given in the signature, but different
                # (shouldn't happen)
                fullname = interfacename + '.' + name_prefix + name
            else:
                # interface name is not given in the signature
                fullname = interfacename + '.' + name
        else:
            add_package = True
            if name_prefix:
                interfacename = name_prefix.rstrip('.')
                fullname = name_prefix + name
            else:
                interfacename = ''
                fullname = name

        signode['package'] = modname
        signode['interface'] = interfacename
        signode['fullname'] = fullname

        sig_prefix = self.get_signature_prefix(sig)
        if sig_prefix:
            signode += addnodes.desc_annotation(sig_prefix, sig_prefix)

        if name_prefix:
            signode += addnodes.desc_addname(name_prefix, name_prefix)
        # exceptions are a special case, since they are documented in the
        # 'exceptions' package.
        elif add_package and self.env.config.add_package_names:
            modname = self.options.get('package',
                                       self.env.temp_data.get('bsv:package'))
            if modname and modname != 'exceptions':
                nodetext = modname + '::'
                signode += addnodes.desc_addname(nodetext, nodetext)

        anno = self.options.get('annotation')

        signode += addnodes.desc_name(name, name)
        #print('arglist', arglist)
        if not arglist:
            if self.needs_arglist():
                # for callables, add an empty parameter list
                if arglist:
                    signode += addnodes.desc_parameterlist(text=arglist)
                elif self.options.get('parameter'):
                    signode += addnodes.desc_parameterlist(
                        text=self.options.get('parameter'))
            if retann:
                signode += addnodes.desc_returns(text=retann)
            elif self.options.get('returntype'):
                signode += addnodes.desc_returns(
                    text=self.options.get('returntype'))
            if anno:
                signode += addnodes.desc_annotation(' ' + anno, ' ' + anno)
            #print('signode', signode)
            return fullname, name_prefix

        _pseudo_parse_arglist(signode, arglist)
        if retann:
            signode += addnodes.desc_returns(retann, retann)
        if anno:
            signode += addnodes.desc_annotation(' ' + anno, ' ' + anno)
        return fullname, name_prefix

    def get_index_text(self, modname, name):
        """Return the text for the index entry of the object."""
        raise NotImplementedError('must be implemented in subinterfacees')

    def add_target_and_index(self, name_cls, sig, signode):
        modname = self.options.get('package',
                                   self.env.temp_data.get('bsv:package'))
        fullname = (modname and modname + '::' or '') + name_cls[0]
        # note target
        if fullname not in self.state.document.ids:
            signode['names'].append(fullname)
            signode['ids'].append(fullname)
            signode['first'] = (not self.names)
            self.state.document.note_explicit_target(signode)
            objects = self.env.domaindata['bsv']['objects']
            if fullname in objects:
                self.state_machine.reporter.warning(
                    'duplicate object description of %s, ' % fullname +
                    'other instance in ' +
                    self.env.doc2path(objects[fullname][0]) +
                    ', use :noindex: for one of them',
                    line=self.lineno)
            objects[fullname] = (self.env.docname, self.objtype)

        indextext = self.get_index_text(modname, name_cls)
        if indextext:
            self.indexnode['entries'].append(
                ('single', indextext, fullname, ''))

    def before_content(self):
        # needed for automatic qualification of members (reset in subinterfacees)
        self.clsname_set = False

    def after_content(self):
        if self.clsname_set:
            self.env.temp_data['bsv:interface'] = None
예제 #27
0
class HTTPResource(ObjectDescription):

    doc_field_types = [
        TypedField('parameter',
                   label='URL Parameters',
                   names=('param', 'parameter', 'arg', 'argument'),
                   can_collapse=False,
                   typerolename='obj',
                   typenames=('paramtype', 'type')),
        GroupedField('queryparameter',
                     label='Query Parameters',
                     can_collapse=False,
                     names=('queryparameter', 'queryparam', 'qparam',
                            'query')),
        GroupedField('formparameter',
                     label='Formdata Parameters',
                     names=('formparameter', 'formparam', 'fparam', 'form')),
        GroupedField('statuscode',
                     label='Status Codes',
                     can_collapse=True,
                     rolename='statuscode',
                     names=('statuscode', 'status', 'code')),
        Field('rawformdata',
              label='Raw Data',
              rolename='rawformdata',
              has_arg=False,
              names=('rawformdata', 'rfd', 'rawdata')),
        Field('accesscontrol',
              label='Accessible By',
              rolename='accesscontrol',
              has_arg=False,
              names=('accesscontrol', )),
        Field('shortname',
              label='Short Name',
              rolename='shortname',
              has_arg=False,
              names=('shortname', 'sn', 'view_func')),
        Field('returns',
              label='Returns',
              rolename='returns',
              has_arg=False,
              names=('returns', 'ret', 'retval')),
    ]

    method = NotImplemented

    def handle_signature(self, sig, signode):
        method = self.method.upper() + ' '

        signode += addnodes.desc_name(method, method)
        offset = 0
        for match in http_sig_param_re.finditer(sig):
            path = sig[offset:match.start()]
            signode += addnodes.desc_name(path, path)
            params = addnodes.desc_parameterlist()
            typ = match.group('type')
            if typ:
                typ = typ + ': '
                params += addnodes.desc_annotation(typ, typ)
            name = match.group('name')
            params += addnodes.desc_parameter(name, name)
            signode += params
            offset = match.end()
        if offset < len(sig):
            path = sig[offset:len(sig)]
            signode += addnodes.desc_name(path, path)
        fullname = self.method.upper() + ' ' + path

        signode['method'] = self.method
        signode['path'] = sig
        signode['fullname'] = fullname
        return (fullname, self.method, sig)

    def needs_arglist(self):
        return False

    def add_target_and_index(self, name_cls, sig, signode):
        sig = APIUtils.normalize_url(sig)
        signode['ids'].append(http_resource_anchor(*name_cls[1:]))
        self.env.domaindata['http'][self.method][sig] = (self.env.docname, '')

    def get_index_text(self, modname, name):
        return ''
예제 #28
0
class HTTPResource(ObjectDescription):

    doc_field_types = [
        TypedField('parameter',
                   label='Parameters',
                   names=('param', 'parameter', 'arg', 'argument'),
                   typerolename='obj',
                   typenames=('paramtype', 'type')),
        TypedField('jsonparameter',
                   label='JSON Parameters',
                   names=('jsonparameter', 'jsonparam', 'json'),
                   typerolename='obj',
                   typenames=('jsonparamtype', 'jsontype')),
        TypedField('requestjsonobject',
                   label='Request JSON Object',
                   names=('reqjsonobj', 'reqjson', '<jsonobj', '<json'),
                   typerolename='obj',
                   typenames=('reqjsonobj', '<jsonobj')),
        TypedField('requestjsonarray',
                   label='Request JSON Array of Objects',
                   names=('reqjsonarr', '<jsonarr'),
                   typerolename='obj',
                   typenames=('reqjsonarrtype', '<jsonarrtype')),
        TypedField('responsejsonobject',
                   label='Response JSON Object',
                   names=('resjsonobj', 'resjson', '>jsonobj', '>json'),
                   typerolename='obj',
                   typenames=('resjsonobj', '>jsonobj')),
        TypedField('responsejsonarray',
                   label='Response JSON Array of Objects',
                   names=('resjsonarr', '>jsonarr'),
                   typerolename='obj',
                   typenames=('resjsonarrtype', '>jsonarrtype')),
        TypedField('queryparameter',
                   label='Query Parameters',
                   names=('queryparameter', 'queryparam', 'qparam', 'query'),
                   typerolename='obj',
                   typenames=('queryparamtype', 'querytype', 'qtype')),
        GroupedField('formparameter',
                     label='Form Parameters',
                     names=('formparameter', 'formparam', 'fparam', 'form')),
        GroupedField('requestheader',
                     label='Request Headers',
                     rolename='header',
                     names=('<header', 'reqheader', 'requestheader')),
        GroupedField('responseheader',
                     label='Response Headers',
                     rolename='header',
                     names=('>header', 'resheader', 'responseheader')),
        GroupedField('statuscode',
                     label='Status Codes',
                     rolename='statuscode',
                     names=('statuscode', 'status', 'code'))
    ]

    option_spec = {
        'deprecated': directives.flag,
        'noindex': directives.flag,
        'synopsis': lambda x: x,
    }

    method = NotImplemented

    def handle_signature(self, sig, signode):
        method = self.method.upper() + ' '
        signode += addnodes.desc_name(method, method)
        offset = 0
        path = None
        for match in http_sig_param_re.finditer(sig):
            path = sig[offset:match.start()]
            signode += addnodes.desc_name(path, path)
            params = addnodes.desc_parameterlist()
            typ = match.group('type')
            if typ:
                typ += ': '
                params += addnodes.desc_annotation(typ, typ)
            name = match.group('name')
            params += addnodes.desc_parameter(name, name)
            signode += params
            offset = match.end()
        if offset < len(sig):
            path = sig[offset:len(sig)]
            signode += addnodes.desc_name(path, path)
        assert path is not None, 'no matches for sig: %s' % sig
        fullname = self.method.upper() + ' ' + path
        signode['method'] = self.method
        signode['path'] = sig
        signode['fullname'] = fullname
        return (fullname, self.method, sig)

    def needs_arglist(self):
        return False

    def add_target_and_index(self, name_cls, sig, signode):
        signode['ids'].append(http_resource_anchor(*name_cls[1:]))
        if 'noindex' not in self.options:
            self.env.domaindata['http'][self.method][sig] = (self.env.docname,
                                                             self.options.get(
                                                                 'synopsis',
                                                                 ''),
                                                             'deprecated'
                                                             in self.options)

    def get_index_text(self, modname, name):
        return ''
예제 #29
0
class MongoDBObject(ObjectDescription):
    """
    Description of a MongoDB object.
    """
    #: If set to ``True`` this object is callable and a `desc_parameterlist` is
    #: added
    has_arguments = False

    #: what is displayed right before the documentation entry
    display_prefix = None

    def handle_signature(self, sig, signode):
        sig = sig.strip()
        if '(' in sig and sig[-1:] == ')':
            prefix, arglist = sig.split('(', 1)
            prefix = prefix.strip()
            arglist = arglist[:-1].strip()
        else:
            prefix = sig
            arglist = None
        if '.' in prefix:
            nameprefix, name = prefix.rsplit('.', 1)
        else:
            nameprefix = None
            name = prefix

        objectname = self.env.temp_data.get('mongodb:object')
        if nameprefix:
            if objectname:
                # someone documenting the method of an attribute of the current
                # object? shouldn't happen but who knows...
                nameprefix = objectname + '.' + nameprefix
            fullname = nameprefix + '.' + name
        elif objectname:
            fullname = objectname + '.' + name
        else:
            # just a function or constructor
            objectname = ''
            fullname = name

        signode['object'] = objectname
        signode['fullname'] = fullname

        if self.display_prefix:
            signode += addnodes.desc_annotation(self.display_prefix,
                                                self.display_prefix)

        if nameprefix:
            if nameprefix in conf['suppress-prefix']:
                pass
            else:
                nameprefix += '.'
                for prefix in conf['suppress-prefix']:
                    if nameprefix.startswith(prefix):
                        nameprefix = nameprefix[len(prefix)+1:]
                        break

                signode += addnodes.desc_addname(nameprefix, nameprefix)
                nameprefix[:-1]

        signode += addnodes.desc_name(name, name)
        if self.has_arguments:
            if not arglist:
                signode += addnodes.desc_parameterlist()
            else:
                _pseudo_parse_arglist(signode, arglist)
        return fullname, nameprefix

    def add_target_and_index(self, name_obj, sig, signode):
        objectname = self.options.get(
            'object', self.env.temp_data.get('mongodb:object'))

        if self.objtype != 'program' and self.objtype in conf['prepend'].keys():
            fullname = '.'.join([conf['prepend'][self.objtype], name_obj[0]])
        elif name_obj[0] in self.state.document.ids:
            fullname = 'iddup.' + name_obj[0]
        else:
            fullname = name_obj[0]

        signode['names'].append(fullname)
        signode['ids'].append(fullname.replace('$', '_S_').replace(' ', '-'))
        signode['first'] = not self.names
        self.state.document.note_explicit_target(signode)

        objects = self.env.domaindata['mongodb']['objects']
        if fullname in objects:
            path = self.env.doc2path(self.env.domaindata['mongodb']['objects'][fullname][0])
            spath = basename(path)
            sspath = basename(self.state_machine.reporter.source)

            if spath in conf['composites']:
                pass
            elif sspath in conf['composites']:
                pass
            elif spath == fullname:
                pass
            elif spath == fullname.lstrip('$'):
                pass
            elif spath == fullname.lstrip('_'):
                pass
            elif path == self.state_machine.reporter.source:
                pass
            elif fullname.startswith(spath):
                pass
            elif fullname == '$':
                pass
                # temporary: silencing the positional operator
                # warning, this is the namespace clash for
                # projection and query/update operators.
            else:
                self.state_machine.reporter.warning(
                    'duplicate object description of "%s", ' % fullname +
                    'other instance in ' + path,
                    line=self.lineno)

        if os.path.basename(self.env.docname) in conf['composites']:
            pass
        else:
            objects[fullname] = self.env.docname, self.objtype


        indextext = self.get_index_text(objectname, name_obj)
        if indextext:
            self.indexnode['entries'].append(('single', indextext,
                                              fullname.replace('$', '_S_'),
                                              ''))

    def get_index_text(self, objectname, name_obj):
        name, obj = name_obj

        for directive in conf['directives']:
            if self.objtype == directive['name']:
                return _('%s (' + directive['description'] + ')') % name

        return ''

    def run(self):
        return super(MongoDBObject, self).run()

    doc_field_types = [
        TypedField('arguments', label=l_('Arguments'),
                   names=('argument', 'arg'),
                   typerolename='method', typenames=('paramtype', 'type')),
        TypedField('options', label=l_('Options'),
                   names=('options', 'opts', 'option', 'opt'),
                   typerolename=('dbcommand', 'setting', 'status', 'stats', 'aggregator', 'data'),
                   typenames=('optstype', 'type')),
        TypedField('parameters', label=l_('Parameters'),
                   names=('param', 'paramter', 'parameters'),
                   typerolename=('dbcommand', 'setting', 'status', 'stats', 'aggregator', 'data'),
                   typenames=('paramtype', 'type')),
        TypedField('fields', label=l_('Fields'),
                   names=('fields', 'fields', 'field', 'field'),
                   typerolename=('dbcommand', 'setting', 'status', 'stats', 'aggregator', 'data'),
                   typenames=('fieldtype', 'type')),
        TypedField('flags', label=l_('Flags'),
                   names=('flags', 'flags', 'flag', 'flag'),
                   typerolename=('dbcommand', 'setting', 'status', 'stats', 'aggregator', 'data'),
                   typenames=('flagtype', 'type')),
        GroupedField('errors', label=l_('Throws'), rolename='err',
                     names=('throws', ),
                     can_collapse=True),
        GroupedField('exception', label=l_('Exception'), rolename='err',
                     names=('exception', ),
                     can_collapse=True),
        Field('returnvalue', label=l_('Returns'), has_arg=False,
              names=('returns', 'return')),
        Field('returntype', label=l_('Return type'), has_arg=False,
              names=('rtype',)),
    ]
예제 #30
0
class HTTPResource(ObjectDescription):

    doc_field_types = [
        TypedField(
            "parameter",
            label="Parameters",
            names=("param", "parameter", "arg", "argument"),
            typerolename="obj",
            typenames=("paramtype", "type"),
        ),
        TypedField(
            "jsonparameter",
            label="JSON Parameters",
            names=("jsonparameter", "jsonparam", "json"),
            typerolename="obj",
            typenames=("jsonparamtype", "jsontype"),
        ),
        TypedField(
            "queryparameter",
            label="Query Parameters",
            names=("queryparameter", "queryparam", "qparam", "query"),
            typerolename="obj",
            typenames=("queryparamtype", "querytype", "qtype"),
        ),
        GroupedField(
            "formparameter",
            label="Form Parameters",
            names=("formparameter", "formparam", "fparam", "form"),
        ),
        GroupedField(
            "requestheader",
            label="Request Headers",
            rolename="mailheader",
            names=("reqheader", "requestheader"),
        ),
        GroupedField(
            "responseheader",
            label="Response Headers",
            rolename="mailheader",
            names=("resheader", "responseheader"),
        ),
        GroupedField(
            "statuscode",
            label="Status Codes",
            rolename="statuscode",
            names=("statuscode", "status", "code"),
        ),
    ]

    method = NotImplemented

    def handle_signature(self, sig, signode):
        method = self.method.upper() + " "
        signode += addnodes.desc_name(method, method)
        offset = 0
        for match in http_sig_param_re.finditer(sig):
            path = sig[offset:match.start()]
            signode += addnodes.desc_name(path, path)
            params = addnodes.desc_parameterlist()
            typ = match.group("type")
            if typ:
                typ = typ + ": "
                params += addnodes.desc_annotation(typ, typ)
            name = match.group("name")
            params += addnodes.desc_parameter(name, name)
            signode += params
            offset = match.end()
        if offset < len(sig):
            path = sig[offset:len(sig)]
            signode += addnodes.desc_name(path, path)
        fullname = self.method.upper() + " " + path
        signode["method"] = self.method
        signode["path"] = sig
        signode["fullname"] = fullname
        return (fullname, self.method, sig)

    def needs_arglist(self):
        return False

    def add_target_and_index(self, name_cls, sig, signode):
        signode["ids"].append(http_resource_anchor(*name_cls[1:]))
        self.env.domaindata["http"][self.method][sig] = (self.env.docname, "")

    def get_index_text(self, modname, name):
        return ""
예제 #31
0
#
# Note that not all possible configuration values are present in this
# autogenerated file.
#
# All configuration values have a default; values that are commented out
# serve to show the default.

# Monkey patch in a field type for columns.

# try:
from sphinx.util.docfields import Field, GroupedField, TypedField
from sphinx.domains.python import PythonDomain, PyObject, l_, PyField, PyTypedField

PyObject.doc_field_types += [
    GroupedField('modelparam', label='Model Parameters', names=('modelparam', ), can_collapse=True,
        rolename='math'
    ),
    PyTypedField('expparam', 
        label=l_('Experiment Parameters'), names=('expparam', ), can_collapse=False,
        rolename='obj'
    ),
    PyField('scalar-expparam',
        label=l_('Experiment Parameter'), names=('scalar-expparam', ),
        has_arg=True, rolename='obj'
    ),
    GroupedField('columns', label=l_('Columns'), names=('column', ), can_collapse=True),
]
# except:
#   pass

###############################################################################