# This code is part of Qiskit. # # (C) Copyright IBM 2018. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. # pylint: disable=invalid-name # Configuration file for the Sphinx documentation builder. # # This file does only contain a selection of the most common options. For a # full list see the documentation: # http://www.sphinx-doc.org/en/master/config # -- Path setup -------------------------------------------------------------- # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. # # import os # import sys # sys.path.insert(0, os.path.abspath('.')) """ Sphinx documentation builder """ import datetime import importlib import inspect import os import re from pathlib import Path # Set env flag so that we can doc functions that may otherwise not be loaded # see for example interactive visualizations in qiskit.visualization. os.environ['QISKIT_DOCS'] = 'TRUE' # -- Project information ----------------------------------------------------- project = 'Qiskit Aer' copyright = f"2017-{datetime.date.today().year}, Qiskit Development Team" # pylint: disable=redefined-builtin author = 'Qiskit Development Team' # The short X.Y version version = '0.15.0' # The full version, including alpha/beta/rc tags release = '0.15.0' templates_path = ['_templates'] # -- General configuration --------------------------------------------------- # If your documentation needs a minimal Sphinx version, state it here. # # needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ 'sphinx.ext.napoleon', 'sphinx.ext.autodoc', 'sphinx.ext.autosummary', 'sphinx.ext.mathjax', "sphinx.ext.linkcode", 'sphinx.ext.extlinks', 'jupyter_sphinx', 'reno.sphinxext', 'matplotlib.sphinxext.plot_directive', 'sphinx.ext.intersphinx', 'nbsphinx', "sphinx_design", 'qiskit_sphinx_theme', ] # ----------------------------------------------------------------------------- # Autosummary # ----------------------------------------------------------------------------- autosummary_generate = True # ----------------------------------------------------------------------------- # Autodoc # ----------------------------------------------------------------------------- autodoc_default_options = { 'inherited-members': None, } # If true, figures, tables and code-blocks are automatically numbered if they # have a caption. numfig = True # A dictionary mapping 'figure', 'table', 'code-block' and 'section' to # strings that are used for format of figure numbers. As a special character, # %s will be replaced to figure number. numfig_format = { 'table': 'Table %s' } # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. # # This is also used if you do content translation via gettext catalogs. # Usually you set "language" from the command line for these cases. language = "en" # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This pattern also affects html_static_path and html_extra_path. exclude_patterns = [] # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'colorful' # A boolean that decides whether module names are prepended to all object names # (for object types where a “module” of some kind is defined), e.g. for # py:function directives. add_module_names = False # A list of prefixes that are ignored for sorting the Python module index # (e.g., if this is set to ['foo.'], then foo.bar is shown under B, not F). # This can be handy if you document a project that consists of a single # package. Works only for the HTML builder currently. modindex_common_prefix = ['qiskit_aer.'] # -- Configuration for extlinks extension ------------------------------------ # Refer to https://www.sphinx-doc.org/en/master/usage/extensions/extlinks.html # -- Options for HTML output ------------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # html_theme = "qiskit-ecosystem" html_title = f"{project} {release}" html_last_updated_fmt = '%Y/%m/%d' autoclass_content = 'both' intersphinx_mapping = { "matplotlib": ("https://matplotlib.org/stable/", None), "qiskit": ("https://docs.quantum.ibm.com/api/qiskit/", None), } # ---------------------------------------------------------------------------------- # Source code links # ---------------------------------------------------------------------------------- def determine_github_branch() -> str: """Determine the GitHub branch name to use for source code links. We need to decide whether to use `stable/` vs. `main` for dev builds. Refer to https://docs.github.com/en/actions/learn-github-actions/variables for how we determine this with GitHub Actions. """ # If CI env vars not set, default to `main`. This is relevant for local builds. if "GITHUB_REF_NAME" not in os.environ: return "main" # PR workflows set the branch they're merging into. if base_ref := os.environ.get("GITHUB_BASE_REF"): return base_ref ref_name = os.environ["GITHUB_REF_NAME"] # Check if the ref_name is a tag like `1.0.0` or `1.0.0rc1`. If so, we need # to transform it to a Git branch like `stable/1.0`. version_without_patch = re.match(r"(\d+\.\d+)", ref_name) return ( f"stable/{version_without_patch.group()}" if version_without_patch else ref_name ) REPO_ROOT = Path(__file__).resolve().parents[1] GITHUB_BRANCH = determine_github_branch() def linkcode_resolve(domain, info): if domain != "py": return None module_name = info["module"] if "qiskit_aer" not in module_name: return None try: module = importlib.import_module(module_name) except ModuleNotFoundError: return None obj = module for part in info["fullname"].split("."): try: obj = getattr(obj, part) except AttributeError: return None try: full_file_name = inspect.getsourcefile(obj) except TypeError: return None if full_file_name is None: return None try: relative_file_name = Path(full_file_name).resolve().relative_to(REPO_ROOT) file_name = re.sub(r"\.tox\/.+\/site-packages\/", "", str(relative_file_name)) except ValueError: return None try: source, lineno = inspect.getsourcelines(obj) except (OSError, TypeError): linespec = "" else: ending_lineno = lineno + len(source) - 1 linespec = f"#L{lineno}-L{ending_lineno}" repo_name = "qiskit" if "qiskit/" in str(file_name) else "qiskit-aer" return f"https://github.com/Qiskit/{repo_name}/tree/{GITHUB_BRANCH}/{file_name}{linespec}"