spatialdata 0.7.0.dev1__tar.gz → 0.7.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/.pre-commit-config.yaml +2 -2
  2. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/PKG-INFO +4 -3
  3. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/_version.py +2 -2
  4. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/docs/conf.py +1 -0
  5. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/docs/contributing.md +5 -2
  6. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/pyproject.toml +3 -2
  7. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/src/spatialdata/models/models.py +15 -0
  8. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/tests/io/test_readwrite.py +42 -0
  9. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/.bumpversion.cfg +0 -0
  10. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/.editorconfig +0 -0
  11. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  12. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  13. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/.github/codecov.yml +0 -0
  14. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/.github/release.yml +0 -0
  15. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/.github/workflows/build_image.yml +0 -0
  16. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/.github/workflows/release.yaml +0 -0
  17. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/.github/workflows/test.yaml +0 -0
  18. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/.gitignore +0 -0
  19. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/.gitmodules +0 -0
  20. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/.mypy.ini +0 -0
  21. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/.readthedocs.yaml +0 -0
  22. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/CHANGELOG.md +0 -0
  23. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/Dockerfile +0 -0
  24. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/LICENSE +0 -0
  25. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/README.md +0 -0
  26. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/asv.conf.json +0 -0
  27. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/benchmarks/README.md +0 -0
  28. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/benchmarks/__init__.py +0 -0
  29. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/benchmarks/spatialdata_benchmark.py +0 -0
  30. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/benchmarks/utils.py +0 -0
  31. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/docs/Makefile +0 -0
  32. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/docs/_static/.gitkeep +0 -0
  33. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/docs/_static/css/custom.css +0 -0
  34. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/docs/_static/img/spatialdata_horizontal.png +0 -0
  35. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/docs/_templates/.gitkeep +0 -0
  36. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/docs/_templates/autosummary/base.rst +0 -0
  37. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/docs/_templates/autosummary/class.rst +0 -0
  38. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/docs/_templates/autosummary/function.rst +0 -0
  39. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/docs/api/SpatialData.md +0 -0
  40. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/docs/api/data_formats.md +0 -0
  41. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/docs/api/dataloader.md +0 -0
  42. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/docs/api/datasets.md +0 -0
  43. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/docs/api/io.md +0 -0
  44. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/docs/api/models.md +0 -0
  45. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/docs/api/models_utils.md +0 -0
  46. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/docs/api/operations.md +0 -0
  47. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/docs/api/testing.md +0 -0
  48. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/docs/api/transformations.md +0 -0
  49. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/docs/api/transformations_utils.md +0 -0
  50. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/docs/api.md +0 -0
  51. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/docs/changelog.md +0 -0
  52. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/docs/design_doc.md +0 -0
  53. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/docs/extensions/typed_returns.py +0 -0
  54. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/docs/glossary.md +0 -0
  55. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/docs/index.md +0 -0
  56. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/docs/installation.md +0 -0
  57. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/docs/references.bib +0 -0
  58. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/docs/references.md +0 -0
  59. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/docs/user_guide.md +0 -0
  60. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/src/spatialdata/__init__.py +0 -0
  61. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/src/spatialdata/__main__.py +0 -0
  62. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/src/spatialdata/_bridges/__init__.py +0 -0
  63. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/src/spatialdata/_core/__init__.py +0 -0
  64. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/src/spatialdata/_core/_deepcopy.py +0 -0
  65. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/src/spatialdata/_core/_elements.py +0 -0
  66. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/src/spatialdata/_core/_utils.py +0 -0
  67. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/src/spatialdata/_core/centroids.py +0 -0
  68. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/src/spatialdata/_core/concatenate.py +0 -0
  69. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/src/spatialdata/_core/data_extent.py +0 -0
  70. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/src/spatialdata/_core/operations/__init__.py +0 -0
  71. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/src/spatialdata/_core/operations/_utils.py +0 -0
  72. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/src/spatialdata/_core/operations/aggregate.py +0 -0
  73. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/src/spatialdata/_core/operations/map.py +0 -0
  74. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/src/spatialdata/_core/operations/rasterize.py +0 -0
  75. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/src/spatialdata/_core/operations/rasterize_bins.py +0 -0
  76. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/src/spatialdata/_core/operations/transform.py +0 -0
  77. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/src/spatialdata/_core/operations/vectorize.py +0 -0
  78. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/src/spatialdata/_core/query/__init__.py +0 -0
  79. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/src/spatialdata/_core/query/_utils.py +0 -0
  80. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/src/spatialdata/_core/query/relational_query.py +0 -0
  81. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/src/spatialdata/_core/query/spatial_query.py +0 -0
  82. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/src/spatialdata/_core/spatialdata.py +0 -0
  83. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/src/spatialdata/_core/validation.py +0 -0
  84. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/src/spatialdata/_docs.py +0 -0
  85. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/src/spatialdata/_io/__init__.py +0 -0
  86. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/src/spatialdata/_io/_utils.py +0 -0
  87. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/src/spatialdata/_io/format.py +0 -0
  88. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/src/spatialdata/_io/io_points.py +0 -0
  89. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/src/spatialdata/_io/io_raster.py +0 -0
  90. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/src/spatialdata/_io/io_shapes.py +0 -0
  91. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/src/spatialdata/_io/io_table.py +0 -0
  92. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/src/spatialdata/_io/io_zarr.py +0 -0
  93. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/src/spatialdata/_logging.py +0 -0
  94. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/src/spatialdata/_types.py +0 -0
  95. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/src/spatialdata/_utils.py +0 -0
  96. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/src/spatialdata/config.py +0 -0
  97. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/src/spatialdata/dataloader/__init__.py +0 -0
  98. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/src/spatialdata/dataloader/datasets.py +0 -0
  99. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/src/spatialdata/datasets.py +0 -0
  100. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/src/spatialdata/io/__init__.py +0 -0
  101. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/src/spatialdata/models/__init__.py +0 -0
  102. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/src/spatialdata/models/_accessor.py +0 -0
  103. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/src/spatialdata/models/_utils.py +0 -0
  104. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/src/spatialdata/testing.py +0 -0
  105. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/src/spatialdata/transformations/__init__.py +0 -0
  106. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/src/spatialdata/transformations/_utils.py +0 -0
  107. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/src/spatialdata/transformations/ngff/__init__.py +0 -0
  108. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/src/spatialdata/transformations/ngff/_utils.py +0 -0
  109. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/src/spatialdata/transformations/ngff/ngff_coordinate_system.py +0 -0
  110. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/src/spatialdata/transformations/ngff/ngff_transformations.py +0 -0
  111. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/src/spatialdata/transformations/operations.py +0 -0
  112. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/src/spatialdata/transformations/transformations.py +0 -0
  113. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/tests/__init__.py +0 -0
  114. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/tests/conftest.py +0 -0
  115. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/tests/core/__init__.py +0 -0
  116. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/tests/core/operations/__init__.py +0 -0
  117. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/tests/core/operations/test_aggregations.py +0 -0
  118. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/tests/core/operations/test_map.py +0 -0
  119. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/tests/core/operations/test_rasterize.py +0 -0
  120. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/tests/core/operations/test_rasterize_bins.py +0 -0
  121. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/tests/core/operations/test_spatialdata_operations.py +0 -0
  122. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/tests/core/operations/test_transform.py +0 -0
  123. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/tests/core/operations/test_vectorize.py +0 -0
  124. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/tests/core/query/__init__.py +0 -0
  125. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/tests/core/query/test_relational_query.py +0 -0
  126. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/tests/core/query/test_relational_query_match_sdata_to_table.py +0 -0
  127. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/tests/core/query/test_spatial_query.py +0 -0
  128. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/tests/core/test_centroids.py +0 -0
  129. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/tests/core/test_data_extent.py +0 -0
  130. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/tests/core/test_deepcopy.py +0 -0
  131. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/tests/core/test_get_attrs.py +0 -0
  132. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/tests/core/test_validation.py +0 -0
  133. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/tests/data/multipolygon.json +0 -0
  134. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/tests/data/points.json +0 -0
  135. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/tests/data/polygon.json +0 -0
  136. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/tests/dataloader/__init__.py +0 -0
  137. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/tests/dataloader/test_datasets.py +0 -0
  138. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/tests/datasets/__init__.py +0 -0
  139. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/tests/datasets/test_datasets.py +0 -0
  140. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/tests/io/__init__.py +0 -0
  141. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/tests/io/test_attrs_io.py +0 -0
  142. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/tests/io/test_format.py +0 -0
  143. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/tests/io/test_metadata.py +0 -0
  144. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/tests/io/test_multi_table.py +0 -0
  145. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/tests/io/test_partial_read.py +0 -0
  146. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/tests/io/test_pyramids_performance.py +0 -0
  147. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/tests/io/test_utils.py +0 -0
  148. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/tests/models/__init__.py +0 -0
  149. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/tests/models/test_accessor.py +0 -0
  150. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/tests/models/test_models.py +0 -0
  151. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/tests/transformations/__init__.py +0 -0
  152. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/tests/transformations/ngff/__init__.py +0 -0
  153. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/tests/transformations/ngff/conftest.py +0 -0
  154. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/tests/transformations/ngff/test_ngff_coordinate_system.py +0 -0
  155. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/tests/transformations/ngff/test_ngff_transformations.py +0 -0
  156. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/tests/transformations/test_transformations.py +0 -0
  157. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/tests/transformations/test_transformations_utils.py +0 -0
  158. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/tests/utils/__init__.py +0 -0
  159. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/tests/utils/test_element_utils.py +0 -0
  160. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/tests/utils/test_sanitize.py +0 -0
  161. {spatialdata-0.7.0.dev1 → spatialdata-0.7.1}/tests/utils/test_testing.py +0 -0
