@@ -74,11 +74,24 @@ def _parse_codec_configuration(data: dict[str, JSON]) -> dict[str, JSON]:
7474 return {"id" : id , ** parsed_configuration }
7575
7676
77+ def snake_case (codec_name : str ) -> str :
78+ # TODO the Jenkins codec is a special case because it inserts an _
79+ return codec_name .lower ()
80+
81+
7782@dataclass (frozen = True )
7883class _NumcodecsCodec (Metadata ):
7984 codec_name : str
8085 codec_config : dict [str , JSON ]
8186
87+ def __init_subclass__ (cls , * , codec_name : str | None = None , ** kwargs ):
88+ super ().__init_subclass__ (** kwargs )
89+ if codec_name is not None :
90+ cls .codec_name = CODEC_PREFIX + codec_name
91+ cls .__doc__ = f"""
92+ See :class:`{ snake_case (cls .codec_name )} .{ codec_name } ` for more details and parameters.
93+ """
94+
8295 def __init__ (self , ** codec_config : JSON ) -> None :
8396 if not self .codec_name :
8497 raise ValueError (
@@ -260,11 +273,8 @@ def compute_encoded_size(self, input_byte_length: int, chunk_spec: ArraySpec) ->
260273
261274
262275#Zlib = _add_docstring(_make_bytes_bytes_codec("zlib", "Zlib"), "numcodecs.zlib.Zlib")
263- class Zlib (_NumcodecsBytesBytesCodec ):
264- codec_name = CODEC_PREFIX + "zlib"
265-
266- def __init__ (self , ** codec_config : JSON ) -> None :
267- super ().__init__ (** codec_config )
276+ class Zlib (_NumcodecsBytesBytesCodec , codec_name = "Zlib" ):
277+ pass
268278
269279
270280GZip = _add_docstring (_make_bytes_bytes_codec ("gzip" , "GZip" ), "numcodecs.gzip.GZip" )
0 commit comments