Skip to content
Merged
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
6 changes: 3 additions & 3 deletions src/spatialdata/_core/_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -158,9 +158,9 @@ def get_unique_name(name: str, attr: str, is_dataframe_column: bool = False) ->
# Handle other attributes
for attr in ("obsm", "obsp", "varm", "varp", "uns", "layers"):
d = getattr(sanitized, attr)
new_keys = {old: get_unique_name(old, attr) for old in d}
# Create new dictionary with sanitized keys
new_dict = {new_keys[old]: value for old, value in d.items()}
# None is a valid key in layers (anndata >= 0.13: represents X); skip sanitizing it
new_keys = {old: get_unique_name(old, attr) for old in d if old is not None}
new_dict = {(new_keys[old] if old is not None else old): value for old, value in d.items()}
setattr(sanitized, attr, new_dict)

return None if inplace else sanitized
16 changes: 16 additions & 0 deletions tests/utils/test_sanitize.py
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,22 @@ def test_sanitize_table_uns_and_layers():
assert list(sanitized.layers.keys()) == ["bad_layer"]


def test_sanitize_table_layers_preserves_x():
# anndata >= 0.13 stores X as layers[None]; sanitize_table must not corrupt it
X = np.array([[0, 1], [1, 0]])
ad = AnnData(X=X, obs=pd.DataFrame({"x": [1, 2]}, index=["0", "1"]), var=pd.DataFrame(index=["v1", "v2"]))
ad.layers["bad#layer"] = np.array([[1, 0], [0, 1]])
none_in_layers_before = None in ad.layers
sanitized = sanitize_table(ad, inplace=False)
assert sanitized.X is not None
np.testing.assert_array_equal(sanitized.X, X)
string_keys = [k for k in sanitized.layers if k is not None]
assert string_keys == ["bad_layer"]
# If anndata stores X as layers[None], the None key must survive sanitization
if none_in_layers_before:
assert None in sanitized.layers


def test_sanitize_table_empty_returns_empty():
ad = AnnData()
sanitized = sanitize_table(ad, inplace=False)
Expand Down
Loading