Skip to content

Commit 3e322ef

Browse files
committed
Fix typing for JSON objects
1 parent 7a9931b commit 3e322ef

File tree

2 files changed

+16
-6
lines changed

2 files changed

+16
-6
lines changed

src/zarr/core/metadata/v3.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -178,12 +178,12 @@ def parse_extra_fields(
178178

179179

180180
class RegularChunkGridMetadataConfig(TypedDict):
181-
chunk_shape: tuple[int, ...]
181+
chunk_shape: Sequence[int]
182182

183183

184184
class RectilinearChunkGridMetadataConfig(TypedDict):
185185
kind: Literal["inline"]
186-
chunk_shapes: tuple[RectilinearDimSpecJSON, ...]
186+
chunk_shapes: Sequence[RectilinearDimSpecJSON]
187187

188188

189189
RegularChunkGridMetadataJSON = NamedRequiredConfig[

tests/test_unified_chunk_grid.py

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
from zarr.core.common import compress_rle, expand_rle
2525
from zarr.core.metadata.v3 import (
2626
RectilinearChunkGridMetadata,
27+
RectilinearChunkGridMetadataJSON,
2728
RegularChunkGridMetadata,
2829
parse_chunk_grid,
2930
)
@@ -546,13 +547,13 @@ def test_rle_expand_rejects_invalid(rle_input: list[Any], match: str) -> None:
546547

547548
def test_expand_rle_bare_integer_floats_accepted() -> None:
548549
"""JSON parsers may emit 10.0 for the integer 10; expand_rle should handle it."""
549-
result = expand_rle([10.0, 20.0])
550+
result = expand_rle([10.0, 20.0]) # type: ignore[list-item]
550551
assert result == [10, 20]
551552

552553

553554
def test_expand_rle_pair_with_float_count() -> None:
554555
"""expand_rle accepts float repeat counts that are integer-valued"""
555-
result = expand_rle([[10, 3.0]])
556+
result = expand_rle([[10, 3.0]]) # type: ignore[list-item]
556557
assert result == [10, 10, 10]
557558

558559

@@ -679,6 +680,7 @@ def test_spec_integer_shorthand_per_dimension() -> None:
679680
"configuration": {"kind": "inline", "chunk_shapes": [4, [1, 2, 3]]},
680681
}
681682
meta = parse_chunk_grid(data)
683+
assert isinstance(meta, RectilinearChunkGridMetadata)
682684
g = ChunkGrid.from_sizes((6, 6), meta.chunk_shapes)
683685
assert _edges(g, 0) == (4, 4)
684686
assert _edges(g, 1) == (1, 2, 3)
@@ -691,6 +693,7 @@ def test_spec_mixed_rle_and_bare_integers() -> None:
691693
"configuration": {"kind": "inline", "chunk_shapes": [[[1, 3], 3]]},
692694
}
693695
meta = parse_chunk_grid(data)
696+
assert isinstance(meta, RectilinearChunkGridMetadata)
694697
g = ChunkGrid.from_sizes((6,), meta.chunk_shapes)
695698
assert _edges(g, 0) == (1, 1, 1, 3)
696699

@@ -702,6 +705,7 @@ def test_spec_overflow_chunks_allowed() -> None:
702705
"configuration": {"kind": "inline", "chunk_shapes": [[4, 4, 4]]},
703706
}
704707
meta = parse_chunk_grid(data)
708+
assert isinstance(meta, RectilinearChunkGridMetadata)
705709
g = ChunkGrid.from_sizes((6,), meta.chunk_shapes)
706710
assert _edges(g, 0) == (4, 4, 4)
707711

@@ -722,6 +726,7 @@ def test_spec_example() -> None:
722726
},
723727
}
724728
meta = parse_chunk_grid(data)
729+
assert isinstance(meta, RectilinearChunkGridMetadata)
725730
g = ChunkGrid.from_sizes((6, 6, 6, 6, 6), meta.chunk_shapes)
726731
assert _edges(g, 0) == (4, 4)
727732
assert _edges(g, 1) == (1, 2, 3)
@@ -774,6 +779,7 @@ def test_parse_chunk_grid_rectilinear_extent_mismatch_raises(
774779
"configuration": {"kind": "inline", "chunk_shapes": chunk_shapes},
775780
}
776781
meta = parse_chunk_grid(data)
782+
assert isinstance(meta, RectilinearChunkGridMetadata)
777783
with pytest.raises(ValueError, match=match):
778784
ChunkGrid.from_sizes(array_shape, meta.chunk_shapes)
779785

@@ -785,6 +791,7 @@ def test_parse_chunk_grid_rectilinear_extent_match_passes() -> None:
785791
"configuration": {"kind": "inline", "chunk_shapes": [[10, 20, 30], [25, 25]]},
786792
}
787793
meta = parse_chunk_grid(data)
794+
assert isinstance(meta, RectilinearChunkGridMetadata)
788795
g = ChunkGrid.from_sizes((60, 50), meta.chunk_shapes)
789796
assert g.grid_shape == (3, 2)
790797

@@ -796,6 +803,7 @@ def test_parse_chunk_grid_rectilinear_ndim_mismatch_raises() -> None:
796803
"configuration": {"kind": "inline", "chunk_shapes": [[10, 20], [25, 25]]},
797804
}
798805
meta = parse_chunk_grid(data)
806+
assert isinstance(meta, RectilinearChunkGridMetadata)
799807
with pytest.raises(ValueError, match="3 dimensions but chunk_sizes has 2"):
800808
ChunkGrid.from_sizes((30, 50, 100), meta.chunk_shapes)
801809

@@ -807,6 +815,7 @@ def test_parse_chunk_grid_rectilinear_rle_extent_validated() -> None:
807815
"configuration": {"kind": "inline", "chunk_shapes": [[[10, 5]], [[25, 2]]]},
808816
}
809817
meta = parse_chunk_grid(data)
818+
assert isinstance(meta, RectilinearChunkGridMetadata)
810819
g = ChunkGrid.from_sizes((50, 50), meta.chunk_shapes)
811820
assert g.grid_shape == (5, 2)
812821
with pytest.raises(ValueError, match="extent 100 exceeds sum of edges 50"):
@@ -2717,7 +2726,8 @@ def test_iter_chunk_regions_rectilinear() -> None:
27172726
],
27182727
)
27192728
def test_rectilinear_from_dict(
2720-
json_input: dict[str, Any], expected_chunk_shapes: tuple[int | tuple[int, ...], ...]
2729+
json_input: RectilinearChunkGridMetadataJSON,
2730+
expected_chunk_shapes: tuple[int | tuple[int, ...], ...],
27212731
) -> None:
27222732
"""RectilinearChunkGridMetadata.from_dict correctly parses all spec forms."""
27232733
grid = RectilinearChunkGridMetadata.from_dict(json_input)
@@ -2760,7 +2770,7 @@ def test_rectilinear_to_dict(
27602770
},
27612771
],
27622772
)
2763-
def test_rectilinear_roundtrip(json_input: dict[str, Any]) -> None:
2773+
def test_rectilinear_roundtrip(json_input: RectilinearChunkGridMetadataJSON) -> None:
27642774
"""from_dict -> to_dict -> from_dict produces the same grid."""
27652775
grid1 = RectilinearChunkGridMetadata.from_dict(json_input)
27662776
grid2 = RectilinearChunkGridMetadata.from_dict(grid1.to_dict())

0 commit comments

Comments
 (0)