Skip to content

zarr_metadata.pydantic

zarr_metadata.pydantic

Optional pydantic (v2) integration: field types over the core models.

Importing this module requires pydantic; the core package deliberately does not depend on it, so this module is never imported by zarr_metadata itself.

Each exported name is an Annotated field type over the corresponding core model class — the instances ARE the core classes, so values interoperate freely with non-pydantic code (equality, isinstance, nesting). Validation delegates to the library: a raw document routes through from_json (the single source of truth for validation and normalization, so pydantic's field-level coercion can never bypass it). A field type reads the fields of its document in the scope pydantic's validation context holds, as pydantic hands any validator its context: the context itself, when it is a Context, which every field type then reads in; or, when it is a mapping, its "zarr_metadata_context" item for the v3 field types and its "zarr_metadata_context_v2" item for the v2 ones, so a model holding both kinds of field names each format's scope; a format whose scope is not given reads in its own, CORE_AND_EXTENSIONS or CORE_V2:

TypeAdapter(zmp.ZarrV3ArrayMetadata).validate_python(document, context=SCOPE)
ArrayManifest.model_validate(data, context={"zarr_metadata_context": SCOPE})
Mixed.model_validate(data, context={"zarr_metadata_context": V3, "zarr_metadata_context_v2": V2})

An existing model instance passes through unchanged, as pydantic's does, and serialization emits the canonical document via to_json. A failed parse surfaces as a pydantic ValidationError with one line error per problem, as pydantic reports its own: its type the problem's kind, at the problem's loc under the field's, with the input found there and the problem's ctx (a message holding a ctx placeholder rides in the ctx as message, as _line_error says). Annotate a field with these types, not the core classes, which pydantic cannot build a schema for.

A node's attributes may hold NaN, Infinity or -Infinity, which the models read and write as zarr-python does. Pydantic writes JSON by its own rules, and by default writes such a number as null. A BaseModel holding one of these fields keeps it with ser_json_inf_nan="constants" in its model_config; a TypeAdapter over a field type takes no config, so write its value with the model's to_key_value instead.

Usage:

import zarr_metadata.pydantic as zmp

class ArrayManifest(BaseModel):
    path: str
    metadata: zmp.ZarrV3ArrayMetadata

Static type checkers see each field type as its core model class, so manifest.metadata is a zarr_metadata.model.ZarrV3ArrayMetadata.

CONTEXT_KEY module-attribute

CONTEXT_KEY: Final = 'zarr_metadata_context'

The key of a mapping validation context under which the scope the v3 field types read in sits.

CONTEXT_KEY_V2 module-attribute

CONTEXT_KEY_V2: Final = 'zarr_metadata_context_v2'

The key of a mapping validation context under which the scope the v2 field types read in sits.

ZarrV2ArrayMetadata module-attribute

ZarrV2ArrayMetadata = Annotated[
    InstanceOf[_model.ZarrV2ArrayMetadata],
    BeforeValidator(
        _read_in_scope(
            _model.ZarrV2ArrayMetadata,
            _model.ZarrV2ArrayMetadata.from_json,
            CORE_V2,
            CONTEXT_KEY_V2,
        ),
        json_schema_input_type=_ZarrV2ArrayMetadataSchema,
    ),
    PlainSerializer(
        _model.ZarrV2ArrayMetadata.to_json,
        return_type=_ZarrV2ArrayMetadataSchema,
    ),
]

Field type for a v2 array metadata document (merged .zarray + .zattrs form).

ZarrV2ConsolidatedMetadata module-attribute

ZarrV2ConsolidatedMetadata = Annotated[
    InstanceOf[_model.ZarrV2ConsolidatedMetadata],
    BeforeValidator(
        _read_in_scope(
            _model.ZarrV2ConsolidatedMetadata,
            _model.ZarrV2ConsolidatedMetadata.from_json,
            CORE_V2,
            CONTEXT_KEY_V2,
        ),
        json_schema_input_type=_ZarrV2ConsolidatedMetadataSchema,
    ),
    PlainSerializer(
        _model.ZarrV2ConsolidatedMetadata.to_json,
        return_type=_ZarrV2ConsolidatedMetadataSchema,
    ),
]

Field type for a v2 .zmetadata document.

ZarrV2GroupMetadata module-attribute

ZarrV2GroupMetadata = Annotated[
    InstanceOf[_model.ZarrV2GroupMetadata],
    BeforeValidator(
        _read_in_scope(
            _model.ZarrV2GroupMetadata,
            _model.ZarrV2GroupMetadata.from_json,
            CORE_V2,
            CONTEXT_KEY_V2,
        ),
        json_schema_input_type=_ZarrV2GroupMetadataSchema,
    ),
    PlainSerializer(
        _model.ZarrV2GroupMetadata.to_json,
        return_type=_ZarrV2GroupMetadataSchema,
    ),
]

Field type for a v2 group metadata document (merged .zgroup + .zattrs form).

ZarrV3ArrayMetadata module-attribute

ZarrV3ArrayMetadata = Annotated[
    InstanceOf[_model.ZarrV3ArrayMetadata],
    BeforeValidator(
        _read_in_scope(
            _model.ZarrV3ArrayMetadata,
            _model.ZarrV3ArrayMetadata.from_json,
            CORE_AND_EXTENSIONS,
            CONTEXT_KEY,
        ),
        json_schema_input_type=_ZarrV3ArrayMetadataSchema,
    ),
    PlainSerializer(
        _model.ZarrV3ArrayMetadata.to_json,
        return_type=_ZarrV3ArrayMetadataSchema,
    ),
]

Field type for a v3 array metadata document (zarr.json content).

ZarrV3ConsolidatedMetadata module-attribute

ZarrV3ConsolidatedMetadata = Annotated[
    InstanceOf[_model.ZarrV3ConsolidatedMetadata],
    BeforeValidator(
        _read_in_scope(
            _model.ZarrV3ConsolidatedMetadata,
            _model.ZarrV3ConsolidatedMetadata.from_json,
            CORE_AND_EXTENSIONS,
            CONTEXT_KEY,
        ),
        json_schema_input_type=_ZarrV3ConsolidatedMetadataSchema,
    ),
    PlainSerializer(
        _model.ZarrV3ConsolidatedMetadata.to_json,
        return_type=_ZarrV3ConsolidatedMetadataSchema,
    ),
]

Field type for v3 inline consolidated metadata.

ZarrV3GroupMetadata module-attribute

ZarrV3GroupMetadata = Annotated[
    InstanceOf[_model.ZarrV3GroupMetadata],
    BeforeValidator(
        _read_in_scope(
            _model.ZarrV3GroupMetadata,
            _model.ZarrV3GroupMetadata.from_json,
            CORE_AND_EXTENSIONS,
            CONTEXT_KEY,
        ),
        json_schema_input_type=_ZarrV3GroupMetadataSchema,
    ),
    PlainSerializer(
        _model.ZarrV3GroupMetadata.to_json,
        return_type=_ZarrV3GroupMetadataSchema,
    ),
]

Field type for a v3 group metadata document (zarr.json content).

__all__ module-attribute

__all__ = [
    "CONTEXT_KEY",
    "CONTEXT_KEY_V2",
    "ZarrV2ArrayMetadata",
    "ZarrV2ConsolidatedMetadata",
    "ZarrV2GroupMetadata",
    "ZarrV3ArrayMetadata",
    "ZarrV3ConsolidatedMetadata",
    "ZarrV3GroupMetadata",
]