# Configuration file for the Sphinx documentation builder. # # This file only contains 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 datetime import os import sys from pathlib import Path sys.path.append(str(Path(__file__).parent.parent)) sys.path.append(str(Path(__file__).parent.parent / "archivebox")) # -- Project information ----------------------------------------------------- project = "ArchiveBox" copyright = f"{datetime.date.today().year} ArchiveBox" author = "Nick Sweeting" github_url = "https://github.com/ArchiveBox/ArchiveBox" github_doc_root = "https://github.com/ArchiveBox/docs/tree/master/" # docs repo uses master branch github_view_style = "blob" language = "en" # The full version, including alpha/beta/rc tags release = (Path(__file__).parent.parent / "pyproject.toml").read_text().split("version = ", 1)[-1].split("\n", 1)[0].strip('"').strip("'") tag = release # 0.8.5 -> v0.8.5 if release[0].isdigit(): tag = f"v{release}" # .split('rc')[0] # Detect if this is a dev/pre-release build using PEP 440 parsing. # A version like "0.9.10" with no suffix is stable. # A version like "0.9.10rc1", "0.9.10.dev1", "0.9.10a1" is pre-release. # When you release 0.9.0 final (no suffix), it auto-becomes stable. try: from packaging.version import Version is_dev = Version(release).is_prerelease or Version(release).is_devrelease except Exception: # fallback if packaging is not installed is_dev = any(label in release for label in ("dev", "rc", "alpha", "beta")) # RTD "latest" always builds from the default branch = dev docs rtd_version = os.environ.get("READTHEDOCS_VERSION", "") if rtd_version in ("latest", "dev", "main", "master"): is_dev = True # -- General configuration --------------------------------------------------- # 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.autodoc", "sphinx.ext.napoleon", "sphinx.ext.linkcode", "sphinx.ext.autosummary", # 'sphinx.ext.graphviz', # 'sphinx.ext.inheritance_diagram' "myst_parser", # pip install myst-parser "autodoc2", "sphinxcontrib.mermaid", # pip install sphinxcontrib-mermaid # 'recommonmark', ] autodoc2_packages = [ { "path": "../archivebox", "module": "archivebox", "exclude_dirs": [ "__pycache__", "migrations", "vendor", "typings", "templates", "static", "tests", "tmp", ], "exclude_files": [ "tests.py", "conftest.py", "fixtures.py", ], }, ] autodoc2_output_dir = "apidocs" autodoc2_render_plugin = "myst" autodoc2_skip_module_regexes = [ r".*migrations.*", r".*vendor.*", r".*\.tests($|\..*)", r".*\.conftest$", r".*\.fixtures$", ] # autodoc2_hidden_objects = ['inherited', 'dunder'] autodoc2_hidden_regexes = [ r".*__package__", ] myst_enable_extensions = ["linkify"] # pip install linkify-it-py myst_fence_as_directive = ["mermaid"] # render ```mermaid blocks via sphinxcontrib-mermaid source_suffix = { ".rst": "restructuredtext", ".txt": "markdown", ".md": "markdown", } master_doc = "index" napoleon_google_docstring = True napoleon_use_param = True napoleon_use_ivar = False napoleon_use_rtype = True napoleon_include_special_with_doc = False # Add any paths that contain templates here, relative to this directory. templates_path = ["_templates"] # 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 = [ "_build", "**/Thumbs.db", "**/.DS_Store", "data*", "requirements.txt", "**/requirements.txt", "**/tests/**", "**/templates/**", "**/migrations/**", "_Sidebar.md", "_Footer.md", ] suppress_warnings = [ "myst.header", # non-consecutive header levels (common in wiki markdown) "myst.xref_missing", # cross-reference targets from wiki-style links "myst.xref_ambiguous", # ambiguous cross-references across modules "autodoc2.dup_item", # duplicate items from Django model inheritance ] # -- Options for HTML output ------------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # html_logo = "logo.png" html_theme = "sphinx_rtd_theme" html_theme_options = { "navigation_depth": 5, "collapse_navigation": False, "sticky_navigation": True, "version_selector": True, "language_selector": False, "style_external_links": True, } html_context = { "display_github": True, "github_user": "ArchiveBox", "github_repo": "docs", "github_version": "master", # docs repo uses master branch "conf_py_path": "/", # RTD injects these automatically when building on RTD: # current_version, versions, downloads, READTHEDOCS, etc. # For local/non-RTD builds, set version info explicitly: "current_version": f"{release} (dev)" if is_dev else release, } html_show_sphinx = False # Display the version prominently so users know which docs they're reading version = release # short X.Y version shown in sidebar # release is already set above # full version with alpha/beta/rc tags texinfo_documents = [ ( master_doc, "archivebox", "archivebox Documentation", author, "archivebox", "The open-source self-hosted internet archive.", "Miscellaneous", ), ] autodoc_default_flags = ["members"] autodoc_member_order = "bysource" autosummary_generate = True pygments_style = "sphinx" # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ["_static"] man_pages = [ (master_doc, "archivebox", "archivebox Documentation", [author], 1), ] def linkcode_resolve(domain, info): """ Calculate link to source code on Github Docs: https://www.sphinx-doc.org/en/master/usage/extensions/linkcode.html """ module_name = str(info["module"] or "") package_name = module_name.split(".", 1)[0] # archivebox submodule_name = module_name.split(f"{package_name}", 1)[-1].strip(".") # core.models symbol_name = str(info["fullname"] or "") # Crawl.abid_ts_src full_name = f"{package_name}.{submodule_name}.{symbol_name}".replace("..", ".") # archivebox.core.models.Crawl.abid_ts_src fallback_url = f"https://github.com/search?type=code&q=repo%3AArchiveBox%2FArchiveBox%20{full_name.replace('.', '%20')}" # 'archivebox.core.models.Crawl' -> archivebox/core/models.py file_path = f"{package_name}/{submodule_name.replace('.', '/')}.py" # archivebox/core/models.py # correct for any extra / or .py file_path = file_path.strip("/").strip(".py") + ".py" # fallback to using Github search instead if URL doesn't look like a valid file path if not file_path.startswith("archivebox/"): return fallback_url if "//" in file_path: return fallback_url if file_path.count(".py") > 1: return fallback_url # correct for archivebox/cli.py -> archivebox/cli/__init__.py init_path = f"{package_name}/{submodule_name.replace('.', '/')}/__init__.py" if not Path(f"../{file_path}").is_file(): if Path(f"../{init_path}").is_file(): file_path = init_path else: return fallback_url # https://github.com/ArchiveBox/ArchiveBox/blob/v0.8.5/archivebox/core/models.py#archivebox.core.models.Crawl.abid_ts_src#:~:text=abid_ts_src return f"{github_url}/{github_view_style}/{tag}/{file_path}#{full_name}#:~:text={symbol_name.rsplit('.', 1)[-1]}"