@@ -9,7 +9,7 @@ ci:
9
9
  skip: []
10
10
  repos:
11
11
  - repo: https://github.com/rbubley/mirrors-prettier
12
- rev: v3.7.4
12
+ rev: v3.8.1
13
13
  hooks:
14
14
  - id: prettier
15
15
  exclude: ^.github/workflows/test.yaml
@@ -20,7 +20,7 @@ repos:
20
20
  additional_dependencies: [numpy, types-requests]
21
21
  exclude: tests/|docs/
22
22
  - repo: https://github.com/astral-sh/ruff-pre-commit
23
- rev: v0.14.10
23
+ rev: v0.14.14
24
24
  hooks:
25
25
  - id: ruff
26
26
  args: [--fix, --exit-non-zero-on-fix]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: spatialdata
3
- Version: 0.7.0.dev1
3
+ Version: 0.7.1
4
4
  Summary: Spatial data format.
5
5
  Project-URL: Documentation, https://spatialdata.scverse.org/en/latest
6
6
  Project-URL: Source, https://github.com/scverse/spatialdata.git
@@ -42,7 +42,7 @@ Requires-Dist: anndata>=0.9.1
42
42
  Requires-Dist: annsel>=0.1.2
43
43
  Requires-Dist: click
44
44
  Requires-Dist: dask-image
