summaryrefslogtreecommitdiff
path: root/docs/ext/docstrings.py
blob: e42bb606d4cf22ed45cb62f71cda213a928bec3a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import inspect
import itertools
import os

import jinja2
import six
import sphinx
import sphinx.ext.napoleon as napoleon
from sphinx.ext.napoleon.docstring import GoogleDocstring


def classref(value, short=True):
    return value

    if not inspect.isclass(value):
        return ":class:%s" % value
    tilde = "~" if short else ""
    string = "%s.%s" % (value.__module__, value.__name__)
    return ":class:`%sgitlab.objects.%s`" % (tilde, value.__name__)


def setup(app):
    app.connect("autodoc-process-docstring", _process_docstring)
    app.connect("autodoc-skip-member", napoleon._skip_member)

    conf = napoleon.Config._config_values

    for name, (default, rebuild) in six.iteritems(conf):
        app.add_config_value(name, default, rebuild)
    return {"version": sphinx.__display_version__, "parallel_read_safe": True}


def _process_docstring(app, what, name, obj, options, lines):
    result_lines = lines
    docstring = GitlabDocstring(result_lines, app.config, app, what, name, obj, options)
    result_lines = docstring.lines()
    lines[:] = result_lines[:]


class GitlabDocstring(GoogleDocstring):
    def _build_doc(self, tmpl, **kwargs):
        env = jinja2.Environment(
            loader=jinja2.FileSystemLoader(os.path.dirname(__file__)), trim_blocks=False
        )
        env.filters["classref"] = classref
        template = env.get_template(tmpl)
        output = template.render(**kwargs)

        return output.split("\n")

    def __init__(
        self, docstring, config=None, app=None, what="", name="", obj=None, options=None
    ):
        super(GitlabDocstring, self).__init__(
            docstring, config, app, what, name, obj, options
        )

        if name.startswith("gitlab.v4.objects") and name.endswith("Manager"):
            self._parsed_lines.extend(self._build_doc("manager_tmpl.j2", cls=self._obj))