Skip to content
Open
Show file tree
Hide file tree
Changes from all 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
63 changes: 55 additions & 8 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,21 +74,27 @@ dependencies = [
"tqdm>=4.50.2",
"validators>=0.18.2",
"xarray>=2024.10.0",
"zarr>=2.6.1,<3.0.0",
"spatialdata>=0.2.5",
"zarr>=2.6.1,<3.0.0", "imagecodecs>=2025.8.2,<2026",
]

[project.optional-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 @@ -281,4 +291,41 @@ exclude_lines = [
show_missing = true
precision = 2
skip_empty = true
sort = "Miss"
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 \"sdata-plot (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, exp, 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", "exp", "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).")
11 changes: 11 additions & 0 deletions src/squidpy/exp/__init__.py
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd actually prefer calling this module experimental instead of exp (also similar to {anndata,scanpy}.experimental module). Because I was wondering what it was until I saw this.

Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
"""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 .im._detect_tissue import detect_tissue

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

from ._detect_tissue import detect_tissue

__all__ = ["detect_tissue"]
Loading