45
- Requires-Dist: dask>=2025.2.0
45
+ Requires-Dist: dask<2026.1.2,>=2025.2.0
46
46
  Requires-Dist: datashader
47
47
  Requires-Dist: fsspec[http,s3]
48
48
  Requires-Dist: geopandas>=0.14
@@ -56,7 +56,7 @@ Requires-Dist: pooch
56
56
  Requires-Dist: pyarrow
57
57
  Requires-Dist: rich
58
58
  Requires-Dist: scikit-image
59
- Requires-Dist: scipy
59
+ Requires-Dist: scipy!=1.17.0
60
60
  Requires-Dist: setuptools
61
61
  Requires-Dist: shapely>=2.0.1
62
62
  Requires-Dist: spatial-image>=1.2.3
@@ -68,6 +68,7 @@ Requires-Dist: xarray>=2024.10.0
68
68
  Requires-Dist: zarr>=3.0.0
69
69
  Provides-Extra: benchmark
70
70
  Requires-Dist: asv; extra == 'benchmark'
71
+ Requires-Dist: memray; extra == 'benchmark'
71
72
  Provides-Extra: dev
72
73
  Requires-Dist: bump2version; extra == 'dev'
73
74
  Requires-Dist: sentry-prevent-cli; extra == 'dev'
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '0.7.0.dev1'
32
- __version_tuple__ = version_tuple = (0, 7, 0, 'dev1')
31
+ __version__ = version = '0.7.1'
32
+ __version_tuple__ = version_tuple = (0, 7, 1)
33
33
 
