diff --git a/.cruft.json b/.cruft.json index 744ae8c70..07f1815c6 100644 --- a/.cruft.json +++ b/.cruft.json @@ -1,7 +1,7 @@ { "template": "https://github.com/scverse/cookiecutter-scverse", - "commit": "d383d94fadff9e4e6fdb59d77c68cb900d7cedec", - "checkout": "v0.6.0", + "commit": "6ff5b92b5d44ea6d8a88e47538475718d467db95", + "checkout": "v0.7.0", "context": { "cookiecutter": { "project_name": "squidpy", @@ -36,7 +36,7 @@ "trim_blocks": true }, "_template": "https://github.com/scverse/cookiecutter-scverse", - "_commit": "d383d94fadff9e4e6fdb59d77c68cb900d7cedec" + "_commit": "6ff5b92b5d44ea6d8a88e47538475718d467db95" } }, "directory": null diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 3ca1ccbde..6104b9e6f 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -1,6 +1,6 @@ name: Bug report description: Report something that is broken or incorrect -labels: bug +type: Bug body: - type: markdown attributes: @@ -9,8 +9,7 @@ body: detailing how to provide the necessary information for us to reproduce your bug. In brief: * Please provide exact steps how to reproduce the bug in a clean Python environment. * In case it's not clear what's causing this bug, please provide the data or the data generation procedure. - * Sometimes it is not possible to share the data, but usually it is possible to replicate problems on publicly - available datasets or to share a subset of your data. + * Replicate problems on public datasets or share data subsets when full sharing isn't possible. - type: textarea id: report diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml index b11e828fe..32447b26e 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -1,6 +1,6 @@ name: Feature request description: Propose a new feature for squidpy -labels: enhancement +type: Enhancement body: - type: textarea id: description diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index dda8337cf..c6ecc2f25 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -10,11 +10,6 @@ concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true -defaults: - run: - # to fail on error in multiline statements (-e), in pipes (-o pipefail), and on unset variables (-u). - shell: bash -euo pipefail {0} - jobs: package: runs-on: ubuntu-latest @@ -25,8 +20,6 @@ jobs: fetch-depth: 0 - name: Install uv uses: astral-sh/setup-uv@v7 - with: - cache-dependency-glob: pyproject.toml - name: Build package run: uv build - name: Check package diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index b4bf7da2a..7364aa28f 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -4,11 +4,6 @@ on: release: types: [published] -defaults: - run: - # to fail on error in multiline statements (-e), in pipes (-o pipefail), and on unset variables (-u). - shell: bash -euo pipefail {0} - # Use "trusted publishing", see https://docs.pypi.org/trusted-publishers/ jobs: release: @@ -20,14 +15,12 @@ jobs: permissions: id-token: write # IMPORTANT: this permission is mandatory for trusted publishing steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: filter: blob:none fetch-depth: 0 - name: Install uv - uses: astral-sh/setup-uv@v5 - with: - cache-dependency-glob: pyproject.toml + uses: astral-sh/setup-uv@v7 - name: Build package run: uv build - name: Publish package distributions to PyPI diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index c75993038..6bf473b64 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -12,53 +12,12 @@ concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true -env: - FORCE_COLOR: "1" - MPLBACKEND: agg - UV_COMPILE_BYTECODE: "1" - COVERAGE_FILE: ${{ github.workspace }}/.coverage - # TODO: remove once hatch is compatible with virtualenv 21+ (pypa/hatch#2193) - UV_CONSTRAINT: ${{ github.workspace }}/.github/uv-constraints.txt - -defaults: - run: - # to fail on error in multiline statements (-e), in pipes (-o pipefail), and on unset variables (-u). - shell: bash -euo pipefail {0} - jobs: - ensure-data-is-cached: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v5 - with: - filter: blob:none - fetch-depth: 0 - - - name: Install uv - uses: astral-sh/setup-uv@v7 - with: - enable-cache: false - python-version: "3.13" - - - name: Restore data cache - id: data-cache - uses: actions/cache@v4 - with: - path: data # IMPORTANT: this will fail if scanpy.settings.datasetdir default changes - key: data-${{ hashFiles('**/download_data.py') }} - restore-keys: | - data- - enableCrossOsArchive: true - - - name: Download datasets - # Always run to ensure any missing files are downloaded - # (restore-keys may provide partial cache) - run: uvx hatch run data:download - # Get the test environment from hatch as defined in pyproject.toml. # This ensures that the pyproject.toml is the single point of truth for test definitions and the same tests are # run locally and on continuous integration. - # Check [[tool.hatch.envs.hatch-test.matrix]] in pyproject.toml and https://hatch.pypa.io/latest/environment/ for more details. + # Check [[tool.hatch.envs.hatch-test.matrix]] in pyproject.toml and https://hatch.pypa.io/latest/environment/ for + # more details. get-environments: runs-on: ubuntu-latest outputs: @@ -68,17 +27,12 @@ jobs: with: filter: blob:none fetch-depth: 0 - - name: Install uv uses: astral-sh/setup-uv@v7 - with: - enable-cache: true - cache-dependency-glob: pyproject.toml - - name: Get test environments id: get-envs run: | - ENVS_JSON=$(NO_COLOR=1 uvx --quiet hatch env show --json | jq -c 'to_entries + ENVS_JSON=$(uvx hatch env show --json | jq -c 'to_entries | map( select(.key | startswith("hatch-test")) | { @@ -91,136 +45,48 @@ jobs: # Run tests through hatch. Spawns a separate runner for each environment defined in the hatch matrix obtained above. test: - needs: [ensure-data-is-cached, get-environments] + needs: get-environments + permissions: + id-token: write # for codecov OIDC + strategy: fail-fast: false matrix: - os: [ubuntu-latest, macos-latest] + os: [ubuntu-latest] env: ${{ fromJSON(needs.get-environments.outputs.envs) }} - exclude: - - os: macos-latest - env: { name: hatch-test.py3.11-stable } - - os: macos-latest - env: { name: hatch-test.py3.12-stable } - - os: macos-latest - env: { name: hatch-test.py3.13-pre } # pre-release only needs one OS - - os: ubuntu-latest - env: { name: hatch-test.py3.13-stable } # skipping because we run this as a coverage job - name: ${{ matrix.env.label }} (${{ matrix.os }}) + + name: ${{ matrix.env.label }} runs-on: ${{ matrix.os }} - continue-on-error: ${{ contains(matrix.env.name, 'pre') }} + continue-on-error: ${{ contains(matrix.env.name, 'pre') }} # make "all-green" pass even if pre-release job fails + steps: - uses: actions/checkout@v5 with: filter: blob:none fetch-depth: 0 - - name: Install uv uses: astral-sh/setup-uv@v7 with: python-version: ${{ matrix.env.python }} - cache-dependency-glob: pyproject.toml - - - name: Ensure figure directory exists - run: mkdir -p "$GITHUB_WORKSPACE/tests/figures" - - - name: Restore data cache - id: data-cache - uses: actions/cache@v4 - with: - path: data # IMPORTANT: this will fail if scanpy.settings.datasetdir default changes - key: data-${{ hashFiles('**/download_data.py') }} - restore-keys: | - data- - enableCrossOsArchive: true - - - name: System dependencies (Linux) - if: matrix.os == 'ubuntu-latest' - run: | - sudo apt-get update -y - sudo apt-get install automake -y - - # PyQt5 related - sudo apt install libxkbcommon-x11-0 libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-randr0 libxcb-render-util0 libxcb-xinerama0 libxcb-xfixes0 -y - sudo Xvfb :42 -screen 0 1920x1080x24 -ac +extension GLX a { - background: #34377d2e; -} - -.wy-menu-vertical li.toctree-l2.current li.toctree-l3 > a { - background: #34377d4a; -} - -.wy-menu-vertical li.toctree-l3.current li.toctree-l4 > a { - background: #34377d7d; -} - -.wy-menu-vertical a:hover { - background-color: #6b86b0; -} - -.wy-menu-vertical li.current a:hover { - background: #bdcde6a3; -} - -a { - color: #5b64b1; -} - -.rst-content .viewcode-link { - color: #7013e1d9; -} - -.highlight { - background: #f1f5fb !important; -} - -.rst-content div[class^="highlight"] { - border: 1px solid #e4eaf2; -} - -.wy-menu-vertical p.caption { - color: #ffd92c; -} - -div.output_subarea.output_html.rendered_html.output_result { - overflow: auto; -} - -/* function/class top bar */ -html.writer-html5 .rst-content - dl[class]:not(.option-list):not(.field-list):not(.footnote):not( - .glossary - ):not(.simple) - > dt { - color: #404040; - border-top: solid 4px #7013e1d9; - background: #ffd833a8; -} - -/* class params */ -html.writer-html5 .rst-content - dl[class]:not(.option-list):not(.field-list):not(.footnote):not( - .glossary - ):not(.simple) - dl:not(.field-list) - > dt { - color: #404040; - border-left: solid 4px #7013e1d9; - background: #ffd8338f; -} - -/* the other elements, but more specific - leave them be */ -code.docutils.literal.notranslate > span[class="pre"] { - font-weight: bold; - color: #404040; -} - -/* odd rows in API */ -.rst-content table.docutils:not(.field-list) tr:nth-child(2n - 1) td { - background-color: #f6f6f3; -} - -.rst-content div[class^="highlight"] pre { - padding: 8px; -} - -.rst-content .seealso { - background: #fafae2 !important; -} - -.rst-content .seealso .admonition-title { - background: #7013e1d9 !important; -} diff --git a/docs/_templates/.gitkeep b/docs/_templates/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/docs/_templates/autosummary/class.rst b/docs/_templates/autosummary/class.rst index 1c7f7bc9a..7b4a0cf87 100644 --- a/docs/_templates/autosummary/class.rst +++ b/docs/_templates/autosummary/class.rst @@ -1,34 +1,61 @@ -{{ fullname | escape | underline }} +{{ fullname | escape | underline}} .. currentmodule:: {{ module }} +.. add toctree option to make autodoc generate the pages + .. autoclass:: {{ objname }} - {% block methods %} - {%- if methods %} - .. rubric:: {{ _('Methods') }} - - .. autosummary:: - :toctree: . - {% for item in methods %} - {%- if item not in ['__init__'] %} - ~{{ name }}.{{ item }} - {%- endif %} - {%- endfor %} - {%- for item in all_methods %} - {%- if item in ['__call__'] %} - ~{{ name }}.{{ item }} - {%- endif %} - {%- endfor %} - {%- endif %} - {%- endblock %} - {% block attributes %} - {%- if attributes %} - .. rubric:: {{ _('Attributes') }} - - .. autosummary:: - :toctree: . - {% for item in attributes %} - ~{{ name }}.{{ item }} - {%- endfor %} - {%- endif %} - {% endblock %} + +{% block attributes %} +{% if attributes %} +Attributes table +~~~~~~~~~~~~~~~~ + +.. autosummary:: +{% for item in attributes %} + ~{{ name }}.{{ item }} +{%- endfor %} +{% endif %} +{% endblock %} + +{% block methods %} +{% if methods %} +Methods table +~~~~~~~~~~~~~ + +.. autosummary:: +{% for item in methods %} + {%- if item != '__init__' %} + ~{{ name }}.{{ item }} + {%- endif -%} +{%- endfor %} +{% endif %} +{% endblock %} + +{% block attributes_documentation %} +{% if attributes %} +Attributes +~~~~~~~~~~ + +{% for item in attributes %} + +.. autoattribute:: {{ [objname, item] | join(".") }} +{%- endfor %} + +{% endif %} +{% endblock %} + +{% block methods_documentation %} +{% if methods %} +Methods +~~~~~~~ + +{% for item in methods %} +{%- if item != '__init__' %} + +.. automethod:: {{ [objname, item] | join(".") }} +{%- endif -%} +{%- endfor %} + +{% endif %} +{% endblock %} diff --git a/docs/changelog.md b/docs/changelog.md new file mode 100644 index 000000000..d9e79ba64 --- /dev/null +++ b/docs/changelog.md @@ -0,0 +1,3 @@ +```{include} ../CHANGELOG.md + +``` diff --git a/docs/conf.py b/docs/conf.py index 0f413dfac..0b108a896 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -1,22 +1,32 @@ +# 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: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + # -- Path setup -------------------------------------------------------------- from __future__ import annotations +import shutil import sys from datetime import datetime from importlib.metadata import metadata from pathlib import Path -from sphinx.application import Sphinx +from sphinxcontrib import katex HERE = Path(__file__).parent sys.path.insert(0, str(HERE / "extensions")) # -- Project information ----------------------------------------------------- + +# NOTE: If you installed your project in editable mode, this might be stale. +# If this is the case, reinstall it to refresh the metadata info = metadata("squidpy") -project_name = info["Name"] +project = info["Name"] author = info["Author"] -copyright = f"{datetime.now():%Y}, {author}" +copyright = f"{datetime.now():%Y}, {author}." version = info["Version"] urls = dict(pu.split(", ") for pu in info.get_all("Project-URL")) repository_url = urls["Source"] @@ -24,157 +34,105 @@ # The full version, including alpha/beta/rc tags release = info["Version"] +bibtex_bibfiles = ["references.bib"] +templates_path = ["_templates"] +nitpicky = True # Warn about broken links needs_sphinx = "4.0" +html_context = { + "display_github": True, # Integrate GitHub + "github_user": "giovp", + "github_repo": project, + "github_version": "main", + "conf_py_path": "/docs/", +} + # -- 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 = [ + "myst_nb", + "sphinx_copybutton", "sphinx.ext.autodoc", - "sphinx.ext.napoleon", - "sphinx.ext.viewcode", - "sphinx_autodoc_typehints", "sphinx.ext.intersphinx", "sphinx.ext.autosummary", - "sphinx.ext.mathjax", + "sphinx.ext.napoleon", "sphinxcontrib.bibtex", - "sphinx_copybutton", - "sphinx_design", + "sphinxcontrib.katex", + "sphinx_autodoc_typehints", "sphinx_tabs.tabs", - "myst_nb", - "nbsphinx", - "typed_returns", "IPython.sphinxext.ipython_console_highlighting", + "sphinxext.opengraph", + *[p.stem for p in (HERE / "extensions").glob("*.py")], ] -intersphinx_mapping = dict( # noqa: C408 - python=("https://docs.python.org/3", None), - numpy=("https://numpy.org/doc/stable", None), - statsmodels=("https://www.statsmodels.org/stable", None), - scipy=("https://docs.scipy.org/doc/scipy", None), - pandas=("https://pandas.pydata.org/pandas-docs/stable", None), - anndata=("https://anndata.readthedocs.io/en/stable", None), - scanpy=("https://scanpy.readthedocs.io/en/stable", None), - matplotlib=("https://matplotlib.org/stable", None), - cycler=("https://matplotlib.org/cycler", None), - seaborn=("https://seaborn.pydata.org", None), - joblib=("https://joblib.readthedocs.io/en/latest", None), - networkx=("https://networkx.org/documentation/stable", None), - dask=("https://docs.dask.org/en/latest", None), - skimage=("https://scikit-image.org/docs/stable", None), - sklearn=("https://scikit-learn.org/stable", None), - numba=("https://numba.readthedocs.io/en/stable", None), - xarray=("https://docs.xarray.dev/en/stable", None), - omnipath=("https://omnipath.readthedocs.io/en/latest", None), - napari=("https://napari.org", None), - spatialdata=("https://spatialdata.scverse.org/en/latest", None), - shapely=("https://shapely.readthedocs.io/en/stable", None), -) - -# Add any paths that contain templates here, relative to this directory. -templates_path = ["_templates"] -source_suffix = {".rst": "restructuredtext", ".ipynb": "myst-nb"} -master_doc = "index" -pygments_style = "sphinx" -# myst -nb_execution_mode = "off" +autosummary_generate = True +autodoc_member_order = "groupwise" +default_role = "literal" +napoleon_google_docstring = False +napoleon_numpy_docstring = True +napoleon_include_init_with_doc = False +napoleon_use_rtype = True # having a separate entry generally helps readability +napoleon_use_param = True +myst_heading_anchors = 6 # create anchors for h1-h6 myst_enable_extensions = [ + "amsmath", "colon_fence", + "deflist", "dollarmath", - "amsmath", + "html_image", + "html_admonition", ] -myst_heading_anchors = 2 +myst_url_schemes = ("http", "https", "mailto") +nb_output_stderr = "remove" +nb_execution_mode = "off" +nb_merge_streams = True +typehints_defaults = "braces" + +source_suffix = { + ".rst": "restructuredtext", + ".ipynb": "myst-nb", + ".myst": "myst-nb", +} + +intersphinx_mapping = { + # TODO: replace `3.13` with `3` once ReadTheDocs supports building with Python 3.14 + "python": ("https://docs.python.org/3.13", None), + "anndata": ("https://anndata.readthedocs.io/en/stable/", None), + "scanpy": ("https://scanpy.readthedocs.io/en/stable/", None), + "numpy": ("https://numpy.org/doc/stable/", None), +} # 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 = [ - "notebooks/README.rst", - "notebooks/CONTRIBUTING.rst", - "release/changelog/*", - "**.ipynb_checkpoints", - "build", -] -suppress_warnings = ["download.not_readable", "git.too_shallow"] +exclude_patterns = ["_build", "Thumbs.db", ".DS_Store", "**.ipynb_checkpoints"] + # -- Options for HTML output ------------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. -autosummary_generate = True -autodoc_member_order = "groupwise" -autodoc_typehints = "signature" -autodoc_docstring_signature = True -napoleon_google_docstring = False -napoleon_numpy_docstring = True -napoleon_include_init_with_doc = False -napoleon_use_rtype = True -napoleon_use_param = True -todo_include_todos = False +# +html_theme = "sphinx_book_theme" +html_static_path = ["_static"] +html_css_files = ["css/custom.css"] -# bibliography -bibtex_bibfiles = ["references.bib"] -bibtex_reference_style = "author_year" -bibtex_default_style = "alpha" - -# sphinx linktime checkouts (esp bioRxiv is spotty) -linkcheck_timeout = 90 -linkcheck_retries = 2 - -# spelling -spelling_lang = "en_US" -spelling_warning = True -spelling_word_list_filename = "spelling_wordlist.txt" -spelling_add_pypi_package_names = True -spelling_show_suggestions = True -spelling_exclude_patterns = ["references.rst"] -# see: https://pyenchant.github.io/pyenchant/api/enchant.tokenize.html -spelling_filters = [ - "enchant.tokenize.URLFilter", - "enchant.tokenize.EmailFilter", - "docs.source.utils.ModnameFilter", - "docs.source.utils.SignatureFilter", - "enchant.tokenize.MentionFilter", -] +html_title = project -# Link checking -nitpicky = True # this is linkcheck for Sphinx. -nitpick_ignore = [ - ("py:func", "numba.prange"), # no reference for this function - ("py:class", "matplotlib_scalebar.ScaleBar"), # this project has no sphinx docs - # TODO: fix using scanpydoc.elegant_typehints - ("py:class", "pathlib._local.Path"), - ("py:data", "typing.Union"), - # there seems to be a bug with autodoc for NamedTuple attributes - ("py:class", "NDArray"), - ("py:class", "np.number"), - ("py:class", "csr_matrix"), - # no idea why those aren’t exported - ("py:class", "squidpy._constants._constants.SpatialAutocorr"), - ("py:class", "squidpy._constants._constants.CoordType"), - ("py:class", "squidpy._constants._constants.Transform"), - ("py:class", "pandas.core.frame.DataFrame"), -] -# see the solution from: https://github.com/sphinx-doc/sphinx/issues/7369 -linkcheck_ignore = [ - # 403 Client Error - "https://doi.org/10.1126/science.aar7042", - "https://doi.org/10.1126/science.aau5324", - "https://doi.org/10.1093/bioinformatics/btab164", - "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2716260/", - "https://raw.githubusercontent.com/scverse/squidpy/main/docs/_static/img/figure1.png", -] - -# 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_theme = "sphinx_rtd_theme" -html_static_path = ["_static"] -html_logo = "_static/img/squidpy_horizontal.png" -html_theme_options = {"navigation_depth": 4, "logo_only": True} -html_show_sphinx = False +html_theme_options = { + "repository_url": repository_url, + "use_repository_button": True, + "path_to_docs": "docs/", + "navigation_with_keys": False, +} +pygments_style = "default" +katex_prerender = shutil.which(katex.NODEJS_BINARY) is not None -def setup(app: Sphinx) -> None: - app.add_css_file("css/custom.css") - app.add_css_file("css/sphinx_gallery.css") - app.add_css_file("css/nbsphinx.css") - app.add_css_file("css/dataframe.css") # had to add this manually +nitpick_ignore = [ + # If building the documentation fails because of a missing link that is outside your control, + # you can add an exception to this list. + # ("py:class", "igraph.Graph"), +] diff --git a/docs/contributing.md b/docs/contributing.md index e79f558d0..b172fd1d0 100644 --- a/docs/contributing.md +++ b/docs/contributing.md @@ -31,7 +31,7 @@ it is still possible to use different tools to manage dependencies, such as `uv` ## Installing dev dependencies In addition to the packages needed to _use_ this package, -you need additional python packages to {ref}`writing-tests` and {ref}`docs-building`. +you need additional python packages to [run tests](#writing-tests) and [build the documentation](#docs-building). :::::{tabs} ::::{group-tab} Hatch @@ -62,9 +62,9 @@ This will list “Standalone” environments and a table of “Matrix” environ +------------+---------+--------------------------+----------+---------------------------------+-------------+ | Name | Type | Envs | Features | Dependencies | Scripts | +------------+---------+--------------------------+----------+---------------------------------+-------------+ -| hatch-test | virtual | hatch-test.py3.10-stable | dev | coverage-enable-subprocess==1.0 | cov-combine | -| | | hatch-test.py3.13-stable | test | coverage[toml]~=7.4 | cov-report | -| | | hatch-test.py3.13-pre | | pytest-mock~=3.12 | run | +| hatch-test | virtual | hatch-test.py3.11-stable | dev | coverage-enable-subprocess==1.0 | cov-combine | +| | | hatch-test.py3.14-stable | test | coverage[toml]~=7.4 | cov-report | +| | | hatch-test.py3.14-pre | | pytest-mock~=3.12 | run | | | | | | pytest-randomly~=3.15 | run-cov | | | | | | pytest-rerunfailures~=14.0 | | | | | | | pytest-xdist[psutil]~=3.5 | | @@ -73,18 +73,18 @@ This will list “Standalone” environments and a table of “Matrix” environ ``` From the `Envs` column, select the environment name you want to use for development. -In this example, it would be `hatch-test.py3.13-stable`. +In this example, it would be `hatch-test.py3.14-stable`. Next, create the environment with ```bash -hatch env create hatch-test.py3.13-stable +hatch env create hatch-test.py3.14-stable ``` Then, obtain the path to the environment using ```bash -hatch env find hatch-test.py3.13-stable +hatch env find hatch-test.py3.14-stable ``` In case you are using VScode, now open the command palette (Ctrl+Shift+P) and search for `Python: Select Interpreter`. @@ -264,7 +264,7 @@ This project uses [sphinx][] with the following features: - [Numpy-style docstrings][numpydoc] (through the [napoloen][numpydoc-napoleon] extension). - Jupyter notebooks as tutorials through [myst-nb][] (See [Tutorials with myst-nb](#tutorials-with-myst-nb-and-jupyter-notebooks)) - [sphinx-autodoc-typehints][], to automatically reference annotated input and output types -- Citations (like {cite:p}`palla:22`) can be included with [sphinxcontrib-bibtex](https://sphinxcontrib-bibtex.readthedocs.io/) +- Citations (like {cite:p}`Virshup_2023`) can be included with [sphinxcontrib-bibtex](https://sphinxcontrib-bibtex.readthedocs.io/) See scanpy’s {doc}`scanpy:dev/documentation` for more information on how to write your own. diff --git a/pyproject.toml b/pyproject.toml index 21c847378..4e36a7bfb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -153,8 +153,8 @@ lint.select = [ "F", # pyflakes "I", # isort # below are not autofixed - "UP", # pyupgrade - "W", # pycodestyle + "UP", # pyupgrade + "W", # pycodestyle ] # "squidpy/*.py"= ["RST303"] lint.ignore = [