From 484a62f6faf62cd075bf0a8be48124b8e6c59805 Mon Sep 17 00:00:00 2001 From: Ian Hunt-Isaak Date: Thu, 12 Feb 2026 17:53:00 -0500 Subject: [PATCH 1/2] TEST: fix group selection for delete --- src/zarr/testing/stateful.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/zarr/testing/stateful.py b/src/zarr/testing/stateful.py index c363c13983..17ed0bb7ee 100644 --- a/src/zarr/testing/stateful.py +++ b/src/zarr/testing/stateful.py @@ -340,13 +340,12 @@ def delete_array_using_del(self, data: DataObject) -> None: self.all_arrays.remove(array_path) @precondition(lambda self: self.store.supports_deletes) - @precondition(lambda self: len(self.all_groups) >= 2) # fixme don't delete root + @precondition(lambda self: bool(self.all_groups)) @rule(data=st.data()) def delete_group_using_del(self, data: DataObject) -> None: - # ensure that we don't include the root group in the list of member names that we try - # to delete - member_names = tuple(filter(lambda v: "/" in v, sorted(self.all_groups))) - group_path = data.draw(st.sampled_from(member_names), label="Group deletion target") + group_path = data.draw( + st.sampled_from(sorted(self.all_groups)), label="Group deletion target" + ) prefix, group_name = split_prefix_name(group_path) note(f"Deleting group '{group_path=!r}', {prefix=!r}, {group_name=!r} using delete") members = zarr.open_group(store=self.model, path=group_path).members(max_depth=None) From 0137a741e6c07fe8a0323be86e7f7272d8d5d1e7 Mon Sep 17 00:00:00 2001 From: Ian Hunt-Isaak Date: Thu, 12 Feb 2026 18:02:00 -0500 Subject: [PATCH 2/2] even more safety --- src/zarr/testing/stateful.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/zarr/testing/stateful.py b/src/zarr/testing/stateful.py index 17ed0bb7ee..394d024e93 100644 --- a/src/zarr/testing/stateful.py +++ b/src/zarr/testing/stateful.py @@ -340,11 +340,12 @@ def delete_array_using_del(self, data: DataObject) -> None: self.all_arrays.remove(array_path) @precondition(lambda self: self.store.supports_deletes) - @precondition(lambda self: bool(self.all_groups)) + @precondition(lambda self: bool(self.all_groups - {"", "/"})) @rule(data=st.data()) def delete_group_using_del(self, data: DataObject) -> None: group_path = data.draw( - st.sampled_from(sorted(self.all_groups)), label="Group deletion target" + st.sampled_from(sorted(self.all_groups - {"", "/"})), + label="Group deletion target", ) prefix, group_name = split_prefix_name(group_path) note(f"Deleting group '{group_path=!r}', {prefix=!r}, {group_name=!r} using delete") @@ -358,9 +359,7 @@ def delete_group_using_del(self, data: DataObject) -> None: group = zarr.open_group(store=store, path=prefix) group[group_name] # check that it exists del group[group_name] - if group_path != "/": - # The root group is always present - self.all_groups.remove(group_path) + self.all_groups.remove(group_path) # # --------------- assertions ----------------- # def check_group_arrays(self, group):