From ba46b8b4b26f6c5f78c1844b9e4c3f6fbbc13947 Mon Sep 17 00:00:00 2001 From: anon Date: Fri, 7 Aug 2026 15:53:23 +0200 Subject: [PATCH] fix(labels): restore render-time float-dtype guard for spatialdata <0.8 #758 removed the render-time float-dtype guard on the assumption that spatialdata always rejects float labels at the model boundary. That only holds on spatialdata >=0.8; the library still supports spatialdata >=0.3, where float labels parse fine and would again crash deep in skimage with a cryptic TypeError (#606). Restore the guard so the clear error holds across the whole supported range. - render.py: re-add the float-dtype ValueError guard. - test_render_labels.py: re-add test_render_labels_rejects_float_dtype in a version-agnostic form (assert an "integer dtype" error is raised at whichever layer enforces it: spatialdata on >=0.8, our guard on <0.8). - test_render_shapes.py: sort queried shapes before render so the overlap draw order (and the baseline) is stable across spatialdata's query-order change in 0.8; regenerate the baseline accordingly. The measure_obs float coverage stays as the version-independent _stream_label_centroid_stats unit test added in #758. --- src/spatialdata_plot/pl/render.py | 12 +++++++++--- ...th_annotation_despite_random_shuffling.png | Bin 27341 -> 27353 bytes tests/pl/test_render_labels.py | 18 ++++++++++++++++++ tests/pl/test_render_shapes.py | 6 ++++++ 4 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/spatialdata_plot/pl/render.py b/src/spatialdata_plot/pl/render.py index 230066f8..94f530ff 100644 --- a/src/spatialdata_plot/pl/render.py +++ b/src/spatialdata_plot/pl/render.py @@ -2189,9 +2189,15 @@ def _render_labels( is_label=True, ) - # Label dtype is validated upstream: spatialdata rejects non-integer label rasters at the model - # boundary (parse / SpatialData construction / __setitem__), so a validly built element always - # reaches here with an integer dtype. No local guard needed (see #606, resolved upstream). + # spatialdata >= 0.8 rejects non-integer label rasters at the model boundary, but the library + # still supports spatialdata >= 0.3, where float labels parse fine and would otherwise crash + # deep in skimage with a cryptic TypeError (#606). Keep a clear render-time guard for that range. + if np.issubdtype(label.dtype, np.floating): + raise ValueError( + f"Label element '{element}' has dtype {label.dtype}. Label arrays must use an " + f"integer dtype (e.g. int32 or uint16). Cast before plotting, e.g.:\n" + f" sdata['{element}'] = sdata['{element}'].astype('int32')" + ) # rasterize spatial image if necessary to speed up performance if rasterize: diff --git a/tests/_images/Shapes_can_plot_queried_with_annotation_despite_random_shuffling.png b/tests/_images/Shapes_can_plot_queried_with_annotation_despite_random_shuffling.png index 77d1ac75e39337a4591b549254af28a769b44e0c..ff728798fe8a782dc28061f399722ccf640d67d8 100644 GIT binary patch literal 27353 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 diff --git a/tests/pl/test_render_labels.py b/tests/pl/test_render_labels.py index 447b9e02..725ab23a 100644 --- a/tests/pl/test_render_labels.py +++ b/tests/pl/test_render_labels.py @@ -719,6 +719,24 @@ def test_render_labels_lognorm_with_zeros_does_not_crash(sdata_blobs: SpatialDat plt.close(fig) +@pytest.mark.parametrize("dtype", [np.float16, np.float32, np.float64]) +def test_render_labels_rejects_float_dtype(dtype): + # Regression test for #606: float-dtype labels must raise a clear "integer dtype" ValueError, + # not a cryptic skimage TypeError. spatialdata>=0.8 enforces this at model validation + # (parse/construction); on older spatialdata (still supported, >=0.3) our render-time guard is + # the safety net. The supported stack must reject them at one of those layers either way. + arr = np.zeros((20, 20), dtype=dtype) + arr[3:8, 3:8] = 1 + arr[12:17, 12:17] = 2 + fig, ax = plt.subplots() + try: + with pytest.raises(ValueError, match="integer dtype"): + sdata = SpatialData(labels={"lbl": Labels2DModel.parse(arr, dims=["y", "x"])}) + sdata.pl.render_labels("lbl").pl.show(ax=ax) + finally: + plt.close(fig) + + def test_render_labels_rejects_background_instance_id_in_table(): # Regression test for #607: table row with instance_id=0 (background) # used to crash with obnscure error. diff --git a/tests/pl/test_render_shapes.py b/tests/pl/test_render_shapes.py index 9041c902..a84ebe42 100644 --- a/tests/pl/test_render_shapes.py +++ b/tests/pl/test_render_shapes.py @@ -564,6 +564,12 @@ def test_plot_can_plot_queried_with_annotation_despite_random_shuffling(self, sd filter_table=True, ) + # spatialdata's query returns the cropped geometries in a version-dependent order (0.8's + # relational-query refactor reorders them), which flips the draw/z-order of the overlapping + # circles and so the rendered image. Sort by index for a deterministic draw order, so the + # baseline matches across the supported spatialdata range. + sdata_cropped["blobs_circles"] = sdata_cropped["blobs_circles"].sort_index() + sdata_cropped.pl.render_shapes("blobs_circles", color="annotation").pl.show() def test_plot_can_color_two_shapes_elements_by_annotation(self, sdata_blobs: SpatialData):