|
31 | 31 | from functools import cached_property, partial |
32 | 32 | from typing import Any, Self, TypeVar |
33 | 33 | from warnings import warn |
| 34 | +import textwrap |
34 | 35 |
|
35 | 36 | import numpy as np |
36 | 37 |
|
@@ -84,12 +85,14 @@ class _NumcodecsCodec(Metadata): |
84 | 85 | codec_name: str |
85 | 86 | codec_config: dict[str, JSON] |
86 | 87 |
|
87 | | - def __init_subclass__(cls, *, codec_name: str | None = None, **kwargs): |
| 88 | + def __init_subclass__(cls, *, namespace: str | None = None, codec_name: str | None = None, **kwargs): |
| 89 | + """To be used only when creating the actual public-facing codec class.""" |
88 | 90 | super().__init_subclass__(**kwargs) |
89 | | - if codec_name is not None: |
90 | | - cls.codec_name = CODEC_PREFIX + codec_name |
| 91 | + if namespace is not None and codec_name is not None: |
| 92 | + cls_name = f"{CODEC_PREFIX}{namespace}.{codec_name}" |
| 93 | + cls.codec_name = f"{CODEC_PREFIX}{codec_name}" |
91 | 94 | cls.__doc__ = f""" |
92 | | - See :class:`{snake_case(cls.codec_name)}.{codec_name}` for more details and parameters. |
| 95 | + See :class:`{cls_name}` for more details and parameters. |
93 | 96 | """ |
94 | 97 |
|
95 | 98 | def __init__(self, **codec_config: JSON) -> None: |
@@ -197,30 +200,18 @@ async def _encode_single(self, chunk_ndbuffer: NDBuffer, chunk_spec: ArraySpec) |
197 | 200 |
|
198 | 201 |
|
199 | 202 | def _add_docstring(cls: type[T], ref_class_name: str) -> type[T]: |
200 | | - cls.__doc__ = f""" |
| 203 | + cls.__doc__ = textwrap.dedent( |
| 204 | + f""" |
201 | 205 | See :class:`{ref_class_name}` for more details and parameters. |
202 | 206 | """ |
| 207 | + ) |
203 | 208 | return cls |
204 | 209 |
|
205 | 210 |
|
206 | 211 | def _add_docstring_wrapper(ref_class_name: str) -> partial: |
207 | 212 | return partial(_add_docstring, ref_class_name=ref_class_name) |
208 | 213 |
|
209 | 214 |
|
210 | | -def _make_bytes_bytes_codec(codec_name: str, cls_name: str) -> type[_NumcodecsBytesBytesCodec]: |
211 | | - # rename for class scope |
212 | | - _codec_name = CODEC_PREFIX + codec_name |
213 | | - |
214 | | - class _Codec(_NumcodecsBytesBytesCodec): |
215 | | - codec_name = _codec_name |
216 | | - |
217 | | - def __init__(self, **codec_config: JSON) -> None: |
218 | | - super().__init__(**codec_config) |
219 | | - |
220 | | - _Codec.__name__ = cls_name |
221 | | - return _Codec |
222 | | - |
223 | | - |
224 | 215 | def _make_array_array_codec(codec_name: str, cls_name: str) -> type[_NumcodecsArrayArrayCodec]: |
225 | 216 | # rename for class scope |
226 | 217 | _codec_name = CODEC_PREFIX + codec_name |
@@ -267,19 +258,32 @@ def compute_encoded_size(self, input_byte_length: int, chunk_spec: ArraySpec) -> |
267 | 258 |
|
268 | 259 |
|
269 | 260 | # bytes-to-bytes codecs |
270 | | -Blosc = _add_docstring(_make_bytes_bytes_codec("blosc", "Blosc"), "numcodecs.blosc.Blosc") |
271 | | -LZ4 = _add_docstring(_make_bytes_bytes_codec("lz4", "LZ4"), "numcodecs.lz4.LZ4") |
272 | | -Zstd = _add_docstring(_make_bytes_bytes_codec("zstd", "Zstd"), "numcodecs.zstd.Zstd") |
| 261 | +class Blosc(_NumcodecsBytesBytesCodec, namespace="blosc", codec_name="Blosc"): |
| 262 | + pass |
273 | 263 |
|
274 | 264 |
|
275 | | -#Zlib = _add_docstring(_make_bytes_bytes_codec("zlib", "Zlib"), "numcodecs.zlib.Zlib") |
276 | | -class Zlib(_NumcodecsBytesBytesCodec, codec_name="Zlib"): |
| 265 | +class LZ4(_NumcodecsBytesBytesCodec, namespace="lz4", codec_name="LZ4"): |
277 | 266 | pass |
278 | 267 |
|
279 | 268 |
|
280 | | -GZip = _add_docstring(_make_bytes_bytes_codec("gzip", "GZip"), "numcodecs.gzip.GZip") |
281 | | -BZ2 = _add_docstring(_make_bytes_bytes_codec("bz2", "BZ2"), "numcodecs.bz2.BZ2") |
282 | | -LZMA = _add_docstring(_make_bytes_bytes_codec("lzma", "LZMA"), "numcodecs.lzma.LZMA") |
| 269 | +class Zstd(_NumcodecsBytesBytesCodec, namespace="zstd", codec_name="Zstd"): |
| 270 | + pass |
| 271 | + |
| 272 | + |
| 273 | +class Zlib(_NumcodecsBytesBytesCodec, namespace="zlib", codec_name="Zlib"): |
| 274 | + pass |
| 275 | + |
| 276 | + |
| 277 | +class GZip(_NumcodecsBytesBytesCodec, namespace="gzip", codec_name="GZip"): |
| 278 | + pass |
| 279 | + |
| 280 | + |
| 281 | +class BZ2(_NumcodecsBytesBytesCodec, namespace="bz2", codec_name="BZ2"): |
| 282 | + pass |
| 283 | + |
| 284 | + |
| 285 | +class LZMA(_NumcodecsBytesBytesCodec, namespace="lzma",codec_name="LZMA"): |
| 286 | + pass |
283 | 287 |
|
284 | 288 |
|
285 | 289 | @_add_docstring_wrapper("numcodecs.shuffle.Shuffle") |
|
0 commit comments