34
34
  __commit_id__ = commit_id = None
@@ -123,6 +123,7 @@ exclude_patterns = [
123
123
  "tutorials/notebooks/notebooks/developers_resources/storage_format/Readme.md",
124
124
  "tutorials/notebooks/notebooks/examples/technology_stereoseq.ipynb",
125
125
  "tutorials/notebooks/notebooks/examples/technology_curio.ipynb",
126
+ "tutorials/notebooks/notebooks/examples/technology_cosmx.ipynb",
126
127
  "tutorials/notebooks/notebooks/examples/stereoseq_data/*",
127
128
  ]
128
129
  # Ignore warnings.
@@ -74,6 +74,10 @@ Additionally, there's a CI job that tests against pre-releases of all dependenci
74
74
 
75
75
  By including this additional information, the document now provides a more comprehensive overview of the continuous integration process related to testing.
76
76
 
77
+ ### Integration testing
78
+
79
+ Cross-repo integration testing is available in the [spatialdata-integration-testing](https://github.com/scverse/spatialdata-integration-testing/) repo. Please follow the instructions in the Readme. For questions ask Luca.
80
+
77
81
  ## Publishing a release
78
82
 
79
83
  ### Updating the version number
@@ -87,6 +91,7 @@ Before making a release, you need to update the version number. Please adhere to
87
91
  > 3. PATCH version when you make backwards compatible bug fixes.
88
92
  >
89
93
  > Additional labels for pre-release and build metadata are available as extensions to the MAJOR.MINOR.PATCH format.
94
+ > For pre-release please use the aX suffix, such as v0.7.0a0, v0.7.0a1. Do not use the devX suffix since it doesn't support multiple incremental versions.
90
95
 
91
96
  You can find the [labels for pre-release in this page](https://packaging.python.org/en/latest/discussions/versioning/#valid-version-numbers).
92
97
 
@@ -97,8 +102,6 @@ If you use `bump2version`, you can run one of the following commands in the root
97
102
  bump2version patch
98
103
  bump2version minor
99
104
  bump2version major
100
- # if you want to create a pre-release
101
- bump2version --new-version 1.2.0rc1
102
105
  ```
103
106
 
104
107
  Once you are done, run
@@ -26,7 +26,7 @@ dependencies = [
26
26
  "annsel>=0.1.2",
27
27
  "click",
28
28
  "dask-image",
29
- "dask>=2025.2.0",
29
+ "dask>=2025.2.0,<2026.1.2",
30
30
  "datashader",
31
31
  "fsspec[s3,http]",
32
32
  "geopandas>=0.14",
@@ -43,7 +43,7 @@ dependencies = [
43
43
  "shapely>=2.0.1",
44
44
  "spatial_image>=1.2.3",
45
45
  "scikit-image",
46
- "scipy",
46
+ "scipy!=1.17.0",
47
47
  "typing_extensions>=4.8.0",
48
48
  "universal_pathlib>=0.2.6",
49
49
  "xarray>=2024.10.0",
@@ -78,6 +78,7 @@ docs = [
78
78
  ]
79
79
  benchmark = [
80
80
  "asv",
81
+ "memray",
81
82
  ]
82
83
  torch = [
83
84
  "torch"
@@ -1061,6 +1061,21 @@ class TableModel:
1061
1061
  if len(set(expected_regions).symmetric_difference(set(found_regions))) > 0:
1062
1062
  raise ValueError(f"Regions in the AnnData object and `{attr[self.REGION_KEY_KEY]}` do not match.")
1063
1063
 
1064
+ # Warning for object/string columns with NaN in region_key or instance_key
1065
+ instance_key = attr[self.INSTANCE_KEY]
1066
+ region_key = attr[self.REGION_KEY_KEY]
1067
+ for key_name, key_value in [("region_key", region_key), ("instance_key", instance_key)]:
1068
+ if key_value in data.obs:
1069
+ col = data.obs[key_value]
1070
+ col_dtype = col.dtype
1071
+ if (col_dtype == "object" or pd.api.types.is_string_dtype(col_dtype)) and col.isna().any():
1072
+ logger.warning(
1073
+ f"The {key_name} column '{key_value}' is of {col_dtype} type and contains NaN values. "
1074
+ "After writing and reading with AnnData, NaN values may (depending on the AnnData version) "
1075
+ "be converted to strings. This may cause issues when matching instances across read/write "
1076
+ "cycles."
1077
+ )
1078
+
1064
1079
  def validate(
1065
1080
  self,
1066
1081
  data: AnnData,
@@ -1065,3 +1065,45 @@ def test_read_sdata(tmp_path: Path, points: SpatialData) -> None:
1065
1065
  assert_spatial_data_objects_are_identical(sdata_from_path, sdata_from_str)
1066
1066
  assert_spatial_data_objects_are_identical(sdata_from_path, sdata_from_upath)
1067
1067
  assert_spatial_data_objects_are_identical(sdata_from_path, sdata_from_zarr_group)
1068
+
1069
+
1070
+ def test_sdata_with_nan_in_obs() -> None:
1071
+ """Test writing SpatialData with mixed string/NaN values in obs works correctly.
1072
+
1073
+ Regression test for https://github.com/scverse/spatialdata/issues/399
1074
+ Previously this raised TypeError: expected unicode string, found nan.
1075
+ Now the write succeeds, though NaN values in object-dtype columns are
1076
+ converted to the string "nan" after round-trip.
1077
+ """
1078
+ from spatialdata.models import TableModel
1079
+
1080
+ table = TableModel.parse(
1081
+ AnnData(
1082
+ obs=pd.DataFrame(
1083
+ {
1084
+ "region": ["region1", "region2"],
1085
+ "instance": [0, 0],
1086
+ "column_only_region1": ["string", np.nan],
1087
+ "column_only_region2": [np.nan, 3],
1088
+ }
1089
+ )
1090
+ ),
1091
+ region_key="region",
1092
+ instance_key="instance",
1093
+ region=["region1", "region2"],
1094
+ )
1095
+ sdata = SpatialData(tables={"table": table})
1096
+ assert sdata["table"].obs["column_only_region1"].iloc[1] is np.nan
1097
+ assert np.isnan(sdata["table"].obs["column_only_region2"].iloc[0])
1098
+
1099
+ with tempfile.TemporaryDirectory() as tmpdir:
1100
+ path = os.path.join(tmpdir, "data.zarr")
1101
+ sdata.write(path)
1102
+
1103
+ sdata2 = SpatialData.read(path)
1104
+ assert "column_only_region1" in sdata2["table"].obs.columns
1105
+ assert sdata2["table"].obs["column_only_region1"].iloc[0] == "string"
1106
+ assert sdata2["table"].obs["column_only_region2"].iloc[1] == 3
1107
+ # After round-trip, NaN in object-dtype column becomes string "nan"
1108
+ assert sdata2["table"].obs["column_only_region1"].iloc[1] == "nan"
1109
+ assert np.isnan(sdata2["table"].obs["column_only_region2"].iloc[0])
File without changes
File without changes
File without changes
File without changes
File without changes