1
1
[build-system ]
2
2
build-backend = " hatchling.build"
3
- requires = [" hatchling" , " hatch-vcs" ]
3
+ requires = [ " hatchling" , " hatch-vcs" ]
4
4
5
5
[project ]
6
6
name = " scanpy"
7
7
description = " Single-Cell Analysis in Python."
8
8
requires-python = " >=3.10"
9
9
license = " BSD-3-clause"
10
10
authors = [
11
- {name = " Alex Wolf" },
12
- {name = " Philipp Angerer" },
13
- {name = " Fidel Ramirez" },
14
- {name = " Isaac Virshup" },
15
- {name = " Sergei Rybakov" },
16
- {name = " Gokcen Eraslan" },
17
- {name = " Tom White" },
18
- {name = " Malte Luecken" },
19
- {name = " Davide Cittaro" },
20
- {name = " Tobias Callies" },
21
- {name = " Marius Lange" },
22
- {name = " Andrés R. Muñoz-Rojas" },
11
+ { name = " Alex Wolf" },
12
+ { name = " Philipp Angerer" },
13
+ { name = " Fidel Ramirez" },
14
+ { name = " Isaac Virshup" },
15
+ { name = " Sergei Rybakov" },
16
+ { name = " Gokcen Eraslan" },
17
+ { name = " Tom White" },
18
+ { name = " Malte Luecken" },
19
+ { name = " Davide Cittaro" },
20
+ { name = " Tobias Callies" },
21
+ { name = " Marius Lange" },
22
+ { name = " Andrés R. Muñoz-Rojas" },
23
23
]
24
24
maintainers = [
25
- {
name =
" Philipp Angerer" ,
email =
" [email protected] " },
26
- {name = " Ilan Gold" },
27
- {name = " Severin Dicks" },
25
+ {
name =
" Philipp Angerer" ,
email =
" [email protected] " },
26
+ {
name =
" Ilan Gold" , email = " [email protected] " },
27
+ { name = " Severin Dicks" },
28
28
]
29
29
readme = " README.md"
30
30
classifiers = [
@@ -56,7 +56,7 @@ dependencies = [
56
56
" tqdm" ,
57
57
" scikit-learn>=1.1,<1.6.0" ,
58
58
" statsmodels>=0.13" ,
59
- " patsy!=1.0.0" , # https://github.com/pydata/patsy/issues/215
59
+ " patsy!=1.0.0" , # https://github.com/pydata/patsy/issues/215
60
60
" networkx>=2.7" ,
61
61
" natsort" ,
62
62
" joblib" ,
@@ -65,10 +65,10 @@ dependencies = [
65
65
" pynndescent>=0.5" ,
66
66
" packaging>=21.3" ,
67
67
" session-info2" ,
68
- " legacy-api-wrap>=1.4" , # for positional API deprecations
68
+ " legacy-api-wrap>=1.4" , # for positional API deprecations
69
69
" typing-extensions; python_version < '3.13'" ,
70
70
]
71
- dynamic = [" version" ]
71
+ dynamic = [ " version" ]
72
72
73
73
# https://docs.pypi.org/project_metadata/#project-urls
74
74
[project .urls ]
@@ -120,13 +120,13 @@ doc = [
120
120
" sphinx-design" ,
121
121
" sphinx-tabs" ,
122
122
" readthedocs-sphinx-search" ,
123
- " sphinxext-opengraph" , # for nice cards when sharing on social
123
+ " sphinxext-opengraph" , # for nice cards when sharing on social
124
124
" sphinx-copybutton" ,
125
125
" nbsphinx>=0.9" ,
126
- " ipython>=7.20" , # for nbsphinx code highlighting
126
+ " ipython>=7.20" , # for nbsphinx code highlighting
127
127
" matplotlib!=3.6.1" ,
128
128
" sphinxcontrib-bibtex" ,
129
- " setuptools" , # undeclared dependency of sphinxcontrib-bibtex→pybtex
129
+ " setuptools" , # undeclared dependency of sphinxcontrib-bibtex→pybtex
130
130
# TODO: remove necessity for being able to import doc-linked classes
131
131
" scanpy[paga,dask-ml]" ,
132
132
" sam-algorithm" ,
@@ -139,22 +139,22 @@ dev = [
139
139
" towncrier" ,
140
140
]
141
141
# Algorithms
142
- paga = [" igraph" ]
143
- louvain = [" igraph" , " louvain>=0.6.0,!=0.6.2" ] # Louvain community detection
144
- leiden = [" igraph>=0.10" , " leidenalg>=0.9.0" ] # Leiden community detection
145
- bbknn = [" bbknn" ] # Batch balanced KNN (batch correction)
146
- magic = [" magic-impute>=2.0" ] # MAGIC imputation method
147
- skmisc = [" scikit-misc>=0.1.3" ] # highly_variable_genes method 'seurat_v3'
148
- harmony = [" harmonypy" ] # Harmony dataset integration
149
- scanorama = [" scanorama" ] # Scanorama dataset integration
150
- scrublet = [" scikit-image" ] # Doublet detection with automatic thresholds
142
+ paga = [ " igraph" ]
143
+ louvain = [ " igraph" , " louvain>=0.6.0,!=0.6.2" ] # Louvain community detection
144
+ leiden = [ " igraph>=0.10" , " leidenalg>=0.9.0" ] # Leiden community detection
145
+ bbknn = [ " bbknn" ] # Batch balanced KNN (batch correction)
146
+ magic = [ " magic-impute>=2.0" ] # MAGIC imputation method
147
+ skmisc = [ " scikit-misc>=0.1.3" ] # highly_variable_genes method 'seurat_v3'
148
+ harmony = [ " harmonypy" ] # Harmony dataset integration
149
+ scanorama = [ " scanorama" ] # Scanorama dataset integration
150
+ scrublet = [ " scikit-image" ] # Doublet detection with automatic thresholds
151
151
# Acceleration
152
- rapids = [" cudf>=0.9" , " cuml>=0.9" , " cugraph>=0.9" ] # GPU accelerated calculation of neighbors
153
- dask = [" dask[array]>=2022.09.2,<2024.8.0" ] # Use the Dask parallelization engine
154
- dask-ml = [" dask-ml" , " scanpy[dask]" ] # Dask-ML for sklearn-like API
152
+ rapids = [ " cudf>=0.9" , " cuml>=0.9" , " cugraph>=0.9" ] # GPU accelerated calculation of neighbors
153
+ dask = [ " dask[array]>=2022.09.2,<2024.8.0" ] # Use the Dask parallelization engine
154
+ dask-ml = [ " dask-ml" , " scanpy[dask]" ] # Dask-ML for sklearn-like API
155
155
156
156
[tool .hatch .build .targets .wheel ]
157
- packages = [" src/testing" , " src/scanpy" ]
157
+ packages = [ " src/testing" , " src/scanpy" ]
158
158
[tool .hatch .version ]
159
159
source = " vcs"
160
160
raw-options.version_scheme = " release-branch-semver"
@@ -169,8 +169,8 @@ addopts = [
169
169
" -ptesting.scanpy._pytest" ,
170
170
" --pyargs" ,
171
171
]
172
- testpaths = [" ./tests" , " ./ci" , " scanpy" ]
173
- norecursedirs = [" tests/_images" ]
172
+ testpaths = [ " ./tests" , " ./ci" , " scanpy" ]
173
+ norecursedirs = [ " tests/_images" ]
174
174
xfail_strict = true
175
175
nunit_attach_on = " fail"
176
176
markers = [
@@ -203,12 +203,12 @@ filterwarnings = [
203
203
204
204
[tool .coverage .run ]
205
205
data_file = " test-data/coverage"
206
- source_pkgs = [" scanpy" ]
207
- omit = [" tests/*" , " src/testing/*" ]
206
+ source_pkgs = [ " scanpy" ]
207
+ omit = [ " tests/*" , " src/testing/*" ]
208
208
[tool .coverage .xml ]
209
209
output = " test-data/coverage.xml"
210
210
[tool .coverage .paths ]
211
- source = [" ." , " **/site-packages" ]
211
+ source = [ " ." , " **/site-packages" ]
212
212
[tool .coverage .report ]
213
213
exclude_also = [
214
214
" if __name__ == .__main__.:" ,
@@ -218,7 +218,7 @@ exclude_also = [
218
218
]
219
219
220
220
[tool .ruff ]
221
- src = [" src" ]
221
+ src = [ " src" ]
222
222
223
223
[tool .ruff .format ]
224
224
docstring-code-format = true
@@ -254,10 +254,10 @@ ignore = [
254
254
]
255
255
[tool .ruff .lint .per-file-ignores ]
256
256
# Do not assign a lambda expression, use a def
257
- "src/scanpy/tools/_rank_genes_groups.py" = [" E731" ]
257
+ "src/scanpy/tools/_rank_genes_groups.py" = [ " E731" ]
258
258
[tool .ruff .lint .isort ]
259
- known-first-party = [" scanpy" , " testing.scanpy" ]
260
- required-imports = [" from __future__ import annotations" ]
259
+ known-first-party = [ " scanpy" , " testing.scanpy" ]
260
+ required-imports = [ " from __future__ import annotations" ]
261
261
[tool .ruff .lint .flake8-tidy-imports .banned-api ]
262
262
"pytest.importorskip".msg = " Use the “@needs” decorator/mark instead"
263
263
"pandas.api.types.is_categorical_dtype".msg = " Use isinstance(s.dtype, CategoricalDtype) instead"
@@ -267,7 +267,7 @@ required-imports = ["from __future__ import annotations"]
267
267
"numba.jit".msg = " Use `scanpy._compat.njit` instead"
268
268
"numba.njit".msg = " Use `scanpy._compat.njit` instead"
269
269
[tool .ruff .lint .flake8-type-checking ]
270
- exempt-modules = []
270
+ exempt-modules = [ ]
271
271
strict = true
272
272
273
273
[tool .towncrier ]
0 commit comments