Skip to content

Commit 3182e23

Browse files
committed
chore: clarify extension fields and rename type
1 parent 32ce2bf commit 3182e23

6 files changed

Lines changed: 45 additions & 18 deletions

File tree

packages/zarr-metadata/src/zarr_metadata/__init__.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@
66
DataTypeMetadataV2,
77
)
88
from zarr_metadata.v2.codec import CodecMetadataV2
9+
from zarr_metadata.v2.consolidated import ConsolidatedMetadataV2
910
from zarr_metadata.v2.group import GroupMetadataV2
1011
from zarr_metadata.v3._common import MetadataFieldV3
11-
from zarr_metadata.v3.array import ArrayMetadataV3, ExtraFieldV3
12+
from zarr_metadata.v3.array import ArrayMetadataV3, ExtensionFieldV3
13+
from zarr_metadata.v3.consolidated import ConsolidatedMetadataV3
1214
from zarr_metadata.v3.group import GroupMetadataV3
1315

1416
__version__ = "0.1.0"
@@ -22,8 +24,10 @@
2224
"ArrayMetadataV3",
2325
"ArrayOrderV2",
2426
"CodecMetadataV2",
27+
"ConsolidatedMetadataV2",
28+
"ConsolidatedMetadataV3",
2529
"DataTypeMetadataV2",
26-
"ExtraFieldV3",
30+
"ExtensionFieldV3",
2731
"GroupMetadataV2",
2832
"GroupMetadataV3",
2933
"MetadataFieldV3",
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
"""Zarr v3 metadata types."""
22

33
from zarr_metadata.v3._common import MetadataFieldV3
4-
from zarr_metadata.v3.array import ArrayMetadataV3, ExtraFieldV3
4+
from zarr_metadata.v3.array import ArrayMetadataV3, ExtensionFieldV3
55
from zarr_metadata.v3.consolidated import ConsolidatedMetadataV3
66
from zarr_metadata.v3.group import GroupMetadataV3
77

88
__all__ = [
99
"ArrayMetadataV3",
1010
"ConsolidatedMetadataV3",
11-
"ExtraFieldV3",
11+
"ExtensionFieldV3",
1212
"GroupMetadataV3",
1313
"MetadataFieldV3",
1414
]

packages/zarr-metadata/src/zarr_metadata/v3/array.py

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,36 @@
88
from zarr_metadata.v3._common import MetadataFieldV3
99

1010

11-
class ExtraFieldV3(TypedDict, extra_items=object): # type: ignore[call-arg]
11+
class ExtensionFieldV3(TypedDict, extra_items=object): # type: ignore[call-arg]
1212
"""
13-
Extra field on a v3 array metadata document.
14-
15-
Extras must include `must_understand: false` and may carry arbitrary
16-
additional JSON data.
13+
Required shape of any extension field on a v3 metadata document.
14+
15+
The Zarr v3 spec permits extra keys on array and group metadata
16+
documents, provided each value is an object with `must_understand`
17+
set to `False`. This TypedDict captures that constraint and is used
18+
as the `extra_items=` parameter on `ArrayMetadataV3` and `GroupMetadataV3`.
19+
20+
Spec interpretation: this type follows the original Zarr v3.0 reading
21+
of the spec, under which any object with `must_understand: false` is a
22+
valid extension field. The v3.1 spec rewrite added language requiring
23+
extension fields to also include a `name: str` key (the "Extension
24+
definition" form). Under the strict v3.1 reading, real-world extension
25+
fields written by zarr-python and zarrs (notably `consolidated_metadata`,
26+
which has no `name` field) are out of spec. The community consensus at
27+
the time of writing is that this is a regression to be reverted; this
28+
package models the v3.0 / pre-revert interpretation. See
29+
https://github.com/zarr-developers/zarr-specs/issues/371 for the
30+
ongoing discussion.
1731
"""
1832

1933
must_understand: Literal[False]
2034

2135

22-
class ArrayMetadataV3(TypedDict, extra_items=ExtraFieldV3): # type: ignore[call-arg]
36+
class ArrayMetadataV3(TypedDict, extra_items=ExtensionFieldV3): # type: ignore[call-arg]
2337
"""
2438
Zarr v3 array metadata document (the `zarr.json` content for an array).
2539
26-
Extra keys are permitted if they conform to `ExtraFieldV3`.
40+
Extra keys are permitted if they conform to `ExtensionFieldV3`.
2741
2842
See https://zarr-specs.readthedocs.io/en/latest/v3/core/index.html#array-metadata
2943
"""
@@ -43,5 +57,5 @@ class ArrayMetadataV3(TypedDict, extra_items=ExtraFieldV3): # type: ignore[call
4357

4458
__all__ = [
4559
"ArrayMetadataV3",
46-
"ExtraFieldV3",
60+
"ExtensionFieldV3",
4761
]

packages/zarr-metadata/src/zarr_metadata/v3/consolidated.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,17 @@
22
33
There is no Zarr v3 specification for consolidated metadata. This module
44
models the inline-on-group convention used by the reference Python
5-
implementation, where consolidated metadata is embedded as an extra field
6-
on a group's `zarr.json`.
5+
implementation (and zarrs), where consolidated metadata is embedded as
6+
an extension field on a group's `zarr.json`.
7+
8+
The shape modeled here (`{kind, must_understand, metadata}` with no `name`
9+
field) reflects the original Zarr v3.0 reading of the extension-field
10+
rules. Under the strict Zarr v3.1 reading, every extension field must
11+
also include a `name: str` key, which would make this shape — and every
12+
real-world consolidated metadata document in the wild — out of spec.
13+
See `ExtensionFieldV3` and
14+
https://github.com/zarr-developers/zarr-specs/issues/371 for the
15+
ongoing discussion.
716
"""
817

918
from collections.abc import Mapping

packages/zarr-metadata/src/zarr_metadata/v3/group.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,14 @@
88

99
from typing_extensions import TypedDict
1010

11-
from zarr_metadata.v3.array import ExtraFieldV3
11+
from zarr_metadata.v3.array import ExtensionFieldV3
1212

1313

14-
class GroupMetadataV3(TypedDict, extra_items=ExtraFieldV3): # type: ignore[call-arg]
14+
class GroupMetadataV3(TypedDict, extra_items=ExtensionFieldV3): # type: ignore[call-arg]
1515
"""
1616
Zarr v3 group metadata document (the `zarr.json` content for a group).
1717
18-
Extra keys are permitted if they conform to `ExtraFieldV3`.
18+
Extra keys are permitted if they conform to `ExtensionFieldV3`.
1919
2020
See https://zarr-specs.readthedocs.io/en/latest/v3/core/index.html#group-metadata
2121
"""

packages/zarr-metadata/tests/v3/array/with_extra_field.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,6 @@
1616
],
1717
"my_custom_extension": {
1818
"must_understand": false,
19-
"purpose": "exercise the extra_items=ExtraFieldV3 path"
19+
"purpose": "exercise the extra_items=ExtensionFieldV3 path"
2020
}
2121
}

0 commit comments

Comments
 (0)