diff --git a/docs/user-guide/extending.rst b/docs/user-guide/extending.rst index 6c625df58..637981b84 100644 --- a/docs/user-guide/extending.rst +++ b/docs/user-guide/extending.rst @@ -6,12 +6,12 @@ Zarr-Python 3 was designed to be extensible. This means that you can extend the library by writing custom classes and plugins. Currently, Zarr can be extended in the following ways: -Writing custom stores ---------------------- +Custom stores +------------- -Writing custom codecs ---------------------- +Custom codecs +------------- There are three types of codecs in Zarr: array-to-array, array-to-bytes, and bytes-to-bytes. Array-to-array codecs are used to transform the n-dimensional array data before serializing @@ -23,15 +23,16 @@ of the array data. Examples include compression codecs, such as :class:`zarr.codecs.ZstdCodec`, and codecs that add a checksum to the bytestream, such as :class:`zarr.codecs.Crc32cCodec`. -Custom codecs for Zarr are implemented as classes that inherit from the relevant base class, -see :class:`zarr.abc.codecs.ArrayArrayCodec`, :class:`zarr.abc.codecs.ArrayBytesCodec` and -:class:`zarr.abc.codecs.BytesBytesCodec`. Most custom codecs should implemented the +Custom codecs for Zarr are implemented by subclassing the relevant base class, see +:class:`zarr.abc.codec.ArrayArrayCodec`, :class:`zarr.abc.codec.ArrayBytesCodec` and +:class:`zarr.abc.codec.BytesBytesCodec`. Most custom codecs should implemented the ``_encode_single`` and ``_decode_single`` methods. These methods operate on single chunks -of the array data. Custom codecs can also implement the ``encode`` and ``decode`` methods, -which operate on batches of chunks, in case the codec is intended to implement its own -batch processing. +of the array data. Alternatively, custom codecs can implement the ``encode`` and ``decode`` +methods, which operate on batches of chunks, in case the codec is intended to implement +its own batch processing. + +Custom codecs should also implement the following methods: -Custom codecs should also implement these methods: - ``compute_encoded_size``, which returns the byte size of the encoded data given the byte size of the original data. It should raise ``NotImplementedError`` for codecs with variable-sized outputs, such as compression codecs. @@ -43,10 +44,12 @@ Custom codecs should also implement these methods: codec configuration metadata from the array metadata. To use custom codecs in Zarr, they need to be registered using the -`entrypoint mechanism _`. +`entrypoint mechanism `_. Commonly, entrypoints are declared in the ``pyproject.toml`` of your package under the -``[project.entry-points]`` section. Zarr will automatically discover and load all codecs -registered with the entrypoint mechanism from imported modules. +``[project.entry-points."zarr.codecs"]`` section. Zarr will automatically discover and +load all codecs registered with the entrypoint mechanism from imported modules. + +.. code-block:: toml [project.entry-points."zarr.codecs"] "custompackage.fancy_codec" = "custompackage:FancyCodec" @@ -56,9 +59,9 @@ strongly recommended to prefix the codec identifier with a unique name. For exam the codecs from ``numcodecs`` are prefixed with ``numcodecs.``, e.g. ``numcodecs.delta``. .. note:: - Note that the extension mechanism for the Zarr specification version 3 is still - under development. Requirements for custom codecs including the choice of codec - identifiers might change in the future. + Note that the extension mechanism for the Zarr version 3 is still under development. + Requirements for custom codecs including the choice of codec identifiers might + change in the future. It is also possible to register codecs as replacements for existing codecs. This might be useful for providing specialized implementations, such as GPU-based codecs. In case of @@ -69,10 +72,14 @@ TODO: Link to documentation of :mod:`zarr.core.config` .. note:: This sections explains how custom codecs can be created for Zarr version 3. For Zarr - version 2, codecs should implement the - ```numcodecs.abc.Codec`` _` - base class. + version 2, codecs should subclass the + `numcodecs.abc.Codec `_ + base class and register through + `numcodecs.registry.register_codec `_. + +Other extensions +---------------- In the future, Zarr will support writing custom custom data types and chunk grids.