diff --git a/.codecov.yaml b/.codecov.yaml index d0c0e29..829e56c 100644 --- a/.codecov.yaml +++ b/.codecov.yaml @@ -1,17 +1,17 @@ # Based on pydata/xarray codecov: - require_ci_to_pass: no + require_ci_to_pass: no coverage: - status: - project: - default: - # Require 1% coverage, i.e., always succeed - target: 1 - patch: false - changes: false + status: + project: + default: + # Require 1% coverage, i.e., always succeed + target: 1 + patch: false + changes: false comment: - layout: diff, flags, files - behavior: once - require_base: no + layout: diff, flags, files + behavior: once + require_base: no diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index cc32eda..0a883e8 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -2,92 +2,92 @@ name: Bug report description: Report something that is broken or incorrect labels: bug body: - - type: markdown - attributes: - value: | - **Note**: Please read [this guide](https://matthewrocklin.com/blog/work/2018/02/28/minimal-bug-reports) - 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. - * Replicate problems on public datasets or share data subsets when full sharing isn't possible. + - type: markdown + attributes: + value: | + **Note**: Please read [this guide](https://matthewrocklin.com/blog/work/2018/02/28/minimal-bug-reports) + 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. + * Replicate problems on public datasets or share data subsets when full sharing isn't possible. - - type: textarea - id: report - attributes: - label: Report - description: A clear and concise description of what the bug is. - validations: - required: true + - type: textarea + id: report + attributes: + label: Report + description: A clear and concise description of what the bug is. + validations: + required: true - - type: textarea - id: versions - attributes: - label: Versions - description: | - Which version of packages. + - type: textarea + id: versions + attributes: + label: Versions + description: | + Which version of packages. - Please install `session-info2`, run the following command in a notebook, - click the “Copy as Markdown” button, then paste the results into the text box below. + Please install `session-info2`, run the following command in a notebook, + click the “Copy as Markdown” button, then paste the results into the text box below. - ```python - In[1]: import session_info2; session_info2.session_info(dependencies=True) - ``` + ```python + In[1]: import session_info2; session_info2.session_info(dependencies=True) + ``` - Alternatively, run this in a console: + Alternatively, run this in a console: - ```python - >>> import session_info2; print(session_info2.session_info(dependencies=True)._repr_mimebundle_()["text/markdown"]) - ``` - render: python - placeholder: | - anndata 0.11.3 - ---- ---- - charset-normalizer 3.4.1 - coverage 7.7.0 - psutil 7.0.0 - dask 2024.7.1 - jaraco.context 5.3.0 - numcodecs 0.15.1 - jaraco.functools 4.0.1 - Jinja2 3.1.6 - sphinxcontrib-jsmath 1.0.1 - sphinxcontrib-htmlhelp 2.1.0 - toolz 1.0.0 - session-info2 0.1.2 - PyYAML 6.0.2 - llvmlite 0.44.0 - scipy 1.15.2 - pandas 2.2.3 - sphinxcontrib-devhelp 2.0.0 - h5py 3.13.0 - tblib 3.0.0 - setuptools-scm 8.2.0 - more-itertools 10.3.0 - msgpack 1.1.0 - sparse 0.15.5 - wrapt 1.17.2 - jaraco.collections 5.1.0 - numba 0.61.0 - pyarrow 19.0.1 - pytz 2025.1 - MarkupSafe 3.0.2 - crc32c 2.7.1 - sphinxcontrib-qthelp 2.0.0 - sphinxcontrib-serializinghtml 2.0.0 - zarr 2.18.4 - asciitree 0.3.3 - six 1.17.0 - sphinxcontrib-applehelp 2.0.0 - numpy 2.1.3 - cloudpickle 3.1.1 - sphinxcontrib-bibtex 2.6.3 - natsort 8.4.0 - jaraco.text 3.12.1 - setuptools 76.1.0 - Deprecated 1.2.18 - packaging 24.2 - python-dateutil 2.9.0.post0 - ---- ---- - Python 3.13.2 | packaged by conda-forge | (main, Feb 17 2025, 14:10:22) [GCC 13.3.0] - OS Linux-6.11.0-109019-tuxedo-x86_64-with-glibc2.39 - Updated 2025-03-18 15:47 + ```python + >>> import session_info2; print(session_info2.session_info(dependencies=True)._repr_mimebundle_()["text/markdown"]) + ``` + render: python + placeholder: | + anndata 0.11.3 + ---- ---- + charset-normalizer 3.4.1 + coverage 7.7.0 + psutil 7.0.0 + dask 2024.7.1 + jaraco.context 5.3.0 + numcodecs 0.15.1 + jaraco.functools 4.0.1 + Jinja2 3.1.6 + sphinxcontrib-jsmath 1.0.1 + sphinxcontrib-htmlhelp 2.1.0 + toolz 1.0.0 + session-info2 0.1.2 + PyYAML 6.0.2 + llvmlite 0.44.0 + scipy 1.15.2 + pandas 2.2.3 + sphinxcontrib-devhelp 2.0.0 + h5py 3.13.0 + tblib 3.0.0 + setuptools-scm 8.2.0 + more-itertools 10.3.0 + msgpack 1.1.0 + sparse 0.15.5 + wrapt 1.17.2 + jaraco.collections 5.1.0 + numba 0.61.0 + pyarrow 19.0.1 + pytz 2025.1 + MarkupSafe 3.0.2 + crc32c 2.7.1 + sphinxcontrib-qthelp 2.0.0 + sphinxcontrib-serializinghtml 2.0.0 + zarr 2.18.4 + asciitree 0.3.3 + six 1.17.0 + sphinxcontrib-applehelp 2.0.0 + numpy 2.1.3 + cloudpickle 3.1.1 + sphinxcontrib-bibtex 2.6.3 + natsort 8.4.0 + jaraco.text 3.12.1 + setuptools 76.1.0 + Deprecated 1.2.18 + packaging 24.2 + python-dateutil 2.9.0.post0 + ---- ---- + Python 3.13.2 | packaged by conda-forge | (main, Feb 17 2025, 14:10:22) [GCC 13.3.0] + OS Linux-6.11.0-109019-tuxedo-x86_64-with-glibc2.39 + Updated 2025-03-18 15:47 diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 5b62547..5cad625 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,5 +1,5 @@ blank_issues_enabled: false contact_links: - - name: Scverse Community Forum - url: https://discourse.scverse.org/ - about: If you have questions about “How to do X”, please ask them here. + - name: Scverse Community Forum + url: https://discourse.scverse.org/ + about: If you have questions about “How to do X”, please ask them here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml index 989dee9..2ce7556 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -2,10 +2,10 @@ name: Feature request description: Propose a new feature for pytometry labels: enhancement body: - - type: textarea - id: description - attributes: - label: Description of feature - description: Please describe your suggestion for a new feature. It might help to describe a problem or use case, plus any alternatives that you have considered. - validations: - required: true + - type: textarea + id: description + attributes: + label: Description of feature + description: Please describe your suggestion for a new feature. It might help to describe a problem or use case, plus any alternatives that you have considered. + validations: + required: true diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 914ad69..0c21fed 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,12 +1,12 @@ version: 2 updates: - - package-ecosystem: github-actions - directory: / - schedule: - interval: weekly - cooldown: - default-days: 7 - groups: - actions-deps: - patterns: - - "*" + - package-ecosystem: github-actions + directory: / + schedule: + interval: weekly + cooldown: + default-days: 7 + groups: + actions-deps: + patterns: + - "*" diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index ea1a2f0..a806208 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -1,30 +1,30 @@ name: Check Build on: - push: - branches: [main] - pull_request: - branches: [main] + push: + branches: [main] + pull_request: + branches: [main] concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true permissions: - contents: read + contents: read jobs: - package: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - with: - filter: blob:none - fetch-depth: 0 - persist-credentials: false - - name: Install uv - uses: astral-sh/setup-uv@07a047e608db84b3d8c06cd9a7c7dcc9c355c18e # v10.3.2 - - name: Build package - run: uv build - - name: Check package - run: uvx twine check --strict dist/*.whl + package: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + filter: blob:none + fetch-depth: 0 + persist-credentials: false + - name: Install uv + uses: astral-sh/setup-uv@07a047e608db84b3d8c06cd9a7c7dcc9c355c18e # v10.3.2 + - name: Build package + run: uv build + - name: Check package + run: uvx twine check --strict dist/*.whl diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index b6d4f2e..266fd14 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -1,33 +1,33 @@ name: Release on: - release: - types: [published] + release: + types: [published] # Use "trusted publishing", see https://docs.pypi.org/trusted-publishers/ permissions: {} jobs: - release: - name: Upload release to PyPI - runs-on: ubuntu-latest - environment: - name: pypi - url: https://pypi.org/p/pytometry - permissions: - contents: read - id-token: write # IMPORTANT: this permission is mandatory for trusted publishing - steps: - - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - with: - filter: blob:none - fetch-depth: 0 - persist-credentials: false - - name: Install uv - uses: astral-sh/setup-uv@07a047e608db84b3d8c06cd9a7c7dcc9c355c18e # v10.3.2 - with: - enable-cache: false - - name: Build package - run: uv build - - name: Publish package distributions to PyPI - uses: pypa/gh-action-pypi-publish@7245906fb61fa33a13554f9d5fb856fe61758086 # v1.14.3 + release: + name: Upload release to PyPI + runs-on: ubuntu-latest + environment: + name: pypi + url: https://pypi.org/p/pytometry + permissions: + contents: read + id-token: write # IMPORTANT: this permission is mandatory for trusted publishing + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + filter: blob:none + fetch-depth: 0 + persist-credentials: false + - name: Install uv + uses: astral-sh/setup-uv@07a047e608db84b3d8c06cd9a7c7dcc9c355c18e # v10.3.2 + with: + enable-cache: false + - name: Build package + run: uv build + - name: Publish package distributions to PyPI + uses: pypa/gh-action-pypi-publish@7245906fb61fa33a13554f9d5fb856fe61758086 # v1.14.3 diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index c36939a..69b3b72 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -1,115 +1,115 @@ name: Test on: - push: - branches: [main] - pull_request: - branches: [main] - schedule: - - cron: "0 5 1,15 * *" + push: + branches: [main] + pull_request: + branches: [main] + schedule: + - cron: "0 5 1,15 * *" concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true permissions: - contents: read + contents: read env: - # CPU-only torch (for fastersom): PyPI's Linux wheels pull several GB of CUDA libraries - UV_TORCH_BACKEND: cpu + # CPU-only torch (for fastersom): PyPI's Linux wheels pull several GB of CUDA libraries + UV_TORCH_BACKEND: cpu jobs: - # 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. - get-environments: - runs-on: ubuntu-slim - outputs: - envs: ${{ steps.get-envs.outputs.envs }} - steps: - - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - with: - filter: blob:none - fetch-depth: 0 - persist-credentials: false - - name: Install uv - uses: astral-sh/setup-uv@07a047e608db84b3d8c06cd9a7c7dcc9c355c18e # v10.3.2 - - name: Get test environments - id: get-envs - run: | - ENVS_JSON=$(uvx hatch env show --json | jq -c 'to_entries - | map( - select(.key | startswith("hatch-test")) - | { - name: .key, - label: (if (.key | contains("pre")) then .key + " (PRE-RELEASE DEPENDENCIES)" else .key end), - python: .value.python - } - )') - echo "envs=${ENVS_JSON}" | tee $GITHUB_OUTPUT + # 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. + get-environments: + runs-on: ubuntu-slim + outputs: + envs: ${{ steps.get-envs.outputs.envs }} + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + filter: blob:none + fetch-depth: 0 + persist-credentials: false + - name: Install uv + uses: astral-sh/setup-uv@07a047e608db84b3d8c06cd9a7c7dcc9c355c18e # v10.3.2 + - name: Get test environments + id: get-envs + run: | + ENVS_JSON=$(uvx hatch env show --json | jq -c 'to_entries + | map( + select(.key | startswith("hatch-test")) + | { + name: .key, + label: (if (.key | contains("pre")) then .key + " (PRE-RELEASE DEPENDENCIES)" else .key end), + python: .value.python + } + )') + echo "envs=${ENVS_JSON}" | tee $GITHUB_OUTPUT - # Run tests through hatch. Spawns a separate runner for each environment defined in the hatch matrix obtained above. - test: - needs: get-environments - permissions: - id-token: write # for codecov OIDC - contents: read + # Run tests through hatch. Spawns a separate runner for each environment defined in the hatch matrix obtained above. + test: + needs: get-environments + permissions: + id-token: write # for codecov OIDC + contents: read - strategy: - fail-fast: false - matrix: - os: [ubuntu-latest] - env: ${{ fromJSON(needs.get-environments.outputs.envs) }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest] + env: ${{ fromJSON(needs.get-environments.outputs.envs) }} - name: ${{ matrix.env.label }} - runs-on: ${{ matrix.os }} - continue-on-error: ${{ contains(matrix.env.name, 'pre') }} # make "all-green" pass even if pre-release job fails + name: ${{ matrix.env.label }} + runs-on: ${{ matrix.os }} + continue-on-error: ${{ contains(matrix.env.name, 'pre') }} # make "all-green" pass even if pre-release job fails - steps: - - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - with: - filter: blob:none - fetch-depth: 0 - persist-credentials: false - - name: Install uv - uses: astral-sh/setup-uv@07a047e608db84b3d8c06cd9a7c7dcc9c355c18e # v10.3.2 - with: - python-version: ${{ matrix.env.python }} - - name: create hatch environment - run: uvx hatch env create ${{ matrix.env.name }} - - name: list all all installed package versions - run: uvx hatch run ${{ matrix.env.name }}:uv pip list - - name: run tests using hatch - env: - MPLBACKEND: agg - PLATFORM: ${{ matrix.os }} - DISPLAY: :42 - run: uvx hatch run ${{ matrix.env.name }}:run-cov -v --color=yes -n auto - - name: generate coverage report - run: | - # See https://coverage.readthedocs.io/page/config.html#run-patch - test -f .coverage || uvx hatch run ${{ matrix.env.name }}:cov-combine - uvx hatch run ${{ matrix.env.name }}:cov-report # report visibly - uvx hatch run ${{ matrix.env.name }}:coverage xml # create report for upload - - name: Upload coverage - uses: codecov/codecov-action@303a32d7a59b442fa8d48b6a1cc6825c09c847a5 # v7.1.1 - with: - fail_ci_if_error: true - use_oidc: true + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + filter: blob:none + fetch-depth: 0 + persist-credentials: false + - name: Install uv + uses: astral-sh/setup-uv@07a047e608db84b3d8c06cd9a7c7dcc9c355c18e # v10.3.2 + with: + python-version: ${{ matrix.env.python }} + - name: create hatch environment + run: uvx hatch env create ${{ matrix.env.name }} + - name: list all all installed package versions + run: uvx hatch run ${{ matrix.env.name }}:uv pip list + - name: run tests using hatch + env: + MPLBACKEND: agg + PLATFORM: ${{ matrix.os }} + DISPLAY: :42 + run: uvx hatch run ${{ matrix.env.name }}:run-cov -v --color=yes -n auto + - name: generate coverage report + run: | + # See https://coverage.readthedocs.io/page/config.html#run-patch + test -f .coverage || uvx hatch run ${{ matrix.env.name }}:cov-combine + uvx hatch run ${{ matrix.env.name }}:cov-report # report visibly + uvx hatch run ${{ matrix.env.name }}:coverage xml # create report for upload + - name: Upload coverage + uses: codecov/codecov-action@303a32d7a59b442fa8d48b6a1cc6825c09c847a5 # v7.1.1 + with: + fail_ci_if_error: true + use_oidc: true - # Check that all tests defined above pass. This makes it easy to set a single "required" test in branch - # protection instead of having to update it frequently. See https://github.com/re-actors/alls-green#why. - check: - name: Tests pass in all hatch environments - if: always() - needs: - - get-environments - - test - runs-on: ubuntu-latest - steps: - - uses: re-actors/alls-green@b5b5b37504aa4183270bd3d855c52a67f212be35 # v1.3.0 - with: - jobs: ${{ toJSON(needs) }} + # Check that all tests defined above pass. This makes it easy to set a single "required" test in branch + # protection instead of having to update it frequently. See https://github.com/re-actors/alls-green#why. + check: + name: Tests pass in all hatch environments + if: always() + needs: + - get-environments + - test + runs-on: ubuntu-latest + steps: + - uses: re-actors/alls-green@b5b5b37504aa4183270bd3d855c52a67f212be35 # v1.3.0 + with: + jobs: ${{ toJSON(needs) }} diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3a84322..2fb95e2 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,44 +1,44 @@ fail_fast: false default_language_version: - python: python3 + python: python3 default_stages: - - pre-commit - - pre-push + - pre-commit + - pre-push minimum_pre_commit_version: 2.16.0 repos: - - repo: https://github.com/biomejs/pre-commit - rev: v2.5.3 - hooks: - - id: biome-format - exclude: ^\.cruft\.json$ # inconsistent indentation with cruft - file never to be modified manually. - - repo: https://github.com/tox-dev/pyproject-fmt - rev: v2.25.3 - hooks: - - id: pyproject-fmt - - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.15.21 - hooks: - - id: ruff-check - types_or: [python, pyi, jupyter] - args: [--fix, --exit-non-zero-on-fix] - - id: ruff-format - types_or: [python, pyi, jupyter] - - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v6.0.0 - hooks: - - id: detect-private-key - - id: check-ast - - id: end-of-file-fixer - - id: mixed-line-ending - args: [--fix=lf] - - id: trailing-whitespace - - id: check-case-conflict - # Check that there are no merge conflicts (could be generated by template sync) - - id: check-merge-conflict - args: [--assume-in-merge] + - repo: https://github.com/biomejs/pre-commit + rev: v2.6.4 + hooks: + - id: biome-format + exclude: ^\.cruft\.json$ # inconsistent indentation with cruft - file never to be modified manually. + - repo: https://github.com/tox-dev/pyproject-fmt + rev: v2.30.3 + hooks: + - id: pyproject-fmt + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.17.3 + hooks: + - id: ruff-check + types_or: [python, pyi, jupyter] + args: [--fix, --exit-non-zero-on-fix] + - id: ruff-format + types_or: [python, pyi, jupyter] + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v6.0.0 + hooks: + - id: detect-private-key + - id: check-ast + - id: end-of-file-fixer + - id: mixed-line-ending + args: [--fix=lf] + - id: trailing-whitespace + - id: check-case-conflict + # Check that there are no merge conflicts (could be generated by template sync) + - id: check-merge-conflict + args: [--assume-in-merge] - - repo: https://github.com/zizmorcore/zizmor-pre-commit - rev: v1.24.1 - hooks: - - id: zizmor - args: [--no-progress, --fix] + - repo: https://github.com/zizmorcore/zizmor-pre-commit + rev: v1.31.1 + hooks: + - id: zizmor + args: [--no-progress, --fix] diff --git a/.readthedocs.yaml b/.readthedocs.yaml index a7138a2..cdfd8d1 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -1,17 +1,17 @@ # https://docs.readthedocs.io/page/config-file/v2.html version: 2 build: - os: ubuntu-24.04 - tools: - python: "3.14" - nodejs: latest - jobs: - create_environment: - - asdf plugin add uv - - asdf install uv latest - - asdf global uv latest - build: - html: - # CPU-only torch (for fastersom): PyPI's Linux wheels pull several GB of CUDA libraries - - UV_TORCH_BACKEND=cpu uvx hatch run docs:build - - mv docs/_build $READTHEDOCS_OUTPUT + os: ubuntu-24.04 + tools: + python: "3.14" + nodejs: latest + jobs: + create_environment: + - asdf plugin add uv + - asdf install uv latest + - asdf global uv latest + build: + html: + # CPU-only torch (for fastersom): PyPI's Linux wheels pull several GB of CUDA libraries + - UV_TORCH_BACKEND=cpu uvx hatch run docs:build + - mv docs/_build $READTHEDOCS_OUTPUT diff --git a/docs/contributing.md b/docs/contributing.md index 33afd7d..384266a 100644 --- a/docs/contributing.md +++ b/docs/contributing.md @@ -11,7 +11,7 @@ the [scientific Python tutorials][], or the [scanpy developer guide][]. [scientific Python tutorials]: https://learn.scientific-python.org/development/tutorials/ [scanpy developer guide]: https://scanpy.scverse.org/page/dev/ -:::{tip} The *hatch* project manager +:::{tip} The _hatch_ project manager We highly recommend to familiarize yourself with [`hatch`][hatch]. Hatch is a Python project manager that diff --git a/pyproject.toml b/pyproject.toml index e7bf453..f333727 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -21,6 +21,7 @@ classifiers = [ "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", + "Programming Language :: Python :: 3.15", ] dependencies = [ "anndata>=0.10.8", @@ -142,11 +143,11 @@ strict = true testpaths = [ "tests" ] [tool.coverage] +run.source = [ "pytometry" ] run.omit = [ "**/test_*.py", ] run.patch = [ "subprocess" ] -run.source = [ "pytometry" ] [tool.cruft] skip = [