Read the Docs build information Build id: 3879928 Project: icb-scanpy-tutorials Version: 227 Commit: b549212c4de641d148080ec6e452241231de261d Date: 2026-03-30T17:44:46.698103Z State: finished Success: False [rtd-command-info] start-time: 2026-03-30T17:44:47.448253Z, end-time: 2026-03-30T17:44:54.628745Z, duration: 7, exit-code: 0 git clone --depth 1 https://github.com/scverse/scanpy-tutorials.git . Cloning into '.'... [rtd-command-info] start-time: 2026-03-30T17:44:54.720875Z, end-time: 2026-03-30T17:45:00.313249Z, duration: 5, exit-code: 0 git fetch origin --force --prune --prune-tags --depth 50 pull/227/head:external-227 From https://github.com/scverse/scanpy-tutorials * [new ref] refs/pull/227/head -> external-227 [rtd-command-info] start-time: 2026-03-30T17:45:01.195208Z, end-time: 2026-03-30T17:45:01.643436Z, duration: 0, exit-code: 0 git checkout --force b549212c4de641d148080ec6e452241231de261d Note: switching to 'b549212c4de641d148080ec6e452241231de261d'. You are in 'detached HEAD' state. You can look around, make experimental changes and commit them, and you can discard any commits you make in this state without impacting any branches by switching back to a branch. If you want to create a new branch to retain commits you create, you may do so (now or later) by using -c with the switch command. Example: git switch -c Or undo this operation with: git switch - Turn off this advice by setting config variable advice.detachedHead to false HEAD is now at b549212 [pre-commit.ci] pre-commit autoupdate [rtd-command-info] start-time: 2026-03-30T17:45:01.754471Z, end-time: 2026-03-30T17:45:01.792375Z, duration: 0, exit-code: 0 cat .readthedocs.yml version: 2 build: os: ubuntu-24.04 tools: python: "3.13" sphinx: configuration: conf.py fail_on_warning: true python: install: - method: pip path: . [rtd-command-info] start-time: 2026-03-30T17:45:08.160522Z, end-time: 2026-03-30T17:45:08.275280Z, duration: 0, exit-code: 0 asdf global python 3.13.3 [rtd-command-info] start-time: 2026-03-30T17:45:08.718720Z, end-time: 2026-03-30T17:45:09.541992Z, duration: 0, exit-code: 0 python -mvirtualenv $READTHEDOCS_VIRTUALENV_PATH created virtual environment CPython3.13.3.final.0-64 in 407ms creator CPython3Posix(dest=/home/docs/checkouts/readthedocs.org/user_builds/icb-scanpy-tutorials/envs/227, clear=False, no_vcs_ignore=False, global=False) seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/home/docs/.local/share/virtualenv) added seed packages: pip==23.1, setuptools==67.6.1, wheel==0.40.0 activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator [rtd-command-info] start-time: 2026-03-30T17:45:09.624376Z, end-time: 2026-03-30T17:45:15.450662Z, duration: 5, exit-code: 0 python -m pip install --upgrade --no-cache-dir pip setuptools Requirement already satisfied: pip in /home/docs/checkouts/readthedocs.org/user_builds/icb-scanpy-tutorials/envs/227/lib/python3.13/site-packages (23.1) Collecting pip Downloading pip-26.0.1-py3-none-any.whl (1.8 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.8/1.8 MB 22.0 MB/s eta 0:00:00 Requirement already satisfied: setuptools in /home/docs/checkouts/readthedocs.org/user_builds/icb-scanpy-tutorials/envs/227/lib/python3.13/site-packages (67.6.1) Collecting setuptools Downloading setuptools-82.0.1-py3-none-any.whl (1.0 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.0/1.0 MB 95.0 MB/s eta 0:00:00 Installing collected packages: setuptools, pip Attempting uninstall: setuptools Found existing installation: setuptools 67.6.1 Uninstalling setuptools-67.6.1: Successfully uninstalled setuptools-67.6.1 Attempting uninstall: pip Found existing installation: pip 23.1 Uninstalling pip-23.1: Successfully uninstalled pip-23.1 Successfully installed pip-26.0.1 setuptools-82.0.1 [rtd-command-info] start-time: 2026-03-30T17:45:15.536087Z, end-time: 2026-03-30T17:45:21.065112Z, duration: 5, exit-code: 0 python -m pip install --upgrade --no-cache-dir sphinx Collecting sphinx Downloading sphinx-9.1.0-py3-none-any.whl.metadata (5.8 kB) Collecting sphinxcontrib-applehelp>=1.0.7 (from sphinx) Downloading sphinxcontrib_applehelp-2.0.0-py3-none-any.whl.metadata (2.3 kB) Collecting sphinxcontrib-devhelp>=1.0.6 (from sphinx) Downloading sphinxcontrib_devhelp-2.0.0-py3-none-any.whl.metadata (2.3 kB) Collecting sphinxcontrib-htmlhelp>=2.0.6 (from sphinx) Downloading sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl.metadata (2.3 kB) Collecting sphinxcontrib-jsmath>=1.0.1 (from sphinx) Downloading sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl.metadata (1.4 kB) Collecting sphinxcontrib-qthelp>=1.0.6 (from sphinx) Downloading sphinxcontrib_qthelp-2.0.0-py3-none-any.whl.metadata (2.3 kB) Collecting sphinxcontrib-serializinghtml>=1.1.9 (from sphinx) Downloading sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl.metadata (2.4 kB) Collecting Jinja2>=3.1 (from sphinx) Downloading jinja2-3.1.6-py3-none-any.whl.metadata (2.9 kB) Collecting Pygments>=2.17 (from sphinx) Downloading pygments-2.20.0-py3-none-any.whl.metadata (2.5 kB) Collecting docutils<0.23,>=0.21 (from sphinx) Downloading docutils-0.22.4-py3-none-any.whl.metadata (15 kB) Collecting snowballstemmer>=2.2 (from sphinx) Downloading snowballstemmer-3.0.1-py3-none-any.whl.metadata (7.9 kB) Collecting babel>=2.13 (from sphinx) Downloading babel-2.18.0-py3-none-any.whl.metadata (2.2 kB) Collecting alabaster>=0.7.14 (from sphinx) Downloading alabaster-1.0.0-py3-none-any.whl.metadata (2.8 kB) Collecting imagesize>=1.3 (from sphinx) Downloading imagesize-2.0.0-py2.py3-none-any.whl.metadata (1.5 kB) Collecting requests>=2.30.0 (from sphinx) Downloading requests-2.33.1-py3-none-any.whl.metadata (4.8 kB) Collecting roman-numerals>=1.0.0 (from sphinx) Downloading roman_numerals-4.1.0-py3-none-any.whl.metadata (3.3 kB) Collecting packaging>=23.0 (from sphinx) Downloading packaging-26.0-py3-none-any.whl.metadata (3.3 kB) Collecting MarkupSafe>=2.0 (from Jinja2>=3.1->sphinx) Downloading markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.metadata (2.7 kB) Collecting charset_normalizer<4,>=2 (from requests>=2.30.0->sphinx) Downloading charset_normalizer-3.4.6-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.metadata (40 kB) Collecting idna<4,>=2.5 (from requests>=2.30.0->sphinx) Downloading idna-3.11-py3-none-any.whl.metadata (8.4 kB) Collecting urllib3<3,>=1.26 (from requests>=2.30.0->sphinx) Downloading urllib3-2.6.3-py3-none-any.whl.metadata (6.9 kB) Collecting certifi>=2023.5.7 (from requests>=2.30.0->sphinx) Downloading certifi-2026.2.25-py3-none-any.whl.metadata (2.5 kB) Downloading sphinx-9.1.0-py3-none-any.whl (3.9 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.9/3.9 MB 59.8 MB/s 0:00:00 Downloading docutils-0.22.4-py3-none-any.whl (633 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 633.2/633.2 kB 809.5 MB/s 0:00:00 Downloading alabaster-1.0.0-py3-none-any.whl (13 kB) Downloading babel-2.18.0-py3-none-any.whl (10.2 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 10.2/10.2 MB 289.7 MB/s 0:00:00 Downloading imagesize-2.0.0-py2.py3-none-any.whl (9.4 kB) Downloading jinja2-3.1.6-py3-none-any.whl (134 kB) Downloading markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (22 kB) Downloading packaging-26.0-py3-none-any.whl (74 kB) Downloading pygments-2.20.0-py3-none-any.whl (1.2 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.2/1.2 MB 892.5 MB/s 0:00:00 Downloading requests-2.33.1-py3-none-any.whl (64 kB) Downloading charset_normalizer-3.4.6-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (206 kB) Downloading idna-3.11-py3-none-any.whl (71 kB) Downloading urllib3-2.6.3-py3-none-any.whl (131 kB) Downloading certifi-2026.2.25-py3-none-any.whl (153 kB) Downloading roman_numerals-4.1.0-py3-none-any.whl (7.7 kB) Downloading snowballstemmer-3.0.1-py3-none-any.whl (103 kB) Downloading sphinxcontrib_applehelp-2.0.0-py3-none-any.whl (119 kB) Downloading sphinxcontrib_devhelp-2.0.0-py3-none-any.whl (82 kB) Downloading sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl (98 kB) Downloading sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl (5.1 kB) Downloading sphinxcontrib_qthelp-2.0.0-py3-none-any.whl (88 kB) Downloading sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl (92 kB) Installing collected packages: urllib3, sphinxcontrib-serializinghtml, sphinxcontrib-qthelp, sphinxcontrib-jsmath, sphinxcontrib-htmlhelp, sphinxcontrib-devhelp, sphinxcontrib-applehelp, snowballstemmer, roman-numerals, Pygments, packaging, MarkupSafe, imagesize, idna, docutils, charset_normalizer, certifi, babel, alabaster, requests, Jinja2, sphinx Successfully installed Jinja2-3.1.6 MarkupSafe-3.0.3 Pygments-2.20.0 alabaster-1.0.0 babel-2.18.0 certifi-2026.2.25 charset_normalizer-3.4.6 docutils-0.22.4 idna-3.11 imagesize-2.0.0 packaging-26.0 requests-2.33.1 roman-numerals-4.1.0 snowballstemmer-3.0.1 sphinx-9.1.0 sphinxcontrib-applehelp-2.0.0 sphinxcontrib-devhelp-2.0.0 sphinxcontrib-htmlhelp-2.1.0 sphinxcontrib-jsmath-1.0.1 sphinxcontrib-qthelp-2.0.0 sphinxcontrib-serializinghtml-2.0.0 urllib3-2.6.3 [rtd-command-info] start-time: 2026-03-30T17:45:21.156370Z, end-time: 2026-03-30T17:45:34.754239Z, duration: 13, exit-code: 0 python -m pip install --upgrade --upgrade-strategy only-if-needed --no-cache-dir . Processing ./. Installing build dependencies: started Installing build dependencies: finished with status 'done' Getting requirements to build wheel: started Getting requirements to build wheel: finished with status 'done' Preparing metadata (pyproject.toml): started Preparing metadata (pyproject.toml): finished with status 'done' Collecting myst-nb (from scanpy-tutorials==0.1.dev50+gb549212c4) Downloading myst_nb-1.4.0-py3-none-any.whl.metadata (4.8 kB) Collecting scanpydoc>=0.13.4 (from scanpydoc[theme]>=0.13.4->scanpy-tutorials==0.1.dev50+gb549212c4) Downloading scanpydoc-0.17.3-py3-none-any.whl.metadata (2.6 kB) Requirement already satisfied: sphinx in /home/docs/checkouts/readthedocs.org/user_builds/icb-scanpy-tutorials/envs/227/lib/python3.13/site-packages (from scanpy-tutorials==0.1.dev50+gb549212c4) (9.1.0) Collecting sphinx-design (from scanpy-tutorials==0.1.dev50+gb549212c4) Downloading sphinx_design-0.7.0-py3-none-any.whl.metadata (5.5 kB) Collecting sphinx-book-theme>=1.1.0 (from scanpydoc[theme]>=0.13.4->scanpy-tutorials==0.1.dev50+gb549212c4) Downloading sphinx_book_theme-1.2.0-py3-none-any.whl.metadata (4.4 kB) Requirement already satisfied: sphinxcontrib-applehelp>=1.0.7 in /home/docs/checkouts/readthedocs.org/user_builds/icb-scanpy-tutorials/envs/227/lib/python3.13/site-packages (from sphinx->scanpy-tutorials==0.1.dev50+gb549212c4) (2.0.0) Requirement already satisfied: sphinxcontrib-devhelp>=1.0.6 in /home/docs/checkouts/readthedocs.org/user_builds/icb-scanpy-tutorials/envs/227/lib/python3.13/site-packages (from sphinx->scanpy-tutorials==0.1.dev50+gb549212c4) (2.0.0) Requirement already satisfied: sphinxcontrib-htmlhelp>=2.0.6 in /home/docs/checkouts/readthedocs.org/user_builds/icb-scanpy-tutorials/envs/227/lib/python3.13/site-packages (from sphinx->scanpy-tutorials==0.1.dev50+gb549212c4) (2.1.0) Requirement already satisfied: sphinxcontrib-jsmath>=1.0.1 in /home/docs/checkouts/readthedocs.org/user_builds/icb-scanpy-tutorials/envs/227/lib/python3.13/site-packages (from sphinx->scanpy-tutorials==0.1.dev50+gb549212c4) (1.0.1) Requirement already satisfied: sphinxcontrib-qthelp>=1.0.6 in /home/docs/checkouts/readthedocs.org/user_builds/icb-scanpy-tutorials/envs/227/lib/python3.13/site-packages (from sphinx->scanpy-tutorials==0.1.dev50+gb549212c4) (2.0.0) Requirement already satisfied: sphinxcontrib-serializinghtml>=1.1.9 in /home/docs/checkouts/readthedocs.org/user_builds/icb-scanpy-tutorials/envs/227/lib/python3.13/site-packages (from sphinx->scanpy-tutorials==0.1.dev50+gb549212c4) (2.0.0) Requirement already satisfied: Jinja2>=3.1 in /home/docs/checkouts/readthedocs.org/user_builds/icb-scanpy-tutorials/envs/227/lib/python3.13/site-packages (from sphinx->scanpy-tutorials==0.1.dev50+gb549212c4) (3.1.6) Requirement already satisfied: Pygments>=2.17 in /home/docs/checkouts/readthedocs.org/user_builds/icb-scanpy-tutorials/envs/227/lib/python3.13/site-packages (from sphinx->scanpy-tutorials==0.1.dev50+gb549212c4) (2.20.0) Requirement already satisfied: docutils<0.23,>=0.21 in /home/docs/checkouts/readthedocs.org/user_builds/icb-scanpy-tutorials/envs/227/lib/python3.13/site-packages (from sphinx->scanpy-tutorials==0.1.dev50+gb549212c4) (0.22.4) Requirement already satisfied: snowballstemmer>=2.2 in /home/docs/checkouts/readthedocs.org/user_builds/icb-scanpy-tutorials/envs/227/lib/python3.13/site-packages (from sphinx->scanpy-tutorials==0.1.dev50+gb549212c4) (3.0.1) Requirement already satisfied: babel>=2.13 in /home/docs/checkouts/readthedocs.org/user_builds/icb-scanpy-tutorials/envs/227/lib/python3.13/site-packages (from sphinx->scanpy-tutorials==0.1.dev50+gb549212c4) (2.18.0) Requirement already satisfied: alabaster>=0.7.14 in /home/docs/checkouts/readthedocs.org/user_builds/icb-scanpy-tutorials/envs/227/lib/python3.13/site-packages (from sphinx->scanpy-tutorials==0.1.dev50+gb549212c4) (1.0.0) Requirement already satisfied: imagesize>=1.3 in /home/docs/checkouts/readthedocs.org/user_builds/icb-scanpy-tutorials/envs/227/lib/python3.13/site-packages (from sphinx->scanpy-tutorials==0.1.dev50+gb549212c4) (2.0.0) Requirement already satisfied: requests>=2.30.0 in /home/docs/checkouts/readthedocs.org/user_builds/icb-scanpy-tutorials/envs/227/lib/python3.13/site-packages (from sphinx->scanpy-tutorials==0.1.dev50+gb549212c4) (2.33.1) Requirement already satisfied: roman-numerals>=1.0.0 in /home/docs/checkouts/readthedocs.org/user_builds/icb-scanpy-tutorials/envs/227/lib/python3.13/site-packages (from sphinx->scanpy-tutorials==0.1.dev50+gb549212c4) (4.1.0) Requirement already satisfied: packaging>=23.0 in /home/docs/checkouts/readthedocs.org/user_builds/icb-scanpy-tutorials/envs/227/lib/python3.13/site-packages (from sphinx->scanpy-tutorials==0.1.dev50+gb549212c4) (26.0) Requirement already satisfied: MarkupSafe>=2.0 in /home/docs/checkouts/readthedocs.org/user_builds/icb-scanpy-tutorials/envs/227/lib/python3.13/site-packages (from Jinja2>=3.1->sphinx->scanpy-tutorials==0.1.dev50+gb549212c4) (3.0.3) Requirement already satisfied: charset_normalizer<4,>=2 in /home/docs/checkouts/readthedocs.org/user_builds/icb-scanpy-tutorials/envs/227/lib/python3.13/site-packages (from requests>=2.30.0->sphinx->scanpy-tutorials==0.1.dev50+gb549212c4) (3.4.6) Requirement already satisfied: idna<4,>=2.5 in /home/docs/checkouts/readthedocs.org/user_builds/icb-scanpy-tutorials/envs/227/lib/python3.13/site-packages (from requests>=2.30.0->sphinx->scanpy-tutorials==0.1.dev50+gb549212c4) (3.11) Requirement already satisfied: urllib3<3,>=1.26 in /home/docs/checkouts/readthedocs.org/user_builds/icb-scanpy-tutorials/envs/227/lib/python3.13/site-packages (from requests>=2.30.0->sphinx->scanpy-tutorials==0.1.dev50+gb549212c4) (2.6.3) Requirement already satisfied: certifi>=2023.5.7 in /home/docs/checkouts/readthedocs.org/user_builds/icb-scanpy-tutorials/envs/227/lib/python3.13/site-packages (from requests>=2.30.0->sphinx->scanpy-tutorials==0.1.dev50+gb549212c4) (2026.2.25) Collecting pydata-sphinx-theme==0.16.1 (from sphinx-book-theme>=1.1.0->scanpydoc[theme]>=0.13.4->scanpy-tutorials==0.1.dev50+gb549212c4) Downloading pydata_sphinx_theme-0.16.1-py3-none-any.whl.metadata (7.5 kB) Collecting beautifulsoup4 (from pydata-sphinx-theme==0.16.1->sphinx-book-theme>=1.1.0->scanpydoc[theme]>=0.13.4->scanpy-tutorials==0.1.dev50+gb549212c4) Downloading beautifulsoup4-4.14.3-py3-none-any.whl.metadata (3.8 kB) Collecting accessible-pygments (from pydata-sphinx-theme==0.16.1->sphinx-book-theme>=1.1.0->scanpydoc[theme]>=0.13.4->scanpy-tutorials==0.1.dev50+gb549212c4) Downloading accessible_pygments-0.0.5-py3-none-any.whl.metadata (10 kB) Collecting typing-extensions (from pydata-sphinx-theme==0.16.1->sphinx-book-theme>=1.1.0->scanpydoc[theme]>=0.13.4->scanpy-tutorials==0.1.dev50+gb549212c4) Downloading typing_extensions-4.15.0-py3-none-any.whl.metadata (3.3 kB) Collecting soupsieve>=1.6.1 (from beautifulsoup4->pydata-sphinx-theme==0.16.1->sphinx-book-theme>=1.1.0->scanpydoc[theme]>=0.13.4->scanpy-tutorials==0.1.dev50+gb549212c4) Downloading soupsieve-2.8.3-py3-none-any.whl.metadata (4.6 kB) Collecting importlib_metadata (from myst-nb->scanpy-tutorials==0.1.dev50+gb549212c4) Downloading importlib_metadata-9.0.0-py3-none-any.whl.metadata (4.5 kB) Collecting ipython (from myst-nb->scanpy-tutorials==0.1.dev50+gb549212c4) Downloading ipython-9.12.0-py3-none-any.whl.metadata (4.5 kB) Collecting jupyter-cache>=0.5 (from myst-nb->scanpy-tutorials==0.1.dev50+gb549212c4) Downloading jupyter_cache-1.0.1-py3-none-any.whl.metadata (5.8 kB) Collecting nbclient (from myst-nb->scanpy-tutorials==0.1.dev50+gb549212c4) Downloading nbclient-0.10.4-py3-none-any.whl.metadata (8.3 kB) Collecting myst-parser>=1.0.0 (from myst-nb->scanpy-tutorials==0.1.dev50+gb549212c4) Downloading myst_parser-5.0.0-py3-none-any.whl.metadata (5.6 kB) Collecting nbformat>=5.0 (from myst-nb->scanpy-tutorials==0.1.dev50+gb549212c4) Downloading nbformat-5.10.4-py3-none-any.whl.metadata (3.6 kB) Collecting pyyaml (from myst-nb->scanpy-tutorials==0.1.dev50+gb549212c4) Downloading pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.metadata (2.4 kB) Collecting ipykernel (from myst-nb->scanpy-tutorials==0.1.dev50+gb549212c4) Downloading ipykernel-7.2.0-py3-none-any.whl.metadata (4.5 kB) Collecting attrs (from jupyter-cache>=0.5->myst-nb->scanpy-tutorials==0.1.dev50+gb549212c4) Downloading attrs-26.1.0-py3-none-any.whl.metadata (8.8 kB) Collecting click (from jupyter-cache>=0.5->myst-nb->scanpy-tutorials==0.1.dev50+gb549212c4) Downloading click-8.3.1-py3-none-any.whl.metadata (2.6 kB) Collecting sqlalchemy<3,>=1.3.12 (from jupyter-cache>=0.5->myst-nb->scanpy-tutorials==0.1.dev50+gb549212c4) Downloading sqlalchemy-2.0.48-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.metadata (9.5 kB) Collecting tabulate (from jupyter-cache>=0.5->myst-nb->scanpy-tutorials==0.1.dev50+gb549212c4) Downloading tabulate-0.10.0-py3-none-any.whl.metadata (40 kB) Collecting greenlet>=1 (from sqlalchemy<3,>=1.3.12->jupyter-cache>=0.5->myst-nb->scanpy-tutorials==0.1.dev50+gb549212c4) Downloading greenlet-3.3.2-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.metadata (3.7 kB) Collecting markdown-it-py~=4.0 (from myst-parser>=1.0.0->myst-nb->scanpy-tutorials==0.1.dev50+gb549212c4) Downloading markdown_it_py-4.0.0-py3-none-any.whl.metadata (7.3 kB) Collecting mdit-py-plugins~=0.5 (from myst-parser>=1.0.0->myst-nb->scanpy-tutorials==0.1.dev50+gb549212c4) Downloading mdit_py_plugins-0.5.0-py3-none-any.whl.metadata (2.8 kB) Collecting mdurl~=0.1 (from markdown-it-py~=4.0->myst-parser>=1.0.0->myst-nb->scanpy-tutorials==0.1.dev50+gb549212c4) Downloading mdurl-0.1.2-py3-none-any.whl.metadata (1.6 kB) Collecting jupyter-client>=6.1.12 (from nbclient->myst-nb->scanpy-tutorials==0.1.dev50+gb549212c4) Downloading jupyter_client-8.8.0-py3-none-any.whl.metadata (8.4 kB) Collecting jupyter-core!=5.0.*,>=4.12 (from nbclient->myst-nb->scanpy-tutorials==0.1.dev50+gb549212c4) Downloading jupyter_core-5.9.1-py3-none-any.whl.metadata (1.5 kB) Collecting traitlets>=5.4 (from nbclient->myst-nb->scanpy-tutorials==0.1.dev50+gb549212c4) Downloading traitlets-5.14.3-py3-none-any.whl.metadata (10 kB) Collecting python-dateutil>=2.8.2 (from jupyter-client>=6.1.12->nbclient->myst-nb->scanpy-tutorials==0.1.dev50+gb549212c4) Downloading python_dateutil-2.9.0.post0-py2.py3-none-any.whl.metadata (8.4 kB) Collecting pyzmq>=25.0 (from jupyter-client>=6.1.12->nbclient->myst-nb->scanpy-tutorials==0.1.dev50+gb549212c4) Downloading pyzmq-27.1.0-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl.metadata (6.0 kB) Collecting tornado>=6.4.1 (from jupyter-client>=6.1.12->nbclient->myst-nb->scanpy-tutorials==0.1.dev50+gb549212c4) Downloading tornado-6.5.5-cp39-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl.metadata (2.8 kB) Collecting platformdirs>=2.5 (from jupyter-core!=5.0.*,>=4.12->nbclient->myst-nb->scanpy-tutorials==0.1.dev50+gb549212c4) Downloading platformdirs-4.9.4-py3-none-any.whl.metadata (4.7 kB) Collecting fastjsonschema>=2.15 (from nbformat>=5.0->myst-nb->scanpy-tutorials==0.1.dev50+gb549212c4) Downloading fastjsonschema-2.21.2-py3-none-any.whl.metadata (2.3 kB) Collecting jsonschema>=2.6 (from nbformat>=5.0->myst-nb->scanpy-tutorials==0.1.dev50+gb549212c4) Downloading jsonschema-4.26.0-py3-none-any.whl.metadata (7.6 kB) Collecting jsonschema-specifications>=2023.03.6 (from jsonschema>=2.6->nbformat>=5.0->myst-nb->scanpy-tutorials==0.1.dev50+gb549212c4) Downloading jsonschema_specifications-2025.9.1-py3-none-any.whl.metadata (2.9 kB) Collecting referencing>=0.28.4 (from jsonschema>=2.6->nbformat>=5.0->myst-nb->scanpy-tutorials==0.1.dev50+gb549212c4) Downloading referencing-0.37.0-py3-none-any.whl.metadata (2.8 kB) Collecting rpds-py>=0.25.0 (from jsonschema>=2.6->nbformat>=5.0->myst-nb->scanpy-tutorials==0.1.dev50+gb549212c4) Downloading rpds_py-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (4.1 kB) Collecting six>=1.5 (from python-dateutil>=2.8.2->jupyter-client>=6.1.12->nbclient->myst-nb->scanpy-tutorials==0.1.dev50+gb549212c4) Downloading six-1.17.0-py2.py3-none-any.whl.metadata (1.7 kB) Collecting zipp>=3.20 (from importlib_metadata->myst-nb->scanpy-tutorials==0.1.dev50+gb549212c4) Downloading zipp-3.23.0-py3-none-any.whl.metadata (3.6 kB) Collecting comm>=0.1.1 (from ipykernel->myst-nb->scanpy-tutorials==0.1.dev50+gb549212c4) Downloading comm-0.2.3-py3-none-any.whl.metadata (3.7 kB) Collecting debugpy>=1.6.5 (from ipykernel->myst-nb->scanpy-tutorials==0.1.dev50+gb549212c4) Downloading debugpy-1.8.20-cp313-cp313-manylinux_2_34_x86_64.whl.metadata (1.4 kB) Collecting matplotlib-inline>=0.1 (from ipykernel->myst-nb->scanpy-tutorials==0.1.dev50+gb549212c4) Downloading matplotlib_inline-0.2.1-py3-none-any.whl.metadata (2.3 kB) Collecting nest-asyncio>=1.4 (from ipykernel->myst-nb->scanpy-tutorials==0.1.dev50+gb549212c4) Downloading nest_asyncio-1.6.0-py3-none-any.whl.metadata (2.8 kB) Collecting psutil>=5.7 (from ipykernel->myst-nb->scanpy-tutorials==0.1.dev50+gb549212c4) Downloading psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl.metadata (22 kB) Collecting decorator>=5.1.0 (from ipython->myst-nb->scanpy-tutorials==0.1.dev50+gb549212c4) Downloading decorator-5.2.1-py3-none-any.whl.metadata (3.9 kB) Collecting ipython-pygments-lexers>=1.0.0 (from ipython->myst-nb->scanpy-tutorials==0.1.dev50+gb549212c4) Downloading ipython_pygments_lexers-1.1.1-py3-none-any.whl.metadata (1.1 kB) Collecting jedi>=0.18.2 (from ipython->myst-nb->scanpy-tutorials==0.1.dev50+gb549212c4) Downloading jedi-0.19.2-py2.py3-none-any.whl.metadata (22 kB) Collecting pexpect>4.6 (from ipython->myst-nb->scanpy-tutorials==0.1.dev50+gb549212c4) Downloading pexpect-4.9.0-py2.py3-none-any.whl.metadata (2.5 kB) Collecting prompt_toolkit<3.1.0,>=3.0.41 (from ipython->myst-nb->scanpy-tutorials==0.1.dev50+gb549212c4) Downloading prompt_toolkit-3.0.52-py3-none-any.whl.metadata (6.4 kB) Collecting stack_data>=0.6.0 (from ipython->myst-nb->scanpy-tutorials==0.1.dev50+gb549212c4) Downloading stack_data-0.6.3-py3-none-any.whl.metadata (18 kB) Collecting wcwidth (from prompt_toolkit<3.1.0,>=3.0.41->ipython->myst-nb->scanpy-tutorials==0.1.dev50+gb549212c4) Downloading wcwidth-0.6.0-py3-none-any.whl.metadata (30 kB) Collecting parso<0.9.0,>=0.8.4 (from jedi>=0.18.2->ipython->myst-nb->scanpy-tutorials==0.1.dev50+gb549212c4) Downloading parso-0.8.6-py2.py3-none-any.whl.metadata (8.4 kB) Collecting ptyprocess>=0.5 (from pexpect>4.6->ipython->myst-nb->scanpy-tutorials==0.1.dev50+gb549212c4) Downloading ptyprocess-0.7.0-py2.py3-none-any.whl.metadata (1.3 kB) Collecting executing>=1.2.0 (from stack_data>=0.6.0->ipython->myst-nb->scanpy-tutorials==0.1.dev50+gb549212c4) Downloading executing-2.2.1-py2.py3-none-any.whl.metadata (8.9 kB) Collecting asttokens>=2.1.0 (from stack_data>=0.6.0->ipython->myst-nb->scanpy-tutorials==0.1.dev50+gb549212c4) Downloading asttokens-3.0.1-py3-none-any.whl.metadata (4.9 kB) Collecting pure-eval (from stack_data>=0.6.0->ipython->myst-nb->scanpy-tutorials==0.1.dev50+gb549212c4) Downloading pure_eval-0.2.3-py3-none-any.whl.metadata (6.3 kB) Downloading scanpydoc-0.17.3-py3-none-any.whl (37 kB) Downloading sphinx_book_theme-1.2.0-py3-none-any.whl (455 kB) Downloading pydata_sphinx_theme-0.16.1-py3-none-any.whl (6.7 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 6.7/6.7 MB 124.1 MB/s 0:00:00 Downloading accessible_pygments-0.0.5-py3-none-any.whl (1.4 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.4/1.4 MB 255.2 MB/s 0:00:00 Downloading beautifulsoup4-4.14.3-py3-none-any.whl (107 kB) Downloading soupsieve-2.8.3-py3-none-any.whl (37 kB) Downloading typing_extensions-4.15.0-py3-none-any.whl (44 kB) Downloading myst_nb-1.4.0-py3-none-any.whl (82 kB) Downloading jupyter_cache-1.0.1-py3-none-any.whl (33 kB) Downloading sqlalchemy-2.0.48-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (3.3 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.3/3.3 MB 284.1 MB/s 0:00:00 Downloading greenlet-3.3.2-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (616 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 616.8/616.8 kB 539.1 MB/s 0:00:00 Downloading myst_parser-5.0.0-py3-none-any.whl (84 kB) Downloading markdown_it_py-4.0.0-py3-none-any.whl (87 kB) Downloading mdit_py_plugins-0.5.0-py3-none-any.whl (57 kB) Downloading mdurl-0.1.2-py3-none-any.whl (10.0 kB) Downloading nbclient-0.10.4-py3-none-any.whl (25 kB) Downloading jupyter_client-8.8.0-py3-none-any.whl (107 kB) Downloading jupyter_core-5.9.1-py3-none-any.whl (29 kB) Downloading nbformat-5.10.4-py3-none-any.whl (78 kB) Downloading fastjsonschema-2.21.2-py3-none-any.whl (24 kB) Downloading jsonschema-4.26.0-py3-none-any.whl (90 kB) Downloading attrs-26.1.0-py3-none-any.whl (67 kB) Downloading jsonschema_specifications-2025.9.1-py3-none-any.whl (18 kB) Downloading platformdirs-4.9.4-py3-none-any.whl (21 kB) Downloading python_dateutil-2.9.0.post0-py2.py3-none-any.whl (229 kB) Downloading pyzmq-27.1.0-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl (840 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 841.0/841.0 kB 775.9 MB/s 0:00:00 Downloading referencing-0.37.0-py3-none-any.whl (26 kB) Downloading rpds_py-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (394 kB) Downloading six-1.17.0-py2.py3-none-any.whl (11 kB) Downloading tornado-6.5.5-cp39-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl (447 kB) Downloading traitlets-5.14.3-py3-none-any.whl (85 kB) Downloading click-8.3.1-py3-none-any.whl (108 kB) Downloading importlib_metadata-9.0.0-py3-none-any.whl (27 kB) Downloading zipp-3.23.0-py3-none-any.whl (10 kB) Downloading ipykernel-7.2.0-py3-none-any.whl (118 kB) Downloading comm-0.2.3-py3-none-any.whl (7.3 kB) Downloading debugpy-1.8.20-cp313-cp313-manylinux_2_34_x86_64.whl (4.3 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 4.3/4.3 MB 172.8 MB/s 0:00:00 Downloading ipython-9.12.0-py3-none-any.whl (625 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 625.7/625.7 kB 185.3 MB/s 0:00:00 Downloading prompt_toolkit-3.0.52-py3-none-any.whl (391 kB) Downloading decorator-5.2.1-py3-none-any.whl (9.2 kB) Downloading ipython_pygments_lexers-1.1.1-py3-none-any.whl (8.1 kB) Downloading jedi-0.19.2-py2.py3-none-any.whl (1.6 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.6/1.6 MB 414.3 MB/s 0:00:00 Downloading parso-0.8.6-py2.py3-none-any.whl (106 kB) Downloading matplotlib_inline-0.2.1-py3-none-any.whl (9.5 kB) Downloading nest_asyncio-1.6.0-py3-none-any.whl (5.2 kB) Downloading pexpect-4.9.0-py2.py3-none-any.whl (63 kB) Downloading psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl (155 kB) Downloading ptyprocess-0.7.0-py2.py3-none-any.whl (13 kB) Downloading stack_data-0.6.3-py3-none-any.whl (24 kB) Downloading asttokens-3.0.1-py3-none-any.whl (27 kB) Downloading executing-2.2.1-py2.py3-none-any.whl (28 kB) Downloading pure_eval-0.2.3-py3-none-any.whl (11 kB) Downloading pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (801 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 801.6/801.6 kB 709.6 MB/s 0:00:00 Downloading sphinx_design-0.7.0-py3-none-any.whl (2.2 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.2/2.2 MB 170.0 MB/s 0:00:00 Downloading tabulate-0.10.0-py3-none-any.whl (39 kB) Downloading wcwidth-0.6.0-py3-none-any.whl (94 kB) Building wheels for collected packages: scanpy-tutorials Building wheel for scanpy-tutorials (pyproject.toml): started Building wheel for scanpy-tutorials (pyproject.toml): finished with status 'done' Created wheel for scanpy-tutorials: filename=scanpy_tutorials-0.1.dev50+gb549212c4-py3-none-any.whl size=2130 sha256=a3820018eb884af7f721c0019473043ca958660f5c8dbcfa8bcda79ba65ff2ae Stored in directory: /tmp/pip-ephem-wheel-cache-h2rv8el7/wheels/b6/cb/e8/9136aad1990dfb6a4668a1805fc4ee3220c39e0e91a8437404 Successfully built scanpy-tutorials Installing collected packages: pure-eval, ptyprocess, fastjsonschema, zipp, wcwidth, typing-extensions, traitlets, tornado, tabulate, soupsieve, six, rpds-py, pyzmq, pyyaml, psutil, platformdirs, pexpect, parso, nest-asyncio, mdurl, ipython-pygments-lexers, greenlet, executing, decorator, debugpy, comm, click, attrs, asttokens, accessible-pygments, stack_data, sqlalchemy, referencing, python-dateutil, prompt_toolkit, matplotlib-inline, markdown-it-py, jupyter-core, jedi, importlib_metadata, beautifulsoup4, sphinx-design, scanpydoc, pydata-sphinx-theme, mdit-py-plugins, jupyter-client, jsonschema-specifications, ipython, sphinx-book-theme, myst-parser, jsonschema, ipykernel, nbformat, nbclient, jupyter-cache, myst-nb, scanpy-tutorials Successfully installed accessible-pygments-0.0.5 asttokens-3.0.1 attrs-26.1.0 beautifulsoup4-4.14.3 click-8.3.1 comm-0.2.3 debugpy-1.8.20 decorator-5.2.1 executing-2.2.1 fastjsonschema-2.21.2 greenlet-3.3.2 importlib_metadata-9.0.0 ipykernel-7.2.0 ipython-9.12.0 ipython-pygments-lexers-1.1.1 jedi-0.19.2 jsonschema-4.26.0 jsonschema-specifications-2025.9.1 jupyter-cache-1.0.1 jupyter-client-8.8.0 jupyter-core-5.9.1 markdown-it-py-4.0.0 matplotlib-inline-0.2.1 mdit-py-plugins-0.5.0 mdurl-0.1.2 myst-nb-1.4.0 myst-parser-5.0.0 nbclient-0.10.4 nbformat-5.10.4 nest-asyncio-1.6.0 parso-0.8.6 pexpect-4.9.0 platformdirs-4.9.4 prompt_toolkit-3.0.52 psutil-7.2.2 ptyprocess-0.7.0 pure-eval-0.2.3 pydata-sphinx-theme-0.16.1 python-dateutil-2.9.0.post0 pyyaml-6.0.3 pyzmq-27.1.0 referencing-0.37.0 rpds-py-0.30.0 scanpy-tutorials-0.1.dev50+gb549212c4 scanpydoc-0.17.3 six-1.17.0 soupsieve-2.8.3 sphinx-book-theme-1.2.0 sphinx-design-0.7.0 sqlalchemy-2.0.48 stack_data-0.6.3 tabulate-0.10.0 tornado-6.5.5 traitlets-5.14.3 typing-extensions-4.15.0 wcwidth-0.6.0 zipp-3.23.0 [rtd-command-info] start-time: 2026-03-30T17:45:34.897204Z, end-time: 2026-03-30T17:45:34.938879Z, duration: 0, exit-code: 0 cat conf.py from __future__ import annotations import os from datetime import UTC, datetime from importlib.metadata import metadata from types import MappingProxyType from typing import TYPE_CHECKING, ClassVar from docutils import nodes from sphinx import addnodes from sphinx.domains import Domain from sphinx.errors import NoUri from sphinx.ext.intersphinx import resolve_reference_in_inventory from sphinx.util.docutils import SphinxDirective if TYPE_CHECKING: from collections.abc import Mapping, Sequence from docutils.parsers.rst.states import Inliner from sphinx.application import Sphinx from sphinx.environment import BuildEnvironment meta = metadata("scanpy-tutorials") project = meta["Name"] author = meta["Author"] copyright = f"{datetime.now(UTC):%Y}, {author}" # noqa: A001 release = version = meta["Version"] extensions = ["myst_nb", "sphinx.ext.intersphinx", "sphinx_design"] myst_enable_extensions = [ "colon_fence", ] templates_path = ["_templates"] source_suffix = ".rst" master_doc = "index" language = "en" exclude_patterns = ["_build", "Thumbs.db", ".DS_Store", "**.ipynb_checkpoints", "scanpy_workshop", ".*cache"] pygments_style = "sphinx" intersphinx_mapping = dict( anndata=("https://anndata.readthedocs.io/en/stable/", None), scanpy=("https://scanpy.readthedocs.io/en/latest/", None), ) suppress_warnings = ["image.not_readable"] # -- Options for HTML output ---------------------------------------------- html_theme = "scanpydoc" html_theme_options = dict( repository_url="https://github.com/theislab/scanpy-tutorials", repository_branch="master", use_repository_button=True, ) html_static_path = ["_static"] # include a warning background on RTD for everything but PR builds html_css_files = ( ["css/warning.css"] if os.environ.get("READTHEDOCS") and os.environ.get("READTHEDOCS_VERSION_TYPE") != "external" else [] ) html_logo = "_static/img/Scanpy_Logo_BrightFG.svg" # -- Notebook settings ---------------------------------------------------- nb_execution_mode = "off" nb_output_stderr = "remove" myst_heading_anchors = 3 suppress_warnings = [ # paga-paul15.ipynb: /_static/img/tutorials/paga_planaria.png "image.not_readable", # application/vnd.microsoft.datawrangler.viewer.v0+json "mystnb.unknown_mime_type", ] # Roles “implementing” {cite}`…` and {cite:p}`…`/{cite:t}`…` def fake_cite( name: str, rawtext: str, text: str, lineno: int, inliner: Inliner, options: Mapping[str, object] = MappingProxyType({}), content: Sequence[str] = (), ) -> tuple[list[nodes.Node], list[str]]: del name, lineno, options, content msg = f"cite:{text}" return [ inliner.document.reporter.info(msg), nodes.emphasis(rawtext, f"[{text}]"), ], [] class FakeDomain(Domain): name: ClassVar = "cite" roles: ClassVar = dict(p=fake_cite, t=fake_cite) # Role linking to the canonical location in scanpy’s docs MSG = ( "Please access this document in its canonical location as the currently accessed page may not be rendered correctly" ) class CanonicalTutorial(SphinxDirective): required_arguments = 1 has_content = False def run(self) -> list[nodes.Node]: """\ Return a banner with a link to the canonical location. If the reference cannot be found, crash the build. """ text = self.arguments[0] ref = resolve_reference_in_inventory( self.env, "scanpy", addnodes.pending_xref("", reftype="doc", refdomain="std", reftarget=text), nodes.inline("", text), ) if ref is None: msg = f"Reference to scanpy:{text} not found" raise self.warning(msg) desc = nodes.inline("", f"{MSG}: ") banner = nodes.danger( text, nodes.paragraph("", "", desc, ref), classes=["admonition", "caution"], ) return [banner] def missing_reference( app: Sphinx, env: BuildEnvironment, node: addnodes.pending_xref, contnode: nodes.TextElement, ) -> nodes.Node | None: del app, env, contnode # ignore known scanpy labels if node["reftarget"] in { "external-data-integration", "eco-data-integration", "pl-embeddings", } or node["reftarget"].startswith("/tutorials"): raise NoUri return None def setup(app: Sphinx) -> None: app.add_domain(FakeDomain) app.add_role("cite", fake_cite) app.add_directive("canonical-tutorial", CanonicalTutorial) app.connect("missing-reference", missing_reference) [rtd-command-info] start-time: None, end-time: None, duration: None, exit-code: None python -m sphinx -T -W --keep-going -j auto -b html -d _build/doctrees -D language=en . $READTHEDOCS_OUTPUT/html