xref: /petsc/src/binding/petsc4py/docs/source/conf.py (revision b3f8c7a1f1dae9cf75fc76de14d347d78933c187)
155a74a43SLisandro Dalcin# Configuration file for the Sphinx documentation builder.
25808f684SSatish Balay#
355a74a43SLisandro Dalcin# For the full list of built-in configuration values, see the documentation:
455a74a43SLisandro Dalcin# https://www.sphinx-doc.org/en/master/usage/configuration.html
555a74a43SLisandro Dalcin
655a74a43SLisandro Dalcin# -- Path setup --------------------------------------------------------------
75808f684SSatish Balay
85808f684SSatish Balay# If extensions (or modules to document with autodoc) are in another directory,
95808f684SSatish Balay# add these directories to sys.path here. If the directory is relative to the
105808f684SSatish Balay# documentation root, use os.path.abspath to make it absolute, like shown here.
115808f684SSatish Balay
1255a74a43SLisandro Dalcinimport os
1355a74a43SLisandro Dalcinimport shutil
1455a74a43SLisandro Dalcinimport sys
1555a74a43SLisandro Dalcinimport typing
1655a74a43SLisandro Dalcinimport datetime
1755a74a43SLisandro Dalcinimport importlib
1855a74a43SLisandro Dalcinimport sphobjinv
1955a74a43SLisandro Dalcinimport functools
2055a74a43SLisandro Dalcinimport pylit
2155a74a43SLisandro Dalcinfrom sphinx.ext.napoleon.docstring import NumpyDocstring
2255a74a43SLisandro Dalcin
2355a74a43SLisandro Dalcinsys.path.insert(0, os.path.abspath('.'))
2455a74a43SLisandro Dalcin_today = datetime.datetime.now()
2555a74a43SLisandro Dalcin
2655a74a43SLisandro Dalcin
2755a74a43SLisandro Dalcin# -- Project information -----------------------------------------------------
2855a74a43SLisandro Dalcin# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information
2955a74a43SLisandro Dalcin
3055a74a43SLisandro Dalcinpackage = 'petsc4py'
3155a74a43SLisandro Dalcin
3255a74a43SLisandro Dalcin
3355a74a43SLisandro Dalcindef pkg_version():
3455a74a43SLisandro Dalcin    import re
355808f684SSatish Balay    here = os.path.dirname(__file__)
365808f684SSatish Balay    pardir = [os.path.pardir] * 2
375808f684SSatish Balay    topdir = os.path.join(here, *pardir)
385808f684SSatish Balay    srcdir = os.path.join(topdir, 'src')
39f46a955bSLisandro Dalcin    with open(os.path.join(srcdir, 'petsc4py', '__init__.py')) as f:
405808f684SSatish Balay        m = re.search(r"__version__\s*=\s*'(.*)'", f.read())
415808f684SSatish Balay        return m.groups()[0]
425808f684SSatish Balay
435808f684SSatish Balay
4455a74a43SLisandro Dalcinproject = 'PETSc for Python'
4555a74a43SLisandro Dalcinauthor = 'Lisandro Dalcin'
4655a74a43SLisandro Dalcincopyright = f'{_today.year}, {author}'
475808f684SSatish Balay
4855a74a43SLisandro Dalcinrelease = pkg_version()
4955a74a43SLisandro Dalcinversion = release.rsplit('.', 1)[0]
505808f684SSatish Balay
515808f684SSatish Balay
5255a74a43SLisandro Dalcin# -- General configuration ---------------------------------------------------
5355a74a43SLisandro Dalcin# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration
545808f684SSatish Balay
5555a74a43SLisandro Dalcinextensions = [
5655a74a43SLisandro Dalcin    'sphinx.ext.autodoc',
5755a74a43SLisandro Dalcin    'sphinx.ext.autosummary',
5855a74a43SLisandro Dalcin    'sphinx.ext.intersphinx',
5955a74a43SLisandro Dalcin    'sphinx.ext.napoleon',
60*b3f8c7a1SStefano Zampini    'sphinx.ext.extlinks',
6155a74a43SLisandro Dalcin]
625808f684SSatish Balay
6355a74a43SLisandro Dalcintemplates_path = ['_templates']
645808f684SSatish Balayexclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
655808f684SSatish Balay
6655a74a43SLisandro Dalcinneeds_sphinx = '5.0.0'
675808f684SSatish Balay
6855a74a43SLisandro Dalcindefault_role = 'any'
6955a74a43SLisandro Dalcin
7055a74a43SLisandro Dalcinpygments_style = 'tango'
7155a74a43SLisandro Dalcin
7255a74a43SLisandro Dalcinnitpicky = True
7355a74a43SLisandro Dalcinnitpick_ignore = [
7455a74a43SLisandro Dalcin    ('envvar', 'NUMPY_INCLUDE'),
7555a74a43SLisandro Dalcin    ('py:class', 'ndarray'),  # FIXME
7655a74a43SLisandro Dalcin    ('py:class', 'typing_extensions.Self'),
7755a74a43SLisandro Dalcin]
7855a74a43SLisandro Dalcinnitpick_ignore_regex = [
7955a74a43SLisandro Dalcin    (r'c:.*', r'MPI_.*'),
8055a74a43SLisandro Dalcin    (r'c:.*', r'Petsc.*'),
8155a74a43SLisandro Dalcin    (r'envvar', r'(LD_LIBRARY_)?PATH'),
8255a74a43SLisandro Dalcin    (r'envvar', r'(MPICH|OMPI|MPIEXEC)_.*'),
8355a74a43SLisandro Dalcin]
8455a74a43SLisandro Dalcin
8555a74a43SLisandro Dalcintoc_object_entries = False
8655a74a43SLisandro Dalcintoc_object_entries_show_parents = 'hide'
8755a74a43SLisandro Dalcin# python_use_unqualified_type_names = True
8855a74a43SLisandro Dalcin
8955a74a43SLisandro Dalcinautodoc_class_signature = 'separated'
9055a74a43SLisandro Dalcinautodoc_typehints = 'description'
9155a74a43SLisandro Dalcinautodoc_typehints_format = 'short'
9255a74a43SLisandro Dalcinautodoc_mock_imports = []
9355a74a43SLisandro Dalcinautodoc_type_aliases = {}
9455a74a43SLisandro Dalcin
9555a74a43SLisandro Dalcinautosummary_context = {
9655a74a43SLisandro Dalcin    'synopsis': {},
9755a74a43SLisandro Dalcin    'autotype': {},
9855a74a43SLisandro Dalcin}
995808f684SSatish Balay
100*b3f8c7a1SStefano Zampini# This can be customized
101*b3f8c7a1SStefano Zampiniwww = 'https://gitlab.com/petsc/petsc/-/tree/main'
102*b3f8c7a1SStefano Zampiniextlinks = {'sources': (f'{www}/src/binding/petsc4py/src/%s','')}
1035808f684SSatish Balay
10455a74a43SLisandro Dalcindef _mangle_petsc_intersphinx():
10555a74a43SLisandro Dalcin    """Preprocess the keys in PETSc's intersphinx inventory.
10655a74a43SLisandro Dalcin
10755a74a43SLisandro Dalcin    PETSc have intersphinx keys of the form:
10855a74a43SLisandro Dalcin
10955a74a43SLisandro Dalcin        manualpages/Vec/VecShift
11055a74a43SLisandro Dalcin
11155a74a43SLisandro Dalcin    instead of:
11255a74a43SLisandro Dalcin
11355a74a43SLisandro Dalcin        petsc.VecShift
11455a74a43SLisandro Dalcin
11555a74a43SLisandro Dalcin    This function downloads their object inventory and strips the leading path
11655a74a43SLisandro Dalcin    elements so that references to PETSc names actually resolve."""
11755a74a43SLisandro Dalcin    inv = sphobjinv.Inventory(url="https://petsc.org/main/objects.inv")
11855a74a43SLisandro Dalcin
11955a74a43SLisandro Dalcin    for obj in inv.objects:
12055a74a43SLisandro Dalcin        if obj.name.startswith("manualpages"):
12155a74a43SLisandro Dalcin            obj.name = "petsc." + "/".join(obj.name.split("/")[2:])
12255a74a43SLisandro Dalcin            obj.role = "class"
12355a74a43SLisandro Dalcin            obj.domain = "py"
12455a74a43SLisandro Dalcin
12555a74a43SLisandro Dalcin    sphobjinv.writebytes("petsc_objects.inv",
12655a74a43SLisandro Dalcin                         sphobjinv.compress(inv.data_file(contract=True)))
12755a74a43SLisandro Dalcin
12855a74a43SLisandro Dalcin
12955a74a43SLisandro Dalcin_mangle_petsc_intersphinx()
13055a74a43SLisandro Dalcin
13155a74a43SLisandro Dalcin
13255a74a43SLisandro Dalcinintersphinx_mapping = {
13355a74a43SLisandro Dalcin    'python': ('https://docs.python.org/3/', None),
13455a74a43SLisandro Dalcin    'numpy': ('https://numpy.org/doc/stable/', None),
13555a74a43SLisandro Dalcin    'numpydoc': ('https://numpydoc.readthedocs.io/en/latest/', None),
13655a74a43SLisandro Dalcin    'mpi4py': ('https://mpi4py.readthedocs.io/en/stable/', None),
13755a74a43SLisandro Dalcin    'pyopencl': ('https://documen.tician.de/pyopencl/', None),
13855a74a43SLisandro Dalcin    'dlpack': ('https://dmlc.github.io/dlpack/latest/', None),
13955a74a43SLisandro Dalcin    'petsc': ('https://petsc.org/main/', 'petsc_objects.inv'),
14055a74a43SLisandro Dalcin}
14155a74a43SLisandro Dalcin
14255a74a43SLisandro Dalcinnapoleon_preprocess_types = True
14355a74a43SLisandro Dalcin
14455a74a43SLisandro Dalcintry:
14555a74a43SLisandro Dalcin    import sphinx_rtd_theme
14655a74a43SLisandro Dalcin    if 'sphinx_rtd_theme' not in extensions:
14755a74a43SLisandro Dalcin        extensions.append('sphinx_rtd_theme')
14855a74a43SLisandro Dalcinexcept ImportError:
14955a74a43SLisandro Dalcin    sphinx_rtd_theme = None
15055a74a43SLisandro Dalcin
15155a74a43SLisandro Dalcin
15255a74a43SLisandro Dalcindef _setup_mpi4py_typing():
15355a74a43SLisandro Dalcin    pkg = type(sys)('mpi4py')
15455a74a43SLisandro Dalcin    mod = type(sys)('mpi4py.MPI')
15555a74a43SLisandro Dalcin    mod.__package__ = pkg.__name__
15655a74a43SLisandro Dalcin    sys.modules[pkg.__name__] = pkg
15755a74a43SLisandro Dalcin    sys.modules[mod.__name__] = mod
15855a74a43SLisandro Dalcin    for clsname in (
15955a74a43SLisandro Dalcin        'Intracomm',
16055a74a43SLisandro Dalcin        'Datatype',
16155a74a43SLisandro Dalcin        'Op',
16255a74a43SLisandro Dalcin    ):
16355a74a43SLisandro Dalcin        cls = type(clsname, (), {})
16455a74a43SLisandro Dalcin        cls.__module__ = mod.__name__
16555a74a43SLisandro Dalcin        setattr(mod, clsname, cls)
16655a74a43SLisandro Dalcin
16755a74a43SLisandro Dalcin
16855a74a43SLisandro Dalcindef _patch_domain_python():
16955a74a43SLisandro Dalcin    from sphinx.domains.python import PythonDomain
17055a74a43SLisandro Dalcin    PythonDomain.object_types['data'].roles += ('class',)
17155a74a43SLisandro Dalcin
17255a74a43SLisandro Dalcin
17355a74a43SLisandro Dalcindef _setup_autodoc(app):
17455a74a43SLisandro Dalcin    from sphinx.ext import autodoc
17555a74a43SLisandro Dalcin    from sphinx.util import inspect
17655a74a43SLisandro Dalcin    from sphinx.util import typing
17755a74a43SLisandro Dalcin
17855a74a43SLisandro Dalcin    #
17955a74a43SLisandro Dalcin
18055a74a43SLisandro Dalcin    def stringify_annotation(annotation, mode='fully-qualified-except-typing'):
18155a74a43SLisandro Dalcin        qualname = getattr(annotation, '__qualname__', '')
18255a74a43SLisandro Dalcin        module = getattr(annotation, '__module__', '')
18355a74a43SLisandro Dalcin        args = getattr(annotation, '__args__', None)
18455a74a43SLisandro Dalcin        if module == 'builtins' and qualname and args is not None:
18555a74a43SLisandro Dalcin            args = ', '.join(stringify_annotation(a, mode) for a in args)
18655a74a43SLisandro Dalcin            return f'{qualname}[{args}]'
18755a74a43SLisandro Dalcin        return stringify_annotation_orig(annotation, mode)
18855a74a43SLisandro Dalcin
18955a74a43SLisandro Dalcin    try:
19055a74a43SLisandro Dalcin        stringify_annotation_orig = typing.stringify_annotation
19155a74a43SLisandro Dalcin        inspect.stringify_annotation = stringify_annotation
19255a74a43SLisandro Dalcin        typing.stringify_annotation = stringify_annotation
19355a74a43SLisandro Dalcin        autodoc.stringify_annotation = stringify_annotation
19455a74a43SLisandro Dalcin        autodoc.typehints.stringify_annotation = stringify_annotation
19555a74a43SLisandro Dalcin    except AttributeError:
19655a74a43SLisandro Dalcin        stringify_annotation_orig = typing.stringify
19755a74a43SLisandro Dalcin        inspect.stringify_annotation = stringify_annotation
19855a74a43SLisandro Dalcin        typing.stringify = stringify_annotation
19955a74a43SLisandro Dalcin        autodoc.stringify_typehint = stringify_annotation
20055a74a43SLisandro Dalcin
20155a74a43SLisandro Dalcin    #
20255a74a43SLisandro Dalcin
20355a74a43SLisandro Dalcin    class ClassDocumenterMixin:
20455a74a43SLisandro Dalcin
20555a74a43SLisandro Dalcin        def __init__(self, *args, **kwargs):
20655a74a43SLisandro Dalcin            super().__init__(*args, **kwargs)
20755a74a43SLisandro Dalcin            if self.config.autodoc_class_signature == 'separated':
20855a74a43SLisandro Dalcin                members = self.options.members
20955a74a43SLisandro Dalcin                special_members = self.options.special_members
21055a74a43SLisandro Dalcin                if special_members is not None:
21155a74a43SLisandro Dalcin                    for name in ('__new__', '__init__'):
21255a74a43SLisandro Dalcin                        if name in members:
21355a74a43SLisandro Dalcin                            members.remove(name)
21455a74a43SLisandro Dalcin                        if name in special_members:
21555a74a43SLisandro Dalcin                            special_members.remove(name)
21655a74a43SLisandro Dalcin
21755a74a43SLisandro Dalcin    class ClassDocumenter(
21855a74a43SLisandro Dalcin        ClassDocumenterMixin,
21955a74a43SLisandro Dalcin        autodoc.ClassDocumenter,
22055a74a43SLisandro Dalcin    ):
22155a74a43SLisandro Dalcin        pass
22255a74a43SLisandro Dalcin
22355a74a43SLisandro Dalcin    class ExceptionDocumenter(
22455a74a43SLisandro Dalcin        ClassDocumenterMixin,
22555a74a43SLisandro Dalcin        autodoc.ExceptionDocumenter,
22655a74a43SLisandro Dalcin    ):
22755a74a43SLisandro Dalcin        pass
22855a74a43SLisandro Dalcin
22955a74a43SLisandro Dalcin    app.add_autodocumenter(ClassDocumenter, override=True)
23055a74a43SLisandro Dalcin    app.add_autodocumenter(ExceptionDocumenter, override=True)
23155a74a43SLisandro Dalcin
23255a74a43SLisandro Dalcin
23355a74a43SLisandro Dalcindef _monkey_patch_returns():
23455a74a43SLisandro Dalcin    """Rewrite the role of names in "Returns" sections.
23555a74a43SLisandro Dalcin
23655a74a43SLisandro Dalcin    This is needed because Napoleon uses ``:class:`` for the return types
23755a74a43SLisandro Dalcin    and this does not work with type aliases like ``ArrayScalar``. To resolve
23855a74a43SLisandro Dalcin    this we swap ``:class:`` for ``:any:``.
23955a74a43SLisandro Dalcin
24055a74a43SLisandro Dalcin    """
24155a74a43SLisandro Dalcin    _parse_returns_section = \
24255a74a43SLisandro Dalcin        NumpyDocstring._parse_returns_section
24355a74a43SLisandro Dalcin
24455a74a43SLisandro Dalcin    @functools.wraps(NumpyDocstring._parse_returns_section)
24555a74a43SLisandro Dalcin    def wrapper(*args, **kwargs):
24655a74a43SLisandro Dalcin        out = _parse_returns_section(*args, **kwargs)
24755a74a43SLisandro Dalcin        return [line.replace(":class:", ":any:") for line in out]
24855a74a43SLisandro Dalcin
24955a74a43SLisandro Dalcin    NumpyDocstring._parse_returns_section = wrapper
25055a74a43SLisandro Dalcin
25155a74a43SLisandro Dalcin
25255a74a43SLisandro Dalcindef _monkey_patch_see_also():
25355a74a43SLisandro Dalcin    """Rewrite the role of names in "see also" sections.
25455a74a43SLisandro Dalcin
25555a74a43SLisandro Dalcin    Napoleon uses :obj: for all names found in "see also" sections but we
25655a74a43SLisandro Dalcin    need :all: so that references to labels work."""
25755a74a43SLisandro Dalcin
25855a74a43SLisandro Dalcin    _parse_numpydoc_see_also_section = \
25955a74a43SLisandro Dalcin        NumpyDocstring._parse_numpydoc_see_also_section
26055a74a43SLisandro Dalcin
26155a74a43SLisandro Dalcin    @functools.wraps(NumpyDocstring._parse_numpydoc_see_also_section)
26255a74a43SLisandro Dalcin    def wrapper(*args, **kwargs):
26355a74a43SLisandro Dalcin        out = _parse_numpydoc_see_also_section(*args, **kwargs)
26455a74a43SLisandro Dalcin        return [line.replace(":obj:", ":any:") for line in out]
26555a74a43SLisandro Dalcin
26655a74a43SLisandro Dalcin    NumpyDocstring._parse_numpydoc_see_also_section = wrapper
26755a74a43SLisandro Dalcin
26855a74a43SLisandro Dalcin
26955a74a43SLisandro Dalcindef _apply_monkey_patches():
27055a74a43SLisandro Dalcin    """Modify Napoleon types after parsing to make references work."""
27155a74a43SLisandro Dalcin    _monkey_patch_returns()
27255a74a43SLisandro Dalcin    _monkey_patch_see_also()
27355a74a43SLisandro Dalcin
27455a74a43SLisandro Dalcin
27555a74a43SLisandro Dalcin_apply_monkey_patches()
27655a74a43SLisandro Dalcin
27755a74a43SLisandro Dalcin
27855a74a43SLisandro Dalcindef _process_demos(*demos):
27955a74a43SLisandro Dalcin    # Convert demo .py files to rst. Also copy the .py file so it can be
28055a74a43SLisandro Dalcin    # linked from the demo rst file.
28155a74a43SLisandro Dalcin    try:
28255a74a43SLisandro Dalcin        os.mkdir("demo")
28355a74a43SLisandro Dalcin    except FileExistsError:
28455a74a43SLisandro Dalcin        pass
28555a74a43SLisandro Dalcin    for demo in demos:
28655a74a43SLisandro Dalcin        demo_dir = os.path.join("demo", os.path.dirname(demo))
28755a74a43SLisandro Dalcin        demo_src = os.path.join(os.pardir, os.pardir, "demo", demo)
28855a74a43SLisandro Dalcin        try:
28955a74a43SLisandro Dalcin            os.mkdir(demo_dir)
29055a74a43SLisandro Dalcin        except FileExistsError:
29155a74a43SLisandro Dalcin            pass
29255a74a43SLisandro Dalcin        with open(demo_src, "r") as infile:
29355a74a43SLisandro Dalcin            with open(os.path.join(
29455a74a43SLisandro Dalcin                os.path.join("demo", os.path.splitext(demo)[0] + ".rst")), "w"
29555a74a43SLisandro Dalcin            ) as outfile:
29655a74a43SLisandro Dalcin                converter = pylit.Code2Text(infile)
29755a74a43SLisandro Dalcin                outfile.write(str(converter))
29855a74a43SLisandro Dalcin        demo_copy_name = os.path.join(demo_dir, os.path.basename(demo))
29955a74a43SLisandro Dalcin        shutil.copyfile(demo_src, demo_copy_name)
30055a74a43SLisandro Dalcin        html_static_path.append(demo_copy_name)
30155a74a43SLisandro Dalcin    with open(os.path.join("demo", "demo.rst"), "w") as demofile:
30255a74a43SLisandro Dalcin        demofile.write("""
30355a74a43SLisandro Dalcinpetsc4py demos
30455a74a43SLisandro Dalcin==============
30555a74a43SLisandro Dalcin
30655a74a43SLisandro Dalcin.. toctree::
30755a74a43SLisandro Dalcin
30855a74a43SLisandro Dalcin""")
30955a74a43SLisandro Dalcin        for demo in demos:
31055a74a43SLisandro Dalcin            demofile.write("    " + os.path.splitext(demo)[0] + "\n")
31155a74a43SLisandro Dalcin        demofile.write("\n")
31255a74a43SLisandro Dalcin
31355a74a43SLisandro Dalcinhtml_static_path=[]
31455a74a43SLisandro Dalcin_process_demos(
31555a74a43SLisandro Dalcin    "poisson2d/poisson2d.py"
31655a74a43SLisandro Dalcin)
31755a74a43SLisandro Dalcin
31855a74a43SLisandro Dalcin
31955a74a43SLisandro Dalcindef setup(app):
32055a74a43SLisandro Dalcin    _setup_mpi4py_typing()
32155a74a43SLisandro Dalcin    _patch_domain_python()
32255a74a43SLisandro Dalcin    _monkey_patch_returns()
32355a74a43SLisandro Dalcin    _monkey_patch_see_also()
32455a74a43SLisandro Dalcin    _setup_autodoc(app)
32555a74a43SLisandro Dalcin
32655a74a43SLisandro Dalcin    try:
32755a74a43SLisandro Dalcin        from petsc4py import PETSc
32855a74a43SLisandro Dalcin    except ImportError:
32955a74a43SLisandro Dalcin        autodoc_mock_imports.append('PETSc')
33055a74a43SLisandro Dalcin        return
33155a74a43SLisandro Dalcin    del PETSc.DA  # FIXME
33255a74a43SLisandro Dalcin
33355a74a43SLisandro Dalcin    sys_dwb = sys.dont_write_bytecode
33455a74a43SLisandro Dalcin    sys.dont_write_bytecode = True
33555a74a43SLisandro Dalcin    import apidoc
33655a74a43SLisandro Dalcin    sys.dont_write_bytecode = sys_dwb
33755a74a43SLisandro Dalcin
33855a74a43SLisandro Dalcin    name = PETSc.__name__
33955a74a43SLisandro Dalcin    here = os.path.abspath(os.path.dirname(__file__))
34055a74a43SLisandro Dalcin    outdir = os.path.join(here, apidoc.OUTDIR)
34155a74a43SLisandro Dalcin    source = os.path.join(outdir, f'{name}.py')
34255a74a43SLisandro Dalcin    getmtime = os.path.getmtime
34355a74a43SLisandro Dalcin    generate = (
34455a74a43SLisandro Dalcin        not os.path.exists(source)
34555a74a43SLisandro Dalcin        or getmtime(source) < getmtime(PETSc.__file__)
34655a74a43SLisandro Dalcin        or getmtime(source) < getmtime(apidoc.__file__)
34755a74a43SLisandro Dalcin    )
34855a74a43SLisandro Dalcin    if generate:
34955a74a43SLisandro Dalcin        apidoc.generate(source)
35055a74a43SLisandro Dalcin    module = apidoc.load_module(source)
35155a74a43SLisandro Dalcin    apidoc.replace_module(module)
35255a74a43SLisandro Dalcin
35355a74a43SLisandro Dalcin    modules = [
35455a74a43SLisandro Dalcin        'petsc4py',
35555a74a43SLisandro Dalcin    ]
35655a74a43SLisandro Dalcin    typing_overload = typing.overload
35755a74a43SLisandro Dalcin    typing.overload = lambda arg: arg
35855a74a43SLisandro Dalcin    for name in modules:
35955a74a43SLisandro Dalcin        mod = importlib.import_module(name)
36055a74a43SLisandro Dalcin        ann = apidoc.load_module(f'{mod.__file__}i', name)
36155a74a43SLisandro Dalcin        apidoc.annotate(mod, ann)
36255a74a43SLisandro Dalcin    typing.overload = typing_overload
36355a74a43SLisandro Dalcin
36455a74a43SLisandro Dalcin    from petsc4py import typing as tp
36555a74a43SLisandro Dalcin    for attr in tp.__all__:
36655a74a43SLisandro Dalcin        autodoc_type_aliases[attr] = f'~petsc4py.typing.{attr}'
36755a74a43SLisandro Dalcin
36855a74a43SLisandro Dalcin# -- Options for HTML output -------------------------------------------------
36955a74a43SLisandro Dalcin# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output
3705808f684SSatish Balay
3715808f684SSatish Balay# The theme to use for HTML and HTML Help pages.  See the documentation for
3725808f684SSatish Balay# a list of builtin themes.
37355a74a43SLisandro Dalcinhtml_theme = 'pydata_sphinx_theme'
3745808f684SSatish Balay
3755808f684SSatish Balay# -- Options for HTMLHelp output ------------------------------------------
3765808f684SSatish Balay
3775808f684SSatish Balay# Output file base name for HTML help builder.
37855a74a43SLisandro Dalcinhtmlhelp_basename = f'{package}-man'
3795808f684SSatish Balay
3805808f684SSatish Balay
3815808f684SSatish Balay# -- Options for LaTeX output ---------------------------------------------
3825808f684SSatish Balay
3835808f684SSatish Balay# (source start file, target name, title,
3845808f684SSatish Balay#  author, documentclass [howto, manual, or own class]).
3855808f684SSatish Balaylatex_documents = [
38655a74a43SLisandro Dalcin    ('index', f'{package}.tex', project, author, 'howto'),
3875808f684SSatish Balay]
3885808f684SSatish Balay
38955a74a43SLisandro Dalcinlatex_elements = {
39055a74a43SLisandro Dalcin    'papersize': 'a4',
39155a74a43SLisandro Dalcin}
39255a74a43SLisandro Dalcin
3935808f684SSatish Balay
3945808f684SSatish Balay# -- Options for manual page output ---------------------------------------
3955808f684SSatish Balay
3965808f684SSatish Balay# (source start file, name, description, authors, manual section).
3975808f684SSatish Balayman_pages = [
39855a74a43SLisandro Dalcin    ('index', package, project, [author], 3)
3995808f684SSatish Balay]
4005808f684SSatish Balay
4015808f684SSatish Balay
4025808f684SSatish Balay# -- Options for Texinfo output -------------------------------------------
4035808f684SSatish Balay
4045808f684SSatish Balay# (source start file, target name, title, author,
4055808f684SSatish Balay#  dir menu entry, description, category)
4065808f684SSatish Balaytexinfo_documents = [
40755a74a43SLisandro Dalcin    ('index', package, project, author,
40855a74a43SLisandro Dalcin     package, f'{project}.', 'Miscellaneous'),
4095808f684SSatish Balay]
4105808f684SSatish Balay
41155a74a43SLisandro Dalcin
4125808f684SSatish Balay# -- Options for Epub output ----------------------------------------------
4135808f684SSatish Balay
41455a74a43SLisandro Dalcin# Output file base name for ePub builder.
41555a74a43SLisandro Dalcinepub_basename = package
416