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