Skip to content
Merged
Show file tree
Hide file tree
Changes from 9 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,9 @@ jobs:
with:
path: |
~/.cache/squidpy/*.h5ad
~/.cache/squidpy/*.zarr
key: data-${{ hashFiles('**/download_data.py') }}
enableCrossOsArchive: true # Necessary for macOS runners

- name: Download datasets
if: steps.data-cache.outputs.cache-hit != 'true'
Expand Down
3 changes: 2 additions & 1 deletion hatch.toml
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,8 @@ extra-dependencies = [
"pytest-timeout",
]


[envs.hatch-test.scripts]
download = "python ./.scripts/ci/download_data.py {args}"

[[envs.hatch-test.matrix]]
deps = ["stable"]
Expand Down
59 changes: 54 additions & 5 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -37,16 +37,20 @@ authors = [
{name = "Giovanni Palla"},
{name = "Michal Klein"},
{name = "Hannah Spitzer"},
{name = "Tim Treis"},
{name = "Laurens Lehner"},
{name = "Selman Ozleyen"},
]
maintainers = [
{name = "Giovanni Palla", email = "[email protected]"},
{name = "Michal Klein", email = "[email protected]"},
{name = "Tim Treis", email = "[email protected]"}
{name = "Tim Treis", email = "[email protected]"},
{name = "Selman Ozleyen", email = "[email protected]"}
]

dependencies = [
"aiohttp>=3.8.1",
"anndata>=0.9",
"spatialdata>=0.2.5",
"spatialdata-plot",
"cycler>=0.11.0",
"dask-image>=0.5.0",
"dask[array]>=2021.02.0,<=2024.11.2",
Expand All @@ -61,7 +65,7 @@ dependencies = [
"pandas>=2.1.0",
"Pillow>=8.0.0",
"scanpy>=1.9.3",
"scikit-image>=0.20",
"scikit-image>=0.25",
# due to https://github.com/scikit-image/scikit-image/issues/6850 breaks rescale ufunc
"scikit-learn>=0.24.0",
"statsmodels>=0.12.0",
Expand All @@ -70,6 +74,7 @@ dependencies = [
"tqdm>=4.50.2",
"validators>=0.18.2",
"xarray>=2024.10.0",
"imagecodecs>=2025.8.2,<2026",
"zarr>=2.6.1",
"spatialdata>=0.2.5",
]
Expand All @@ -78,13 +83,20 @@ dependencies = [
dev = [
"pre-commit>=3.0.0",
"hatch>=1.9.0",
"jupyterlab",
"notebook",
"ipykernel",
"ipywidgets",
"jupytext",
"pytest",
"pytest-cov",
"ruff",
]
test = [
"scanpy[leiden]",
"pytest>=7",
"pytest-xdist>=3",
"pytest-mock>=3.5.0",
# Just for VS Code
"pytest-cov>=4",
"coverage[toml]>=7",
"pytest-timeout>=2.1.0",
Expand Down Expand Up @@ -282,3 +294,40 @@ show_missing = true
precision = 2
skip_empty = true
sort = "Miss"

[tool.pixi.workspace]
channels = ["conda-forge"]
platforms = ["osx-arm64", "linux-64"]

[tool.pixi.dependencies]
python = ">=3.11"

[tool.pixi.pypi-dependencies]
squidpy = { path = ".", editable = true }

# for gh-actions
[tool.pixi.feature.py311.dependencies]
python = "3.11.*"

[tool.pixi.feature.py313.dependencies]
python = "3.13.*"

[tool.pixi.environments]
# 3.11 lane (for gh-actions)
dev-py311 = { features = ["dev", "test", "py311"], solve-group = "py311" }
docs-py311 = { features = ["docs", "py311"], solve-group = "py311" }

# 3.12 lane
default = { features = ["py313"], solve-group = "py313" }
dev-py313 = { features = ["dev", "test", "py313"], solve-group = "py313" }
docs-py313 = { features = ["docs", "py313"], solve-group = "py313" }
test-py313 = { features = ["test", "py313"], solve-group = "py313" }

[tool.pixi.tasks]
lab = "jupyter lab"
kernel-install = "python -m ipykernel install --user --name pixi-dev --display-name \"squidpy (dev)\""
test = "pytest -v --color=yes --tb=short --durations=10"
lint = "ruff check ."
format = "ruff format ."
pre-commit-install = "pre-commit install"
pre-commit = "pre-commit run"
4 changes: 3 additions & 1 deletion src/squidpy/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from importlib import metadata
from importlib.metadata import PackageMetadata

from squidpy import datasets, gr, im, pl, read, tl
from squidpy import datasets, experimental, gr, im, pl, read, tl

try:
md: PackageMetadata = metadata.metadata(__name__)
Expand All @@ -14,3 +14,5 @@
md = None # type: ignore[assignment]

del metadata, md

__all__ = ["datasets", "experimental", "gr", "im", "pl", "read", "tl"]
26 changes: 26 additions & 0 deletions src/squidpy/_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
import joblib as jl
import numba
import numpy as np
import spatialdata as sd
from spatialdata.models import Image2DModel, Labels2DModel

__all__ = ["singledispatchmethod", "Signal", "SigQueue", "NDArray", "NDArrayA"]

Expand Down Expand Up @@ -347,3 +349,27 @@ def new_func2(*args: Any, **kwargs: Any) -> Any:

else:
raise TypeError(repr(type(reason)))


def _get_scale_factors(
element: Image2DModel | Labels2DModel,
) -> list[float]:
"""
Get the scale factors of an image or labels.
"""
if not hasattr(element, "keys"):
return [] # element isn't a datatree -> single scale

shapes = [_yx_from_shape(element[scale].image.shape) for scale in element.keys()]

factors: list[float] = [(y0 / y1 + x0 / x1) / 2 for (y0, x0), (y1, x1) in zip(shapes, shapes[1:], strict=False)]
return [int(f) for f in factors]


def _yx_from_shape(shape: tuple[int, ...]) -> tuple[int, int]:
if len(shape) == 2: # (y, x)
return shape[0], shape[1]
if len(shape) == 3: # (c, y, x)
return shape[1], shape[2]

raise ValueError(f"Unsupported shape {shape}. Expected (y, x) or (c, y, x).")
12 changes: 12 additions & 0 deletions src/squidpy/experimental/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
"""Experimental module for Squidpy.

This module contains experimental features that are still under development.
These features may change or be removed in future releases.
"""

from __future__ import annotations

from . import im
from .im._detect_tissue import detect_tissue

__all__ = ["detect_tissue", "im"]
9 changes: 9 additions & 0 deletions src/squidpy/experimental/im/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
from __future__ import annotations

from ._detect_tissue import (
BackgroundDetectionParams,
FelzenszwalbParams,
detect_tissue,
)

__all__ = ["detect_tissue", "BackgroundDetectionParams", "FelzenszwalbParams"]
Loading
Loading