xref: /petsc/src/binding/petsc4py/docs/source/conf.py (revision 55a74a43bb44613d95e937906bec3b8c3581b432)
1*55a74a43SLisandro Dalcin# Configuration file for the Sphinx documentation builder.
25808f684SSatish Balay#
3*55a74a43SLisandro Dalcin# For the full list of built-in configuration values, see the documentation:
4*55a74a43SLisandro Dalcin# https://www.sphinx-doc.org/en/master/usage/configuration.html
5*55a74a43SLisandro Dalcin
6*55a74a43SLisandro 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
12*55a74a43SLisandro Dalcinimport os
13*55a74a43SLisandro Dalcinimport shutil
14*55a74a43SLisandro Dalcinimport sys
15*55a74a43SLisandro Dalcinimport typing
16*55a74a43SLisandro Dalcinimport datetime
17*55a74a43SLisandro Dalcinimport importlib
18*55a74a43SLisandro Dalcinimport sphobjinv
19*55a74a43SLisandro Dalcinimport functools
20*55a74a43SLisandro Dalcinimport pylit
21*55a74a43SLisandro Dalcinfrom sphinx.ext.napoleon.docstring import NumpyDocstring
22*55a74a43SLisandro Dalcin
23*55a74a43SLisandro Dalcinsys.path.insert(0, os.path.abspath('.'))
24*55a74a43SLisandro Dalcin_today = datetime.datetime.now()
25*55a74a43SLisandro Dalcin
26*55a74a43SLisandro Dalcin
27*55a74a43SLisandro Dalcin# -- Project information -----------------------------------------------------
28*55a74a43SLisandro Dalcin# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information
29*55a74a43SLisandro Dalcin
30*55a74a43SLisandro Dalcinpackage = 'petsc4py'
31*55a74a43SLisandro Dalcin
32*55a74a43SLisandro Dalcin
33*55a74a43SLisandro Dalcindef pkg_version():
34*55a74a43SLisandro 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
44*55a74a43SLisandro Dalcinproject = 'PETSc for Python'
45*55a74a43SLisandro Dalcinauthor = 'Lisandro Dalcin'
46*55a74a43SLisandro Dalcincopyright = f'{_today.year}, {author}'
475808f684SSatish Balay
48*55a74a43SLisandro Dalcinrelease = pkg_version()
49*55a74a43SLisandro Dalcinversion = release.rsplit('.', 1)[0]
505808f684SSatish Balay
515808f684SSatish Balay
52*55a74a43SLisandro Dalcin# -- General configuration ---------------------------------------------------
53*55a74a43SLisandro Dalcin# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration
545808f684SSatish Balay
55*55a74a43SLisandro Dalcinextensions = [
56*55a74a43SLisandro Dalcin    'sphinx.ext.autodoc',
57*55a74a43SLisandro Dalcin    'sphinx.ext.autosummary',
58*55a74a43SLisandro Dalcin    'sphinx.ext.intersphinx',
59*55a74a43SLisandro Dalcin    'sphinx.ext.napoleon',
60*55a74a43SLisandro Dalcin]
615808f684SSatish Balay
62*55a74a43SLisandro Dalcintemplates_path = ['_templates']
635808f684SSatish Balayexclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
645808f684SSatish Balay
65*55a74a43SLisandro Dalcinneeds_sphinx = '5.0.0'
665808f684SSatish Balay
67*55a74a43SLisandro Dalcindefault_role = 'any'
68*55a74a43SLisandro Dalcin
69*55a74a43SLisandro Dalcinpygments_style = 'tango'
70*55a74a43SLisandro Dalcin
71*55a74a43SLisandro Dalcinnitpicky = True
72*55a74a43SLisandro Dalcinnitpick_ignore = [
73*55a74a43SLisandro Dalcin    ('envvar', 'NUMPY_INCLUDE'),
74*55a74a43SLisandro Dalcin    ('py:class', 'ndarray'),  # FIXME
75*55a74a43SLisandro Dalcin    ('py:class', 'typing_extensions.Self'),
76*55a74a43SLisandro Dalcin]
77*55a74a43SLisandro Dalcinnitpick_ignore_regex = [
78*55a74a43SLisandro Dalcin    (r'c:.*', r'MPI_.*'),
79*55a74a43SLisandro Dalcin    (r'c:.*', r'Petsc.*'),
80*55a74a43SLisandro Dalcin    (r'envvar', r'(LD_LIBRARY_)?PATH'),
81*55a74a43SLisandro Dalcin    (r'envvar', r'(MPICH|OMPI|MPIEXEC)_.*'),
82*55a74a43SLisandro Dalcin]
83*55a74a43SLisandro Dalcin
84*55a74a43SLisandro Dalcintoc_object_entries = False
85*55a74a43SLisandro Dalcintoc_object_entries_show_parents = 'hide'
86*55a74a43SLisandro Dalcin# python_use_unqualified_type_names = True
87*55a74a43SLisandro Dalcin
88*55a74a43SLisandro Dalcinautodoc_class_signature = 'separated'
89*55a74a43SLisandro Dalcinautodoc_typehints = 'description'
90*55a74a43SLisandro Dalcinautodoc_typehints_format = 'short'
91*55a74a43SLisandro Dalcinautodoc_mock_imports = []
92*55a74a43SLisandro Dalcinautodoc_type_aliases = {}
93*55a74a43SLisandro Dalcin
94*55a74a43SLisandro Dalcinautosummary_context = {
95*55a74a43SLisandro Dalcin    'synopsis': {},
96*55a74a43SLisandro Dalcin    'autotype': {},
97*55a74a43SLisandro Dalcin}
985808f684SSatish Balay
995808f684SSatish Balay
100*55a74a43SLisandro Dalcindef _mangle_petsc_intersphinx():
101*55a74a43SLisandro Dalcin    """Preprocess the keys in PETSc's intersphinx inventory.
102*55a74a43SLisandro Dalcin
103*55a74a43SLisandro Dalcin    PETSc have intersphinx keys of the form:
104*55a74a43SLisandro Dalcin
105*55a74a43SLisandro Dalcin        manualpages/Vec/VecShift
106*55a74a43SLisandro Dalcin
107*55a74a43SLisandro Dalcin    instead of:
108*55a74a43SLisandro Dalcin
109*55a74a43SLisandro Dalcin        petsc.VecShift
110*55a74a43SLisandro Dalcin
111*55a74a43SLisandro Dalcin    This function downloads their object inventory and strips the leading path
112*55a74a43SLisandro Dalcin    elements so that references to PETSc names actually resolve."""
113*55a74a43SLisandro Dalcin    inv = sphobjinv.Inventory(url="https://petsc.org/main/objects.inv")
114*55a74a43SLisandro Dalcin
115*55a74a43SLisandro Dalcin    for obj in inv.objects:
116*55a74a43SLisandro Dalcin        if obj.name.startswith("manualpages"):
117*55a74a43SLisandro Dalcin            obj.name = "petsc." + "/".join(obj.name.split("/")[2:])
118*55a74a43SLisandro Dalcin            obj.role = "class"
119*55a74a43SLisandro Dalcin            obj.domain = "py"
120*55a74a43SLisandro Dalcin
121*55a74a43SLisandro Dalcin    sphobjinv.writebytes("petsc_objects.inv",
122*55a74a43SLisandro Dalcin                         sphobjinv.compress(inv.data_file(contract=True)))
123*55a74a43SLisandro Dalcin
124*55a74a43SLisandro Dalcin
125*55a74a43SLisandro Dalcin_mangle_petsc_intersphinx()
126*55a74a43SLisandro Dalcin
127*55a74a43SLisandro Dalcin
128*55a74a43SLisandro Dalcinintersphinx_mapping = {
129*55a74a43SLisandro Dalcin    'python': ('https://docs.python.org/3/', None),
130*55a74a43SLisandro Dalcin    'numpy': ('https://numpy.org/doc/stable/', None),
131*55a74a43SLisandro Dalcin    'numpydoc': ('https://numpydoc.readthedocs.io/en/latest/', None),
132*55a74a43SLisandro Dalcin    'mpi4py': ('https://mpi4py.readthedocs.io/en/stable/', None),
133*55a74a43SLisandro Dalcin    'pyopencl': ('https://documen.tician.de/pyopencl/', None),
134*55a74a43SLisandro Dalcin    'dlpack': ('https://dmlc.github.io/dlpack/latest/', None),
135*55a74a43SLisandro Dalcin    'petsc': ('https://petsc.org/main/', 'petsc_objects.inv'),
136*55a74a43SLisandro Dalcin}
137*55a74a43SLisandro Dalcin
138*55a74a43SLisandro Dalcinnapoleon_preprocess_types = True
139*55a74a43SLisandro Dalcin
140*55a74a43SLisandro Dalcintry:
141*55a74a43SLisandro Dalcin    import sphinx_rtd_theme
142*55a74a43SLisandro Dalcin    if 'sphinx_rtd_theme' not in extensions:
143*55a74a43SLisandro Dalcin        extensions.append('sphinx_rtd_theme')
144*55a74a43SLisandro Dalcinexcept ImportError:
145*55a74a43SLisandro Dalcin    sphinx_rtd_theme = None
146*55a74a43SLisandro Dalcin
147*55a74a43SLisandro Dalcin
148*55a74a43SLisandro Dalcindef _setup_mpi4py_typing():
149*55a74a43SLisandro Dalcin    pkg = type(sys)('mpi4py')
150*55a74a43SLisandro Dalcin    mod = type(sys)('mpi4py.MPI')
151*55a74a43SLisandro Dalcin    mod.__package__ = pkg.__name__
152*55a74a43SLisandro Dalcin    sys.modules[pkg.__name__] = pkg
153*55a74a43SLisandro Dalcin    sys.modules[mod.__name__] = mod
154*55a74a43SLisandro Dalcin    for clsname in (
155*55a74a43SLisandro Dalcin        'Intracomm',
156*55a74a43SLisandro Dalcin        'Datatype',
157*55a74a43SLisandro Dalcin        'Op',
158*55a74a43SLisandro Dalcin    ):
159*55a74a43SLisandro Dalcin        cls = type(clsname, (), {})
160*55a74a43SLisandro Dalcin        cls.__module__ = mod.__name__
161*55a74a43SLisandro Dalcin        setattr(mod, clsname, cls)
162*55a74a43SLisandro Dalcin
163*55a74a43SLisandro Dalcin
164*55a74a43SLisandro Dalcindef _patch_domain_python():
165*55a74a43SLisandro Dalcin    from sphinx.domains.python import PythonDomain
166*55a74a43SLisandro Dalcin    PythonDomain.object_types['data'].roles += ('class',)
167*55a74a43SLisandro Dalcin
168*55a74a43SLisandro Dalcin
169*55a74a43SLisandro Dalcindef _setup_autodoc(app):
170*55a74a43SLisandro Dalcin    from sphinx.ext import autodoc
171*55a74a43SLisandro Dalcin    from sphinx.util import inspect
172*55a74a43SLisandro Dalcin    from sphinx.util import typing
173*55a74a43SLisandro Dalcin
174*55a74a43SLisandro Dalcin    #
175*55a74a43SLisandro Dalcin
176*55a74a43SLisandro Dalcin    def stringify_annotation(annotation, mode='fully-qualified-except-typing'):
177*55a74a43SLisandro Dalcin        qualname = getattr(annotation, '__qualname__', '')
178*55a74a43SLisandro Dalcin        module = getattr(annotation, '__module__', '')
179*55a74a43SLisandro Dalcin        args = getattr(annotation, '__args__', None)
180*55a74a43SLisandro Dalcin        if module == 'builtins' and qualname and args is not None:
181*55a74a43SLisandro Dalcin            args = ', '.join(stringify_annotation(a, mode) for a in args)
182*55a74a43SLisandro Dalcin            return f'{qualname}[{args}]'
183*55a74a43SLisandro Dalcin        return stringify_annotation_orig(annotation, mode)
184*55a74a43SLisandro Dalcin
185*55a74a43SLisandro Dalcin    try:
186*55a74a43SLisandro Dalcin        stringify_annotation_orig = typing.stringify_annotation
187*55a74a43SLisandro Dalcin        inspect.stringify_annotation = stringify_annotation
188*55a74a43SLisandro Dalcin        typing.stringify_annotation = stringify_annotation
189*55a74a43SLisandro Dalcin        autodoc.stringify_annotation = stringify_annotation
190*55a74a43SLisandro Dalcin        autodoc.typehints.stringify_annotation = stringify_annotation
191*55a74a43SLisandro Dalcin    except AttributeError:
192*55a74a43SLisandro Dalcin        stringify_annotation_orig = typing.stringify
193*55a74a43SLisandro Dalcin        inspect.stringify_annotation = stringify_annotation
194*55a74a43SLisandro Dalcin        typing.stringify = stringify_annotation
195*55a74a43SLisandro Dalcin        autodoc.stringify_typehint = stringify_annotation
196*55a74a43SLisandro Dalcin
197*55a74a43SLisandro Dalcin    #
198*55a74a43SLisandro Dalcin
199*55a74a43SLisandro Dalcin    class ClassDocumenterMixin:
200*55a74a43SLisandro Dalcin
201*55a74a43SLisandro Dalcin        def __init__(self, *args, **kwargs):
202*55a74a43SLisandro Dalcin            super().__init__(*args, **kwargs)
203*55a74a43SLisandro Dalcin            if self.config.autodoc_class_signature == 'separated':
204*55a74a43SLisandro Dalcin                members = self.options.members
205*55a74a43SLisandro Dalcin                special_members = self.options.special_members
206*55a74a43SLisandro Dalcin                if special_members is not None:
207*55a74a43SLisandro Dalcin                    for name in ('__new__', '__init__'):
208*55a74a43SLisandro Dalcin                        if name in members:
209*55a74a43SLisandro Dalcin                            members.remove(name)
210*55a74a43SLisandro Dalcin                        if name in special_members:
211*55a74a43SLisandro Dalcin                            special_members.remove(name)
212*55a74a43SLisandro Dalcin
213*55a74a43SLisandro Dalcin    class ClassDocumenter(
214*55a74a43SLisandro Dalcin        ClassDocumenterMixin,
215*55a74a43SLisandro Dalcin        autodoc.ClassDocumenter,
216*55a74a43SLisandro Dalcin    ):
217*55a74a43SLisandro Dalcin        pass
218*55a74a43SLisandro Dalcin
219*55a74a43SLisandro Dalcin    class ExceptionDocumenter(
220*55a74a43SLisandro Dalcin        ClassDocumenterMixin,
221*55a74a43SLisandro Dalcin        autodoc.ExceptionDocumenter,
222*55a74a43SLisandro Dalcin    ):
223*55a74a43SLisandro Dalcin        pass
224*55a74a43SLisandro Dalcin
225*55a74a43SLisandro Dalcin    app.add_autodocumenter(ClassDocumenter, override=True)
226*55a74a43SLisandro Dalcin    app.add_autodocumenter(ExceptionDocumenter, override=True)
227*55a74a43SLisandro Dalcin
228*55a74a43SLisandro Dalcin
229*55a74a43SLisandro Dalcindef _monkey_patch_returns():
230*55a74a43SLisandro Dalcin    """Rewrite the role of names in "Returns" sections.
231*55a74a43SLisandro Dalcin
232*55a74a43SLisandro Dalcin    This is needed because Napoleon uses ``:class:`` for the return types
233*55a74a43SLisandro Dalcin    and this does not work with type aliases like ``ArrayScalar``. To resolve
234*55a74a43SLisandro Dalcin    this we swap ``:class:`` for ``:any:``.
235*55a74a43SLisandro Dalcin
236*55a74a43SLisandro Dalcin    """
237*55a74a43SLisandro Dalcin    _parse_returns_section = \
238*55a74a43SLisandro Dalcin        NumpyDocstring._parse_returns_section
239*55a74a43SLisandro Dalcin
240*55a74a43SLisandro Dalcin    @functools.wraps(NumpyDocstring._parse_returns_section)
241*55a74a43SLisandro Dalcin    def wrapper(*args, **kwargs):
242*55a74a43SLisandro Dalcin        out = _parse_returns_section(*args, **kwargs)
243*55a74a43SLisandro Dalcin        return [line.replace(":class:", ":any:") for line in out]
244*55a74a43SLisandro Dalcin
245*55a74a43SLisandro Dalcin    NumpyDocstring._parse_returns_section = wrapper
246*55a74a43SLisandro Dalcin
247*55a74a43SLisandro Dalcin
248*55a74a43SLisandro Dalcindef _monkey_patch_see_also():
249*55a74a43SLisandro Dalcin    """Rewrite the role of names in "see also" sections.
250*55a74a43SLisandro Dalcin
251*55a74a43SLisandro Dalcin    Napoleon uses :obj: for all names found in "see also" sections but we
252*55a74a43SLisandro Dalcin    need :all: so that references to labels work."""
253*55a74a43SLisandro Dalcin
254*55a74a43SLisandro Dalcin    _parse_numpydoc_see_also_section = \
255*55a74a43SLisandro Dalcin        NumpyDocstring._parse_numpydoc_see_also_section
256*55a74a43SLisandro Dalcin
257*55a74a43SLisandro Dalcin    @functools.wraps(NumpyDocstring._parse_numpydoc_see_also_section)
258*55a74a43SLisandro Dalcin    def wrapper(*args, **kwargs):
259*55a74a43SLisandro Dalcin        out = _parse_numpydoc_see_also_section(*args, **kwargs)
260*55a74a43SLisandro Dalcin        return [line.replace(":obj:", ":any:") for line in out]
261*55a74a43SLisandro Dalcin
262*55a74a43SLisandro Dalcin    NumpyDocstring._parse_numpydoc_see_also_section = wrapper
263*55a74a43SLisandro Dalcin
264*55a74a43SLisandro Dalcin
265*55a74a43SLisandro Dalcindef _apply_monkey_patches():
266*55a74a43SLisandro Dalcin    """Modify Napoleon types after parsing to make references work."""
267*55a74a43SLisandro Dalcin    _monkey_patch_returns()
268*55a74a43SLisandro Dalcin    _monkey_patch_see_also()
269*55a74a43SLisandro Dalcin
270*55a74a43SLisandro Dalcin
271*55a74a43SLisandro Dalcin_apply_monkey_patches()
272*55a74a43SLisandro Dalcin
273*55a74a43SLisandro Dalcin
274*55a74a43SLisandro Dalcindef _process_demos(*demos):
275*55a74a43SLisandro Dalcin    # Convert demo .py files to rst. Also copy the .py file so it can be
276*55a74a43SLisandro Dalcin    # linked from the demo rst file.
277*55a74a43SLisandro Dalcin    try:
278*55a74a43SLisandro Dalcin        os.mkdir("demo")
279*55a74a43SLisandro Dalcin    except FileExistsError:
280*55a74a43SLisandro Dalcin        pass
281*55a74a43SLisandro Dalcin    for demo in demos:
282*55a74a43SLisandro Dalcin        demo_dir = os.path.join("demo", os.path.dirname(demo))
283*55a74a43SLisandro Dalcin        demo_src = os.path.join(os.pardir, os.pardir, "demo", demo)
284*55a74a43SLisandro Dalcin        try:
285*55a74a43SLisandro Dalcin            os.mkdir(demo_dir)
286*55a74a43SLisandro Dalcin        except FileExistsError:
287*55a74a43SLisandro Dalcin            pass
288*55a74a43SLisandro Dalcin        with open(demo_src, "r") as infile:
289*55a74a43SLisandro Dalcin            with open(os.path.join(
290*55a74a43SLisandro Dalcin                os.path.join("demo", os.path.splitext(demo)[0] + ".rst")), "w"
291*55a74a43SLisandro Dalcin            ) as outfile:
292*55a74a43SLisandro Dalcin                converter = pylit.Code2Text(infile)
293*55a74a43SLisandro Dalcin                outfile.write(str(converter))
294*55a74a43SLisandro Dalcin        demo_copy_name = os.path.join(demo_dir, os.path.basename(demo))
295*55a74a43SLisandro Dalcin        shutil.copyfile(demo_src, demo_copy_name)
296*55a74a43SLisandro Dalcin        html_static_path.append(demo_copy_name)
297*55a74a43SLisandro Dalcin    with open(os.path.join("demo", "demo.rst"), "w") as demofile:
298*55a74a43SLisandro Dalcin        demofile.write("""
299*55a74a43SLisandro Dalcinpetsc4py demos
300*55a74a43SLisandro Dalcin==============
301*55a74a43SLisandro Dalcin
302*55a74a43SLisandro Dalcin.. toctree::
303*55a74a43SLisandro Dalcin
304*55a74a43SLisandro Dalcin""")
305*55a74a43SLisandro Dalcin        for demo in demos:
306*55a74a43SLisandro Dalcin            demofile.write("    " + os.path.splitext(demo)[0] + "\n")
307*55a74a43SLisandro Dalcin        demofile.write("\n")
308*55a74a43SLisandro Dalcin
309*55a74a43SLisandro Dalcinhtml_static_path=[]
310*55a74a43SLisandro Dalcin_process_demos(
311*55a74a43SLisandro Dalcin    "poisson2d/poisson2d.py"
312*55a74a43SLisandro Dalcin)
313*55a74a43SLisandro Dalcin
314*55a74a43SLisandro Dalcin
315*55a74a43SLisandro Dalcindef setup(app):
316*55a74a43SLisandro Dalcin    _setup_mpi4py_typing()
317*55a74a43SLisandro Dalcin    _patch_domain_python()
318*55a74a43SLisandro Dalcin    _monkey_patch_returns()
319*55a74a43SLisandro Dalcin    _monkey_patch_see_also()
320*55a74a43SLisandro Dalcin    _setup_autodoc(app)
321*55a74a43SLisandro Dalcin
322*55a74a43SLisandro Dalcin    try:
323*55a74a43SLisandro Dalcin        from petsc4py import PETSc
324*55a74a43SLisandro Dalcin    except ImportError:
325*55a74a43SLisandro Dalcin        autodoc_mock_imports.append('PETSc')
326*55a74a43SLisandro Dalcin        return
327*55a74a43SLisandro Dalcin    del PETSc.DA  # FIXME
328*55a74a43SLisandro Dalcin
329*55a74a43SLisandro Dalcin    sys_dwb = sys.dont_write_bytecode
330*55a74a43SLisandro Dalcin    sys.dont_write_bytecode = True
331*55a74a43SLisandro Dalcin    import apidoc
332*55a74a43SLisandro Dalcin    sys.dont_write_bytecode = sys_dwb
333*55a74a43SLisandro Dalcin
334*55a74a43SLisandro Dalcin    name = PETSc.__name__
335*55a74a43SLisandro Dalcin    here = os.path.abspath(os.path.dirname(__file__))
336*55a74a43SLisandro Dalcin    outdir = os.path.join(here, apidoc.OUTDIR)
337*55a74a43SLisandro Dalcin    source = os.path.join(outdir, f'{name}.py')
338*55a74a43SLisandro Dalcin    getmtime = os.path.getmtime
339*55a74a43SLisandro Dalcin    generate = (
340*55a74a43SLisandro Dalcin        not os.path.exists(source)
341*55a74a43SLisandro Dalcin        or getmtime(source) < getmtime(PETSc.__file__)
342*55a74a43SLisandro Dalcin        or getmtime(source) < getmtime(apidoc.__file__)
343*55a74a43SLisandro Dalcin    )
344*55a74a43SLisandro Dalcin    if generate:
345*55a74a43SLisandro Dalcin        apidoc.generate(source)
346*55a74a43SLisandro Dalcin    module = apidoc.load_module(source)
347*55a74a43SLisandro Dalcin    apidoc.replace_module(module)
348*55a74a43SLisandro Dalcin
349*55a74a43SLisandro Dalcin    modules = [
350*55a74a43SLisandro Dalcin        'petsc4py',
351*55a74a43SLisandro Dalcin    ]
352*55a74a43SLisandro Dalcin    typing_overload = typing.overload
353*55a74a43SLisandro Dalcin    typing.overload = lambda arg: arg
354*55a74a43SLisandro Dalcin    for name in modules:
355*55a74a43SLisandro Dalcin        mod = importlib.import_module(name)
356*55a74a43SLisandro Dalcin        ann = apidoc.load_module(f'{mod.__file__}i', name)
357*55a74a43SLisandro Dalcin        apidoc.annotate(mod, ann)
358*55a74a43SLisandro Dalcin    typing.overload = typing_overload
359*55a74a43SLisandro Dalcin
360*55a74a43SLisandro Dalcin    from petsc4py import typing as tp
361*55a74a43SLisandro Dalcin    for attr in tp.__all__:
362*55a74a43SLisandro Dalcin        autodoc_type_aliases[attr] = f'~petsc4py.typing.{attr}'
363*55a74a43SLisandro Dalcin
364*55a74a43SLisandro Dalcin# -- Options for HTML output -------------------------------------------------
365*55a74a43SLisandro Dalcin# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output
3665808f684SSatish Balay
3675808f684SSatish Balay# The theme to use for HTML and HTML Help pages.  See the documentation for
3685808f684SSatish Balay# a list of builtin themes.
369*55a74a43SLisandro Dalcinhtml_theme = 'pydata_sphinx_theme'
3705808f684SSatish Balay
3715808f684SSatish Balay# -- Options for HTMLHelp output ------------------------------------------
3725808f684SSatish Balay
3735808f684SSatish Balay# Output file base name for HTML help builder.
374*55a74a43SLisandro Dalcinhtmlhelp_basename = f'{package}-man'
3755808f684SSatish Balay
3765808f684SSatish Balay
3775808f684SSatish Balay# -- Options for LaTeX output ---------------------------------------------
3785808f684SSatish Balay
3795808f684SSatish Balay# (source start file, target name, title,
3805808f684SSatish Balay#  author, documentclass [howto, manual, or own class]).
3815808f684SSatish Balaylatex_documents = [
382*55a74a43SLisandro Dalcin    ('index', f'{package}.tex', project, author, 'howto'),
3835808f684SSatish Balay]
3845808f684SSatish Balay
385*55a74a43SLisandro Dalcinlatex_elements = {
386*55a74a43SLisandro Dalcin    'papersize': 'a4',
387*55a74a43SLisandro Dalcin}
388*55a74a43SLisandro Dalcin
3895808f684SSatish Balay
3905808f684SSatish Balay# -- Options for manual page output ---------------------------------------
3915808f684SSatish Balay
3925808f684SSatish Balay# (source start file, name, description, authors, manual section).
3935808f684SSatish Balayman_pages = [
394*55a74a43SLisandro Dalcin    ('index', package, project, [author], 3)
3955808f684SSatish Balay]
3965808f684SSatish Balay
3975808f684SSatish Balay
3985808f684SSatish Balay# -- Options for Texinfo output -------------------------------------------
3995808f684SSatish Balay
4005808f684SSatish Balay# (source start file, target name, title, author,
4015808f684SSatish Balay#  dir menu entry, description, category)
4025808f684SSatish Balaytexinfo_documents = [
403*55a74a43SLisandro Dalcin    ('index', package, project, author,
404*55a74a43SLisandro Dalcin     package, f'{project}.', 'Miscellaneous'),
4055808f684SSatish Balay]
4065808f684SSatish Balay
407*55a74a43SLisandro Dalcin
4085808f684SSatish Balay# -- Options for Epub output ----------------------------------------------
4095808f684SSatish Balay
410*55a74a43SLisandro Dalcin# Output file base name for ePub builder.
411*55a74a43SLisandro Dalcinepub_basename = package
412