Skip to content

Commit 9dc744d

Browse files
authored
Fix incorrect Group.nmembers for consolidated metadata (#3287)
1 parent b877f89 commit 9dc744d

File tree

3 files changed

+23
-1
lines changed

3 files changed

+23
-1
lines changed

changes/3287.bugfix.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fixes Group.nmembers() ignoring depth when using consolidated metadata.

src/zarr/core/group.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1307,7 +1307,18 @@ async def nmembers(
13071307
# check if we can use consolidated metadata, which requires that we have non-None
13081308
# consolidated metadata at all points in the hierarchy.
13091309
if self.metadata.consolidated_metadata is not None:
1310-
return len(self.metadata.consolidated_metadata.flattened_metadata)
1310+
if max_depth is not None and max_depth < 0:
1311+
raise ValueError(f"max_depth must be None or >= 0. Got '{max_depth}' instead")
1312+
if max_depth is None:
1313+
return len(self.metadata.consolidated_metadata.flattened_metadata)
1314+
else:
1315+
return len(
1316+
[
1317+
x
1318+
for x in self.metadata.consolidated_metadata.flattened_metadata
1319+
if x.count("/") <= max_depth
1320+
]
1321+
)
13111322
# TODO: consider using aioitertools.builtins.sum for this
13121323
# return await aioitertools.builtins.sum((1 async for _ in self.members()), start=0)
13131324
n = 0

tests/test_group.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1118,12 +1118,22 @@ async def test_group_members_async(store: Store, consolidated_metadata: bool) ->
11181118
"consolidated_metadata",
11191119
None,
11201120
)
1121+
# test depth=0
1122+
nmembers = await group.nmembers(max_depth=0)
1123+
assert nmembers == 2
1124+
# test depth=1
1125+
nmembers = await group.nmembers(max_depth=1)
1126+
assert nmembers == 4
1127+
# test depth=None
11211128
all_children = sorted(
11221129
[x async for x in group.members(max_depth=None)], key=operator.itemgetter(0)
11231130
)
11241131
assert len(all_children) == 4
11251132
nmembers = await group.nmembers(max_depth=None)
11261133
assert nmembers == 4
1134+
# test depth<0
1135+
with pytest.raises(ValueError, match="max_depth"):
1136+
await group.nmembers(max_depth=-1)
11271137

11281138

11291139
async def test_require_group(store: LocalStore | MemoryStore, zarr_format: ZarrFormat) -> None:

0 commit comments

Comments
 (0)