numcodecs 0.16.0__cp312-cp312-macosx_11_0_arm64.whl → 0.16.2__cp312-cp312-macosx_11_0_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of numcodecs might be problematic. Click here for more details.

Files changed (34) hide show
  1. numcodecs/_shuffle.cpython-312-darwin.so +0 -0
  2. numcodecs/abc.py +1 -2
  3. numcodecs/blosc.cpython-312-darwin.so +0 -0
  4. numcodecs/checksum32.py +2 -2
  5. numcodecs/compat_ext.cpython-312-darwin.so +0 -0
  6. numcodecs/fletcher32.cpython-312-darwin.so +0 -0
  7. numcodecs/jenkins.cpython-312-darwin.so +0 -0
  8. numcodecs/lz4.cpython-312-darwin.so +0 -0
  9. numcodecs/lzma.py +1 -2
  10. numcodecs/tests/common.py +1 -1
  11. numcodecs/tests/test_blosc.py +19 -13
  12. numcodecs/tests/test_pyzstd.py +77 -0
  13. numcodecs/tests/test_vlen_bytes.py +0 -4
  14. numcodecs/tests/test_zarr3.py +52 -13
  15. numcodecs/tests/test_zstd.py +72 -6
  16. numcodecs/version.py +2 -2
  17. numcodecs/vlen.cpython-312-darwin.so +0 -0
  18. numcodecs/zarr3.py +114 -140
  19. numcodecs/zfpy.py +1 -2
  20. numcodecs/zstd.cpython-312-darwin.so +0 -0
  21. {numcodecs-0.16.0.dist-info → numcodecs-0.16.2.dist-info}/METADATA +11 -3
  22. {numcodecs-0.16.0.dist-info → numcodecs-0.16.2.dist-info}/RECORD +34 -25
  23. {numcodecs-0.16.0.dist-info → numcodecs-0.16.2.dist-info}/WHEEL +1 -1
  24. numcodecs-0.16.2.dist-info/licenses/c-blosc/LICENSE.txt +31 -0
  25. numcodecs-0.16.2.dist-info/licenses/c-blosc/LICENSES/BITSHUFFLE.txt +21 -0
  26. numcodecs-0.16.2.dist-info/licenses/c-blosc/LICENSES/FASTLZ.txt +20 -0
  27. numcodecs-0.16.2.dist-info/licenses/c-blosc/LICENSES/LZ4.txt +25 -0
  28. numcodecs-0.16.2.dist-info/licenses/c-blosc/LICENSES/SNAPPY.txt +28 -0
  29. numcodecs-0.16.2.dist-info/licenses/c-blosc/LICENSES/STDINT.txt +29 -0
  30. numcodecs-0.16.2.dist-info/licenses/c-blosc/LICENSES/ZLIB-NG.txt +17 -0
  31. numcodecs-0.16.2.dist-info/licenses/c-blosc/LICENSES/ZLIB.txt +22 -0
  32. {numcodecs-0.16.0.dist-info → numcodecs-0.16.2.dist-info}/entry_points.txt +0 -0
  33. {numcodecs-0.16.0.dist-info → numcodecs-0.16.2.dist-info}/licenses/LICENSE.txt +0 -0
  34. {numcodecs-0.16.0.dist-info → numcodecs-0.16.2.dist-info}/top_level.txt +0 -0
Binary file
numcodecs/abc.py CHANGED
@@ -29,14 +29,13 @@ other and vice versa.
29
29
  """
30
30
 
31
31
  from abc import ABC, abstractmethod
32
- from typing import Optional
33
32
 
34
33
 
35
34
  class Codec(ABC):
36
35
  """Codec abstract base class."""
37
36
 
38
37
  # override in sub-class
39
- codec_id: Optional[str] = None
38
+ codec_id: str | None = None
40
39
  """Codec identifier."""
41
40
 
42
41
  @abstractmethod
Binary file
numcodecs/checksum32.py CHANGED
@@ -3,7 +3,7 @@ import struct
3
3
  import zlib
4
4
  from contextlib import suppress
5
5
  from types import ModuleType
6
- from typing import Literal, Optional
6
+ from typing import Literal
7
7
 
8
8
  import numpy as np
9
9
  from typing_extensions import Buffer
@@ -12,7 +12,7 @@ from .abc import Codec
12
12
  from .compat import ensure_contiguous_ndarray, ndarray_copy
13
13
  from .jenkins import jenkins_lookup3
14
14
 
15
- _crc32c: Optional[ModuleType] = None
15
+ _crc32c: ModuleType | None = None
16
16
  with suppress(ImportError):
17
17
  import crc32c as _crc32c # type: ignore[no-redef, unused-ignore]
18
18
 
Binary file
Binary file
Binary file
Binary file
numcodecs/lzma.py CHANGED
@@ -1,7 +1,6 @@
1
1
  from types import ModuleType
2
- from typing import Optional
3
2
 
4
- _lzma: Optional[ModuleType] = None
3
+ _lzma: ModuleType | None = None
5
4
  try:
6
5
  import lzma as _lzma
7
6
  except ImportError: # pragma: no cover
numcodecs/tests/common.py CHANGED
@@ -202,7 +202,7 @@ def check_backwards_compatibility(codec_id, arrays, codecs, precision=None, pref
202
202
 
203
203
  for j, codec in enumerate(codecs):
204
204
  if codec is None:
205
- pytest.skip("codec has been removed")
205
+ continue
206
206
 
207
207
  # setup a directory to hold encoded data
208
208
  codec_dir = os.path.join(fixture_dir, f'codec.{j:02d}')
@@ -245,20 +245,20 @@ def test_err_encode_object_buffer():
245
245
  check_err_encode_object_buffer(Blosc())
246
246
 
247
247
 
248
- def test_decompression_error_handling():
249
- for codec in codecs:
250
- _skip_null(codec)
251
- with pytest.raises(RuntimeError):
252
- codec.decode(bytearray())
253
- with pytest.raises(RuntimeError):
254
- codec.decode(bytearray(0))
248
+ @pytest.mark.parametrize('codec', codecs)
249
+ def test_decompression_error_handling(codec):
250
+ _skip_null(codec)
251
+ with pytest.raises(RuntimeError):
252
+ codec.decode(bytearray())
253
+ with pytest.raises(RuntimeError):
254
+ codec.decode(bytearray(0))
255
255
 
256
256
 
257
- def test_max_buffer_size():
258
- for codec in codecs:
259
- _skip_null(codec)
260
- assert codec.max_buffer_size == 2**31 - 1
261
- check_max_buffer_size(codec)
257
+ @pytest.mark.parametrize('codec', codecs)
258
+ def test_max_buffer_size(codec):
259
+ _skip_null(codec)
260
+ assert codec.max_buffer_size == 2**31 - 1
261
+ check_max_buffer_size(codec)
262
262
 
263
263
 
264
264
  def test_typesize_explicit():
@@ -278,7 +278,13 @@ def test_typesize_less_than_1():
278
278
  Blosc(shuffle=Blosc.SHUFFLE, typesize=0)
279
279
  compressor = Blosc(shuffle=Blosc.SHUFFLE)
280
280
  # not really something that should be done in practice, but good for testing.
281
- compressor.typesize = 0
281
+ compressor._typesize = 0
282
282
  arr = np.arange(100)
283
283
  with pytest.raises(ValueError, match=r"Cannot use typesize"):
284
284
  compressor.encode(arr.tobytes())
285
+
286
+
287
+ def test_config_no_typesize():
288
+ codec = Blosc(shuffle=Blosc.SHUFFLE, typesize=5)
289
+ config = codec.get_config()
290
+ assert "typesize" not in config
@@ -0,0 +1,77 @@
1
+ # Check Zstd against pyzstd package
2
+
3
+ import numpy as np
4
+ import pytest
5
+ import pyzstd
6
+
7
+ from numcodecs.zstd import Zstd
8
+
9
+ test_data = [
10
+ b"Hello World!",
11
+ np.arange(113).tobytes(),
12
+ np.arange(10, 15).tobytes(),
13
+ np.random.randint(3, 50, size=(53,), dtype=np.uint16).tobytes(),
14
+ ]
15
+
16
+
17
+ @pytest.mark.parametrize("input", test_data)
18
+ def test_pyzstd_simple(input):
19
+ """
20
+ Test if Zstd.[decode, encode] can perform the inverse operation to
21
+ pyzstd.[compress, decompress] in the simple case.
22
+ """
23
+ z = Zstd()
24
+ assert z.decode(pyzstd.compress(input)) == input
25
+ assert pyzstd.decompress(z.encode(input)) == input
26
+
27
+
28
+ @pytest.mark.xfail
29
+ @pytest.mark.parametrize("input", test_data)
30
+ def test_pyzstd_simple_multiple_frames_decode(input):
31
+ """
32
+ Test decompression of two concatenated frames of known sizes
33
+
34
+ numcodecs.zstd.Zstd currently fails because it only assesses the size of the
35
+ first frame. Rather, it should keep iterating through all the frames until
36
+ the end of the input buffer.
37
+ """
38
+ z = Zstd()
39
+ assert pyzstd.decompress(pyzstd.compress(input) * 2) == input * 2
40
+ assert z.decode(pyzstd.compress(input) * 2) == input * 2
41
+
42
+
43
+ @pytest.mark.parametrize("input", test_data)
44
+ def test_pyzstd_simple_multiple_frames_encode(input):
45
+ """
46
+ Test if pyzstd can decompress two concatenated frames from Zstd.encode
47
+ """
48
+ z = Zstd()
49
+ assert pyzstd.decompress(z.encode(input) * 2) == input * 2
50
+
51
+
52
+ @pytest.mark.parametrize("input", test_data)
53
+ def test_pyzstd_streaming(input):
54
+ """
55
+ Test if Zstd can decode a single frame and concatenated frames in streaming
56
+ mode where the decompressed size is not recorded in the frame header.
57
+ """
58
+ pyzstd_c = pyzstd.ZstdCompressor()
59
+ pyzstd_d = pyzstd.ZstdDecompressor()
60
+ pyzstd_e = pyzstd.EndlessZstdDecompressor()
61
+ z = Zstd()
62
+
63
+ d_bytes = input
64
+ pyzstd_c.compress(d_bytes)
65
+ c_bytes = pyzstd_c.flush()
66
+ assert z.decode(c_bytes) == d_bytes
67
+ assert pyzstd_d.decompress(z.encode(d_bytes)) == d_bytes
68
+
69
+ # Test multiple streaming frames
70
+ assert z.decode(c_bytes * 2) == pyzstd_e.decompress(c_bytes * 2)
71
+ assert z.decode(c_bytes * 3) == pyzstd_e.decompress(c_bytes * 3)
72
+ assert z.decode(c_bytes * 4) == pyzstd_e.decompress(c_bytes * 4)
73
+ assert z.decode(c_bytes * 5) == pyzstd_e.decompress(c_bytes * 5)
74
+ assert z.decode(c_bytes * 7) == pyzstd_e.decompress(c_bytes * 7)
75
+ assert z.decode(c_bytes * 11) == pyzstd_e.decompress(c_bytes * 11)
76
+ assert z.decode(c_bytes * 13) == pyzstd_e.decompress(c_bytes * 13)
77
+ assert z.decode(c_bytes * 99) == pyzstd_e.decompress(c_bytes * 99)
@@ -1,4 +1,3 @@
1
- import sys
2
1
  import unittest
3
2
 
4
3
  import numpy as np
@@ -85,9 +84,6 @@ def test_decode_errors():
85
84
  codec.decode(enc, out=np.zeros(10, dtype='i4'))
86
85
 
87
86
 
88
- # TODO: fix this test on GitHub actions somehow...
89
- # See https://github.com/zarr-developers/numcodecs/issues/683
90
- @pytest.mark.skipif(sys.platform == "darwin", reason="Test is failing on macOS on GitHub actions.")
91
87
  def test_encode_none():
92
88
  a = np.array([b'foo', None, b'bar'], dtype=object)
93
89
  codec = VLenBytes()
@@ -1,10 +1,13 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import pickle
3
4
  from typing import TYPE_CHECKING
4
5
 
5
6
  import numpy as np
6
7
  import pytest
7
8
 
9
+ import numcodecs.bitround
10
+
8
11
  if TYPE_CHECKING: # pragma: no cover
9
12
  import zarr
10
13
  else:
@@ -119,8 +122,8 @@ def test_generic_filter(
119
122
  ],
120
123
  )
121
124
 
122
- a[:, :] = data.copy()
123
- a = zarr.open_array(store / "generic", mode="r")
125
+ a[:, :] = data.copy()
126
+ a = zarr.open_array(store / "generic", mode="r")
124
127
  np.testing.assert_array_equal(data, a[:, :])
125
128
 
126
129
 
@@ -137,8 +140,8 @@ def test_generic_filter_bitround(store: StorePath):
137
140
  filters=[numcodecs.zarr3.BitRound(keepbits=3)],
138
141
  )
139
142
 
140
- a[:, :] = data.copy()
141
- a = zarr.open_array(store / "generic_bitround", mode="r")
143
+ a[:, :] = data.copy()
144
+ a = zarr.open_array(store / "generic_bitround", mode="r")
142
145
  assert np.allclose(data, a[:, :], atol=0.1)
143
146
 
144
147
 
@@ -155,8 +158,8 @@ def test_generic_filter_quantize(store: StorePath):
155
158
  filters=[numcodecs.zarr3.Quantize(digits=3)],
156
159
  )
157
160
 
158
- a[:, :] = data.copy()
159
- a = zarr.open_array(store / "generic_quantize", mode="r")
161
+ a[:, :] = data.copy()
162
+ a = zarr.open_array(store / "generic_quantize", mode="r")
160
163
  assert np.allclose(data, a[:, :], atol=0.001)
161
164
 
162
165
 
@@ -174,8 +177,8 @@ def test_generic_filter_packbits(store: StorePath):
174
177
  filters=[numcodecs.zarr3.PackBits()],
175
178
  )
176
179
 
177
- a[:, :] = data.copy()
178
- a = zarr.open_array(store / "generic_packbits", mode="r")
180
+ a[:, :] = data.copy()
181
+ a = zarr.open_array(store / "generic_packbits", mode="r")
179
182
  np.testing.assert_array_equal(data, a[:, :])
180
183
 
181
184
  with pytest.raises(ValueError, match=".*requires bool dtype.*"):
@@ -214,8 +217,8 @@ def test_generic_checksum(
214
217
  compressors=[codec_class()],
215
218
  )
216
219
 
217
- a[:, :] = data.copy()
218
- a = zarr.open_array(store / "generic_checksum", mode="r")
220
+ a[:, :] = data.copy()
221
+ a = zarr.open_array(store / "generic_checksum", mode="r")
219
222
  np.testing.assert_array_equal(data, a[:, :])
220
223
 
221
224
 
@@ -260,12 +263,12 @@ def test_delta_astype(store: StorePath):
260
263
  dtype=data.dtype,
261
264
  fill_value=0,
262
265
  filters=[
263
- numcodecs.zarr3.Delta(dtype="i8", astype="i2"), # type: ignore[arg-type]
266
+ numcodecs.zarr3.Delta(dtype="i8", astype="i2"),
264
267
  ],
265
268
  )
266
269
 
267
- a[:, :] = data.copy()
268
- a = zarr.open_array(store / "generic", mode="r")
270
+ a[:, :] = data.copy()
271
+ a = zarr.open_array(store / "generic", mode="r")
269
272
  np.testing.assert_array_equal(data, a[:, :])
270
273
 
271
274
 
@@ -277,3 +280,39 @@ def test_repr():
277
280
  def test_to_dict():
278
281
  codec = numcodecs.zarr3.LZ4(level=5)
279
282
  assert codec.to_dict() == {"name": "numcodecs.lz4", "configuration": {"level": 5}}
283
+
284
+
285
+ @pytest.mark.parametrize(
286
+ "codec_cls",
287
+ [
288
+ numcodecs.zarr3.Blosc,
289
+ numcodecs.zarr3.LZ4,
290
+ numcodecs.zarr3.Zstd,
291
+ numcodecs.zarr3.Zlib,
292
+ numcodecs.zarr3.GZip,
293
+ numcodecs.zarr3.BZ2,
294
+ numcodecs.zarr3.LZMA,
295
+ numcodecs.zarr3.Shuffle,
296
+ numcodecs.zarr3.BitRound,
297
+ numcodecs.zarr3.Delta,
298
+ numcodecs.zarr3.FixedScaleOffset,
299
+ numcodecs.zarr3.Quantize,
300
+ numcodecs.zarr3.PackBits,
301
+ numcodecs.zarr3.AsType,
302
+ numcodecs.zarr3.CRC32,
303
+ numcodecs.zarr3.CRC32C,
304
+ numcodecs.zarr3.Adler32,
305
+ numcodecs.zarr3.Fletcher32,
306
+ numcodecs.zarr3.JenkinsLookup3,
307
+ numcodecs.zarr3.PCodec,
308
+ numcodecs.zarr3.ZFPY,
309
+ ],
310
+ )
311
+ def test_codecs_pickleable(codec_cls):
312
+ codec = codec_cls()
313
+
314
+ expected = codec
315
+
316
+ p = pickle.dumps(codec)
317
+ actual = pickle.loads(p)
318
+ assert actual == expected
@@ -1,14 +1,9 @@
1
1
  import itertools
2
+ import subprocess
2
3
 
3
4
  import numpy as np
4
5
  import pytest
5
6
 
6
- try:
7
- from numcodecs.zstd import Zstd
8
- except ImportError: # pragma: no cover
9
- pytest.skip("numcodecs.zstd not available", allow_module_level=True)
10
-
11
-
12
7
  from numcodecs.tests.common import (
13
8
  check_backwards_compatibility,
14
9
  check_config,
@@ -17,6 +12,7 @@ from numcodecs.tests.common import (
17
12
  check_err_encode_object_buffer,
18
13
  check_repr,
19
14
  )
15
+ from numcodecs.zstd import Zstd
20
16
 
21
17
  codecs = [
22
18
  Zstd(),
@@ -90,3 +86,73 @@ def test_native_functions():
90
86
  assert Zstd.default_level() == 3
91
87
  assert Zstd.min_level() == -131072
92
88
  assert Zstd.max_level() == 22
89
+
90
+
91
+ def test_streaming_decompression():
92
+ # Test input frames with unknown frame content size
93
+ codec = Zstd()
94
+
95
+ # If the zstd command line interface is available, check the bytes
96
+ cli = zstd_cli_available()
97
+ if cli:
98
+ view_zstd_streaming_bytes()
99
+
100
+ # Encode bytes directly that were the result of streaming compression
101
+ bytes_val = b'(\xb5/\xfd\x00Xa\x00\x00Hello World!'
102
+ dec = codec.decode(bytes_val)
103
+ dec_expected = b'Hello World!'
104
+ assert dec == dec_expected
105
+ if cli:
106
+ assert bytes_val == generate_zstd_streaming_bytes(dec_expected)
107
+ assert dec_expected == generate_zstd_streaming_bytes(bytes_val, decompress=True)
108
+
109
+ # Two consecutive frames given as input
110
+ bytes2 = bytes(bytearray(bytes_val * 2))
111
+ dec2 = codec.decode(bytes2)
112
+ dec2_expected = b'Hello World!Hello World!'
113
+ assert dec2 == dec2_expected
114
+ if cli:
115
+ assert dec2_expected == generate_zstd_streaming_bytes(bytes2, decompress=True)
116
+
117
+ # Single long frame that decompresses to a large output
118
+ bytes3 = b'(\xb5/\xfd\x00X$\x02\x00\xa4\x03ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz\x01\x00:\xfc\xdfs\x05\x05L\x00\x00\x08s\x01\x00\xfc\xff9\x10\x02L\x00\x00\x08k\x01\x00\xfc\xff9\x10\x02L\x00\x00\x08c\x01\x00\xfc\xff9\x10\x02L\x00\x00\x08[\x01\x00\xfc\xff9\x10\x02L\x00\x00\x08S\x01\x00\xfc\xff9\x10\x02L\x00\x00\x08K\x01\x00\xfc\xff9\x10\x02L\x00\x00\x08C\x01\x00\xfc\xff9\x10\x02L\x00\x00\x08u\x01\x00\xfc\xff9\x10\x02L\x00\x00\x08m\x01\x00\xfc\xff9\x10\x02L\x00\x00\x08e\x01\x00\xfc\xff9\x10\x02L\x00\x00\x08]\x01\x00\xfc\xff9\x10\x02L\x00\x00\x08U\x01\x00\xfc\xff9\x10\x02L\x00\x00\x08M\x01\x00\xfc\xff9\x10\x02M\x00\x00\x08E\x01\x00\xfc\x7f\x1d\x08\x01'
119
+ dec3 = codec.decode(bytes3)
120
+ dec3_expected = b'ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz' * 1024 * 32
121
+ assert dec3 == dec3_expected
122
+ if cli:
123
+ assert bytes3 == generate_zstd_streaming_bytes(dec3_expected)
124
+ assert dec3_expected == generate_zstd_streaming_bytes(bytes3, decompress=True)
125
+
126
+ # Garbage input results in an error
127
+ bytes4 = bytes(bytearray([0, 0, 0, 0, 0, 0, 0, 0]))
128
+ with pytest.raises(RuntimeError, match='Zstd decompression error: invalid input data'):
129
+ codec.decode(bytes4)
130
+
131
+
132
+ def generate_zstd_streaming_bytes(input: bytes, *, decompress: bool = False) -> bytes:
133
+ """
134
+ Use the zstd command line interface to compress or decompress bytes in streaming mode.
135
+ """
136
+ if decompress:
137
+ args = ["-d"]
138
+ else:
139
+ args = []
140
+
141
+ p = subprocess.run(["zstd", "--no-check", *args], input=input, capture_output=True)
142
+ return p.stdout
143
+
144
+
145
+ def view_zstd_streaming_bytes():
146
+ bytes_val = generate_zstd_streaming_bytes(b"Hello world!")
147
+ print(f" bytes_val = {bytes_val}")
148
+
149
+ bytes3 = generate_zstd_streaming_bytes(
150
+ b"ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz" * 1024 * 32
151
+ )
152
+ print(f" bytes3 = {bytes3}")
153
+
154
+
155
+ def zstd_cli_available() -> bool:
156
+ return not subprocess.run(
157
+ ["zstd", "-V"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL
158
+ ).returncode
numcodecs/version.py CHANGED
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '0.16.0'
21
- __version_tuple__ = version_tuple = (0, 16, 0)
20
+ __version__ = version = '0.16.2'
21
+ __version_tuple__ = version_tuple = (0, 16, 2)
Binary file
numcodecs/zarr3.py CHANGED
@@ -28,18 +28,20 @@ from __future__ import annotations
28
28
  import asyncio
29
29
  import math
30
30
  from dataclasses import dataclass, replace
31
- from functools import cached_property, partial
32
- from typing import Any, Self, TypeVar
31
+ from functools import cached_property
32
+ from importlib.metadata import version
33
+ from typing import Any, Self
33
34
  from warnings import warn
34
35
 
35
36
  import numpy as np
37
+ from packaging.version import Version
36
38
 
37
39
  import numcodecs
38
40
 
39
41
  try:
40
- import zarr
42
+ import zarr # noqa: F401
41
43
 
42
- if zarr.__version__ < "3.0.0": # pragma: no cover
44
+ if Version(version('zarr')) < Version("3.0.0"): # pragma: no cover
43
45
  raise ImportError("zarr 3.0.0 or later is required to use the numcodecs zarr integration.")
44
46
  except ImportError as e: # pragma: no cover
45
47
  raise ImportError(
@@ -56,6 +58,23 @@ from zarr.core.common import JSON, parse_named_configuration, product
56
58
  CODEC_PREFIX = "numcodecs."
57
59
 
58
60
 
61
+ def _from_zarr_dtype(dtype: Any) -> np.dtype:
62
+ """
63
+ Get a numpy data type from an array spec, depending on the zarr version.
64
+ """
65
+ if Version(version('zarr')) >= Version("3.1.0"):
66
+ return dtype.to_native_dtype()
67
+ return dtype # pragma: no cover
68
+
69
+
70
+ def _to_zarr_dtype(dtype: np.dtype) -> Any:
71
+ if Version(version('zarr')) >= Version("3.1.0"):
72
+ from zarr.dtype import parse_data_type
73
+
74
+ return parse_data_type(dtype, zarr_format=3)
75
+ return dtype # pragma: no cover
76
+
77
+
59
78
  def _expect_name_prefix(codec_name: str) -> str:
60
79
  if not codec_name.startswith(CODEC_PREFIX):
61
80
  raise ValueError(
@@ -79,6 +98,18 @@ class _NumcodecsCodec(Metadata):
79
98
  codec_name: str
80
99
  codec_config: dict[str, JSON]
81
100
 
101
+ def __init_subclass__(cls, *, codec_name: str | None = None, **kwargs):
102
+ """To be used only when creating the actual public-facing codec class."""
103
+ super().__init_subclass__(**kwargs)
104
+ if codec_name is not None:
105
+ namespace = codec_name
106
+
107
+ cls_name = f"{CODEC_PREFIX}{namespace}.{cls.__name__}"
108
+ cls.codec_name = f"{CODEC_PREFIX}{namespace}"
109
+ cls.__doc__ = f"""
110
+ See :class:`{cls_name}` for more details and parameters.
111
+ """
112
+
82
113
  def __init__(self, **codec_config: JSON) -> None:
83
114
  if not self.codec_name:
84
115
  raise ValueError(
@@ -180,201 +211,144 @@ class _NumcodecsArrayBytesCodec(_NumcodecsCodec, ArrayBytesCodec):
180
211
  return chunk_spec.prototype.buffer.from_bytes(out)
181
212
 
182
213
 
183
- T = TypeVar("T", bound=_NumcodecsCodec)
184
-
185
-
186
- def _add_docstring(cls: type[T], ref_class_name: str) -> type[T]:
187
- cls.__doc__ = f"""
188
- See :class:`{ref_class_name}` for more details and parameters.
189
- """
190
- return cls
191
-
192
-
193
- def _add_docstring_wrapper(ref_class_name: str) -> partial:
194
- return partial(_add_docstring, ref_class_name=ref_class_name)
195
-
196
-
197
- def _make_bytes_bytes_codec(codec_name: str, cls_name: str) -> type[_NumcodecsBytesBytesCodec]:
198
- # rename for class scope
199
- _codec_name = CODEC_PREFIX + codec_name
200
-
201
- class _Codec(_NumcodecsBytesBytesCodec):
202
- codec_name = _codec_name
203
-
204
- def __init__(self, **codec_config: JSON) -> None:
205
- super().__init__(**codec_config)
206
-
207
- _Codec.__name__ = cls_name
208
- return _Codec
209
-
210
-
211
- def _make_array_array_codec(codec_name: str, cls_name: str) -> type[_NumcodecsArrayArrayCodec]:
212
- # rename for class scope
213
- _codec_name = CODEC_PREFIX + codec_name
214
-
215
- class _Codec(_NumcodecsArrayArrayCodec):
216
- codec_name = _codec_name
217
-
218
- def __init__(self, **codec_config: JSON) -> None:
219
- super().__init__(**codec_config)
220
-
221
- _Codec.__name__ = cls_name
222
- return _Codec
223
-
224
-
225
- def _make_array_bytes_codec(codec_name: str, cls_name: str) -> type[_NumcodecsArrayBytesCodec]:
226
- # rename for class scope
227
- _codec_name = CODEC_PREFIX + codec_name
214
+ # bytes-to-bytes codecs
215
+ class Blosc(_NumcodecsBytesBytesCodec, codec_name="blosc"):
216
+ pass
228
217
 
229
- class _Codec(_NumcodecsArrayBytesCodec):
230
- codec_name = _codec_name
231
218
 
232
- def __init__(self, **codec_config: JSON) -> None:
233
- super().__init__(**codec_config)
219
+ class LZ4(_NumcodecsBytesBytesCodec, codec_name="lz4"):
220
+ pass
234
221
 
235
- _Codec.__name__ = cls_name
236
- return _Codec
237
222
 
223
+ class Zstd(_NumcodecsBytesBytesCodec, codec_name="zstd"):
224
+ pass
238
225
 
239
- def _make_checksum_codec(codec_name: str, cls_name: str) -> type[_NumcodecsBytesBytesCodec]:
240
- # rename for class scope
241
- _codec_name = CODEC_PREFIX + codec_name
242
226
 
243
- class _ChecksumCodec(_NumcodecsBytesBytesCodec):
244
- codec_name = _codec_name
227
+ class Zlib(_NumcodecsBytesBytesCodec, codec_name="zlib"):
228
+ pass
245
229
 
246
- def __init__(self, **codec_config: JSON) -> None:
247
- super().__init__(**codec_config)
248
230
 
249
- def compute_encoded_size(self, input_byte_length: int, chunk_spec: ArraySpec) -> int:
250
- return input_byte_length + 4 # pragma: no cover
231
+ class GZip(_NumcodecsBytesBytesCodec, codec_name="gzip"):
232
+ pass
251
233
 
252
- _ChecksumCodec.__name__ = cls_name
253
- return _ChecksumCodec
254
234
 
235
+ class BZ2(_NumcodecsBytesBytesCodec, codec_name="bz2"):
236
+ pass
255
237
 
256
- # bytes-to-bytes codecs
257
- Blosc = _add_docstring(_make_bytes_bytes_codec("blosc", "Blosc"), "numcodecs.blosc.Blosc")
258
- LZ4 = _add_docstring(_make_bytes_bytes_codec("lz4", "LZ4"), "numcodecs.lz4.LZ4")
259
- Zstd = _add_docstring(_make_bytes_bytes_codec("zstd", "Zstd"), "numcodecs.zstd.Zstd")
260
- Zlib = _add_docstring(_make_bytes_bytes_codec("zlib", "Zlib"), "numcodecs.zlib.Zlib")
261
- GZip = _add_docstring(_make_bytes_bytes_codec("gzip", "GZip"), "numcodecs.gzip.GZip")
262
- BZ2 = _add_docstring(_make_bytes_bytes_codec("bz2", "BZ2"), "numcodecs.bz2.BZ2")
263
- LZMA = _add_docstring(_make_bytes_bytes_codec("lzma", "LZMA"), "numcodecs.lzma.LZMA")
264
238
 
239
+ class LZMA(_NumcodecsBytesBytesCodec, codec_name="lzma"):
240
+ pass
265
241
 
266
- @_add_docstring_wrapper("numcodecs.shuffle.Shuffle")
267
- class Shuffle(_NumcodecsBytesBytesCodec):
268
- codec_name = f"{CODEC_PREFIX}shuffle"
269
-
270
- def __init__(self, **codec_config: JSON) -> None:
271
- super().__init__(**codec_config)
272
242
 
243
+ class Shuffle(_NumcodecsBytesBytesCodec, codec_name="shuffle"):
273
244
  def evolve_from_array_spec(self, array_spec: ArraySpec) -> Shuffle:
274
- if self.codec_config.get("elementsize", None) is None:
275
- return Shuffle(**{**self.codec_config, "elementsize": array_spec.dtype.itemsize})
245
+ if self.codec_config.get("elementsize") is None:
246
+ dtype = _from_zarr_dtype(array_spec.dtype)
247
+ return Shuffle(**{**self.codec_config, "elementsize": dtype.itemsize})
276
248
  return self # pragma: no cover
277
249
 
278
250
 
279
251
  # array-to-array codecs ("filters")
280
- @_add_docstring_wrapper("numcodecs.delta.Delta")
281
- class Delta(_NumcodecsArrayArrayCodec):
282
- codec_name = f"{CODEC_PREFIX}delta"
283
-
284
- def __init__(self, **codec_config: dict[str, JSON]) -> None:
285
- super().__init__(**codec_config)
286
-
252
+ class Delta(_NumcodecsArrayArrayCodec, codec_name="delta"):
287
253
  def resolve_metadata(self, chunk_spec: ArraySpec) -> ArraySpec:
288
254
  if astype := self.codec_config.get("astype"):
289
- return replace(chunk_spec, dtype=np.dtype(astype)) # type: ignore[call-overload]
255
+ dtype = _to_zarr_dtype(np.dtype(astype)) # type: ignore[call-overload]
256
+ return replace(chunk_spec, dtype=dtype)
290
257
  return chunk_spec
291
258
 
292
259
 
293
- BitRound = _add_docstring(
294
- _make_array_array_codec("bitround", "BitRound"), "numcodecs.bitround.BitRound"
295
- )
296
-
260
+ class BitRound(_NumcodecsArrayArrayCodec, codec_name="bitround"):
261
+ pass
297
262
 
298
- @_add_docstring_wrapper("numcodecs.fixedscaleoffset.FixedScaleOffset")
299
- class FixedScaleOffset(_NumcodecsArrayArrayCodec):
300
- codec_name = f"{CODEC_PREFIX}fixedscaleoffset"
301
-
302
- def __init__(self, **codec_config: JSON) -> None:
303
- super().__init__(**codec_config)
304
263
 
264
+ class FixedScaleOffset(_NumcodecsArrayArrayCodec, codec_name="fixedscaleoffset"):
305
265
  def resolve_metadata(self, chunk_spec: ArraySpec) -> ArraySpec:
306
266
  if astype := self.codec_config.get("astype"):
307
- return replace(chunk_spec, dtype=np.dtype(astype)) # type: ignore[call-overload]
267
+ dtype = _to_zarr_dtype(np.dtype(astype)) # type: ignore[call-overload]
268
+ return replace(chunk_spec, dtype=dtype)
308
269
  return chunk_spec
309
270
 
310
271
  def evolve_from_array_spec(self, array_spec: ArraySpec) -> FixedScaleOffset:
311
- if self.codec_config.get("dtype", None) is None:
312
- return FixedScaleOffset(**{**self.codec_config, "dtype": str(array_spec.dtype)})
272
+ if self.codec_config.get("dtype") is None:
273
+ dtype = _from_zarr_dtype(array_spec.dtype)
274
+ return FixedScaleOffset(**{**self.codec_config, "dtype": str(dtype)})
313
275
  return self
314
276
 
315
277
 
316
- @_add_docstring_wrapper("numcodecs.quantize.Quantize")
317
- class Quantize(_NumcodecsArrayArrayCodec):
318
- codec_name = f"{CODEC_PREFIX}quantize"
319
-
278
+ class Quantize(_NumcodecsArrayArrayCodec, codec_name="quantize"):
320
279
  def __init__(self, **codec_config: JSON) -> None:
321
280
  super().__init__(**codec_config)
322
281
 
323
282
  def evolve_from_array_spec(self, array_spec: ArraySpec) -> Quantize:
324
- if self.codec_config.get("dtype", None) is None:
325
- return Quantize(**{**self.codec_config, "dtype": str(array_spec.dtype)})
283
+ if self.codec_config.get("dtype") is None:
284
+ dtype = _from_zarr_dtype(array_spec.dtype)
285
+ return Quantize(**{**self.codec_config, "dtype": str(dtype)})
326
286
  return self
327
287
 
328
288
 
329
- @_add_docstring_wrapper("numcodecs.packbits.PackBits")
330
- class PackBits(_NumcodecsArrayArrayCodec):
331
- codec_name = f"{CODEC_PREFIX}packbits"
332
-
333
- def __init__(self, **codec_config: JSON) -> None:
334
- super().__init__(**codec_config)
335
-
289
+ class PackBits(_NumcodecsArrayArrayCodec, codec_name="packbits"):
336
290
  def resolve_metadata(self, chunk_spec: ArraySpec) -> ArraySpec:
337
291
  return replace(
338
292
  chunk_spec,
339
293
  shape=(1 + math.ceil(product(chunk_spec.shape) / 8),),
340
- dtype=np.dtype("uint8"),
294
+ dtype=_to_zarr_dtype(np.dtype("uint8")),
341
295
  )
342
296
 
343
- def validate(self, *, dtype: np.dtype[Any], **_kwargs) -> None:
344
- if dtype != np.dtype("bool"):
297
+ # todo: remove this type: ignore when this class can be defined w.r.t.
298
+ # a single zarr dtype API
299
+ def validate(self, *, dtype: np.dtype[Any], **_kwargs) -> None: # type: ignore[override]
300
+ _dtype = _from_zarr_dtype(dtype)
301
+ if _dtype != np.dtype("bool"):
345
302
  raise ValueError(f"Packbits filter requires bool dtype. Got {dtype}.")
346
303
 
347
304
 
348
- @_add_docstring_wrapper("numcodecs.astype.AsType")
349
- class AsType(_NumcodecsArrayArrayCodec):
350
- codec_name = f"{CODEC_PREFIX}astype"
351
-
352
- def __init__(self, **codec_config: JSON) -> None:
353
- super().__init__(**codec_config)
354
-
305
+ class AsType(_NumcodecsArrayArrayCodec, codec_name="astype"):
355
306
  def resolve_metadata(self, chunk_spec: ArraySpec) -> ArraySpec:
356
- return replace(chunk_spec, dtype=np.dtype(self.codec_config["encode_dtype"])) # type: ignore[arg-type]
307
+ dtype = _to_zarr_dtype(np.dtype(self.codec_config["encode_dtype"])) # type: ignore[arg-type]
308
+ return replace(chunk_spec, dtype=dtype)
357
309
 
358
310
  def evolve_from_array_spec(self, array_spec: ArraySpec) -> AsType:
359
- if self.codec_config.get("decode_dtype", None) is None:
360
- return AsType(**{**self.codec_config, "decode_dtype": str(array_spec.dtype)})
311
+ if self.codec_config.get("decode_dtype") is None:
312
+ # TODO: remove these coverage exemptions the correct way, i.e. with tests
313
+ dtype = _from_zarr_dtype(array_spec.dtype) # pragma: no cover
314
+ return AsType(**{**self.codec_config, "decode_dtype": str(dtype)}) # pragma: no cover
361
315
  return self
362
316
 
363
317
 
364
318
  # bytes-to-bytes checksum codecs
365
- CRC32 = _add_docstring(_make_checksum_codec("crc32", "CRC32"), "numcodecs.checksum32.CRC32")
366
- CRC32C = _add_docstring(_make_checksum_codec("crc32c", "CRC32C"), "numcodecs.checksum32.CRC32C")
367
- Adler32 = _add_docstring(_make_checksum_codec("adler32", "Adler32"), "numcodecs.checksum32.Adler32")
368
- Fletcher32 = _add_docstring(
369
- _make_checksum_codec("fletcher32", "Fletcher32"), "numcodecs.fletcher32.Fletcher32"
370
- )
371
- JenkinsLookup3 = _add_docstring(
372
- _make_checksum_codec("jenkins_lookup3", "JenkinsLookup3"), "numcodecs.checksum32.JenkinsLookup3"
373
- )
319
+ class _NumcodecsChecksumCodec(_NumcodecsBytesBytesCodec):
320
+ def compute_encoded_size(self, input_byte_length: int, chunk_spec: ArraySpec) -> int:
321
+ return input_byte_length + 4 # pragma: no cover
322
+
323
+
324
+ class CRC32(_NumcodecsChecksumCodec, codec_name="crc32"):
325
+ pass
326
+
327
+
328
+ class CRC32C(_NumcodecsChecksumCodec, codec_name="crc32c"):
329
+ pass
330
+
331
+
332
+ class Adler32(_NumcodecsChecksumCodec, codec_name="adler32"):
333
+ pass
334
+
335
+
336
+ class Fletcher32(_NumcodecsChecksumCodec, codec_name="fletcher32"):
337
+ pass
338
+
339
+
340
+ class JenkinsLookup3(_NumcodecsChecksumCodec, codec_name="jenkins_lookup3"):
341
+ pass
342
+
374
343
 
375
344
  # array-to-bytes codecs
376
- PCodec = _add_docstring(_make_array_bytes_codec("pcodec", "PCodec"), "numcodecs.pcodec.PCodec")
377
- ZFPY = _add_docstring(_make_array_bytes_codec("zfpy", "ZFPY"), "numcodecs.zfpy.ZFPY")
345
+ class PCodec(_NumcodecsArrayBytesCodec, codec_name="pcodec"):
346
+ pass
347
+
348
+
349
+ class ZFPY(_NumcodecsArrayBytesCodec, codec_name="zfpy"):
350
+ pass
351
+
378
352
 
379
353
  __all__ = [
380
354
  "BZ2",
numcodecs/zfpy.py CHANGED
@@ -2,9 +2,8 @@ import warnings
2
2
  from contextlib import suppress
3
3
  from importlib.metadata import PackageNotFoundError, version
4
4
  from types import ModuleType
5
- from typing import Optional
6
5
 
7
- _zfpy: Optional[ModuleType] = None
6
+ _zfpy: ModuleType | None = None
8
7
 
9
8
  _zfpy_version: tuple = ()
10
9
  with suppress(PackageNotFoundError):
Binary file
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: numcodecs
3
- Version: 0.16.0
3
+ Version: 0.16.2
4
4
  Summary: A Python package providing buffer compression and transformation codecs for use in data storage and communication applications.
5
5
  Maintainer-email: Alistair Miles <alimanfoo@googlemail.com>
6
- License: MIT
6
+ License-Expression: MIT
7
7
  Project-URL: Bug Tracker, https://github.com/zarr-developers/numcodecs/issues
8
8
  Project-URL: Changelog, https://numcodecs.readthedocs.io/en/stable/release.html
9
9
  Project-URL: Documentation, https://numcodecs.readthedocs.io/
@@ -12,7 +12,6 @@ Classifier: Development Status :: 4 - Beta
12
12
  Classifier: Intended Audience :: Developers
13
13
  Classifier: Intended Audience :: Information Technology
14
14
  Classifier: Intended Audience :: Science/Research
15
- Classifier: License :: OSI Approved :: MIT License
16
15
  Classifier: Programming Language :: Python
17
16
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
18
17
  Classifier: Operating System :: Unix
@@ -21,6 +20,14 @@ Classifier: Programming Language :: Python :: 3 :: Only
21
20
  Requires-Python: >=3.11
22
21
  Description-Content-Type: text/x-rst
23
22
  License-File: LICENSE.txt
23
+ License-File: c-blosc/LICENSE.txt
24
+ License-File: c-blosc/LICENSES/BITSHUFFLE.txt
25
+ License-File: c-blosc/LICENSES/FASTLZ.txt
26
+ License-File: c-blosc/LICENSES/LZ4.txt
27
+ License-File: c-blosc/LICENSES/SNAPPY.txt
28
+ License-File: c-blosc/LICENSES/STDINT.txt
29
+ License-File: c-blosc/LICENSES/ZLIB-NG.txt
30
+ License-File: c-blosc/LICENSES/ZLIB.txt
24
31
  Requires-Dist: numpy>=1.24
25
32
  Requires-Dist: typing_extensions
26
33
  Provides-Extra: docs
@@ -32,6 +39,7 @@ Provides-Extra: test
32
39
  Requires-Dist: coverage; extra == "test"
33
40
  Requires-Dist: pytest; extra == "test"
34
41
  Requires-Dist: pytest-cov; extra == "test"
42
+ Requires-Dist: pyzstd; extra == "test"
35
43
  Provides-Extra: test-extras
36
44
  Requires-Dist: importlib_metadata; extra == "test-extras"
37
45
  Provides-Extra: msgpack
@@ -1,50 +1,58 @@
1
- numcodecs-0.16.0.dist-info/RECORD,,
2
- numcodecs-0.16.0.dist-info/WHEEL,sha256=KHOVnc2vWrx65VXrDDCaawSLNQgekLqYoXzctjltp_U,136
3
- numcodecs-0.16.0.dist-info/entry_points.txt,sha256=3W3FHKrwE52X3fLq8KdioOtf93lh5KaoGV5t2D10DBI,919
4
- numcodecs-0.16.0.dist-info/top_level.txt,sha256=JkHllzt6IuVudg4Tk--wF-yfPPsdVOiMTag1tjGIihw,10
5
- numcodecs-0.16.0.dist-info/METADATA,sha256=-ZkkQ6ebbtSkYNiXx2UGU4fpAbdUH6ocVxEbbdxx0DI,2963
6
- numcodecs-0.16.0.dist-info/licenses/LICENSE.txt,sha256=lJysaEeeE7bJeSRjUVC04e9eaXZq2eRy6oWgjBV2u5Y,1124
7
- numcodecs/jenkins.cpython-312-darwin.so,sha256=KoRbaeKu_HN4edsGmpHiJ_mHwodBcz7a42bU_2wzVKQ,203712
8
- numcodecs/lzma.py,sha256=6XeJ-c-lTJN1EVrIOb5cEFEiMGlNHsS4c_OentmUox0,2257
1
+ numcodecs-0.16.2.dist-info/RECORD,,
2
+ numcodecs-0.16.2.dist-info/WHEEL,sha256=V1loQ6TpxABu1APUg0MoTRBOzSKT5xVc3skizX-ovCU,136
3
+ numcodecs-0.16.2.dist-info/entry_points.txt,sha256=3W3FHKrwE52X3fLq8KdioOtf93lh5KaoGV5t2D10DBI,919
4
+ numcodecs-0.16.2.dist-info/top_level.txt,sha256=JkHllzt6IuVudg4Tk--wF-yfPPsdVOiMTag1tjGIihw,10
5
+ numcodecs-0.16.2.dist-info/METADATA,sha256=cyWrDyPJ7I1bwRDkNHGz2pTcVj70KhsfM6VW0u2kJE4,3290
6
+ numcodecs-0.16.2.dist-info/licenses/LICENSE.txt,sha256=lJysaEeeE7bJeSRjUVC04e9eaXZq2eRy6oWgjBV2u5Y,1124
7
+ numcodecs-0.16.2.dist-info/licenses/c-blosc/LICENSE.txt,sha256=ImIxMam59qhqTca5vMux0q6zkN-GvKAPxyevJHNcL64,1644
8
+ numcodecs-0.16.2.dist-info/licenses/c-blosc/LICENSES/SNAPPY.txt,sha256=UiGjaoAbmB-9_ae4fbZM_yMaO4giOgZsMlQRtTnfeW8,1475
9
+ numcodecs-0.16.2.dist-info/licenses/c-blosc/LICENSES/FASTLZ.txt,sha256=z1KQnm7XcP6BURumLU6-4TGF0wo30P194rVmheKIqzg,1135
10
+ numcodecs-0.16.2.dist-info/licenses/c-blosc/LICENSES/ZLIB.txt,sha256=hF78d4V9SF2R-z4LiEqqkpNoxxeugYa2b-HtJJV1MkM,1002
11
+ numcodecs-0.16.2.dist-info/licenses/c-blosc/LICENSES/BITSHUFFLE.txt,sha256=7zV8IGHPZ9spj58VZVcu4imtkmNYKp-dDr_1CU9dEKw,1148
12
+ numcodecs-0.16.2.dist-info/licenses/c-blosc/LICENSES/ZLIB-NG.txt,sha256=-K03V7wq6fWmr3fhOzelchOXQhzlWrFuHaSeRikmTSw,893
13
+ numcodecs-0.16.2.dist-info/licenses/c-blosc/LICENSES/LZ4.txt,sha256=_m3B8n9o2d1rAZLjm-Go8fvtD-huE1QPYYpxM5cbELM,1312
14
+ numcodecs-0.16.2.dist-info/licenses/c-blosc/LICENSES/STDINT.txt,sha256=8q8D21YuiFOfAZsasIgYeO6C0MgPO85oxlAGRlLiXXs,1568
15
+ numcodecs/jenkins.cpython-312-darwin.so,sha256=NvYDwd27HgoagriJ3kc3RB1W9prKrAn4TaFN3Wfs7ZE,188256
16
+ numcodecs/lzma.py,sha256=AsIzH_VkKs6Uj3xoP908j82pdTugxiX3MjaRiqWQw8k,2226
9
17
  numcodecs/astype.py,sha256=pfdFqjNvb-PETswa2_UxZm632O-y2Lex-g_68IJpiuk,2099
10
18
  numcodecs/gzip.py,sha256=DJuc87g8neqn-SYEeCEQwPSdEN5oZGgDUan9MTI6Fb4,1436
11
- numcodecs/zstd.cpython-312-darwin.so,sha256=o_b5nzmT89tSVN7WDXbooXInhLvmiU6UnaDxESTvFDg,731752
19
+ numcodecs/zstd.cpython-312-darwin.so,sha256=cxI2ZDH-_6jE3IWuDrkrMNEa44WVwB7nJshrPdiY0R4,733576
12
20
  numcodecs/base64.py,sha256=79BSqVvloKc8JYenUQfqdPm0a0JAZhd9Zld7k5Cp2lc,752
13
21
  numcodecs/bz2.py,sha256=4Ups3IMVsjvBlXyaeYONPdE14TaK9V-4LH5LSNe7AGc,1174
14
- numcodecs/version.py,sha256=DiQpBIZMVT47CbF7vAc_z27p1BtVHJkNlV2_J-6KcLU,513
22
+ numcodecs/version.py,sha256=ypwallA3PYa0X5lB0jSGkU5P26m2Z-w7iRiaWdnAP9g,513
15
23
  numcodecs/compat.py,sha256=JadagE6pTEcrX3V8wDml0n1tdkHvOWo6D21J3a4P0mw,6505
16
- numcodecs/_shuffle.cpython-312-darwin.so,sha256=bCt6FUlpbM0ilczFf1AGGXZ7eNtjasu__G1cLXPs848,182736
17
- numcodecs/checksum32.py,sha256=KoaT9cwXE-JEdwjEi6v5CM8HDgRcdqPm-G6IwEp45Po,5726
24
+ numcodecs/_shuffle.cpython-312-darwin.so,sha256=aaKSZi6wF68k6KAR7OC7h3TDomNHI22TYGF-xRjcMoc,182800
25
+ numcodecs/checksum32.py,sha256=zQv20v5CFCRtB3Kk0LiJ5zfgeWkJW6HZ21Lp7cMw22Y,5713
18
26
  numcodecs/ndarray_like.py,sha256=fVupUg_K_rDZNRlUmTiRp53OmF6YHb-yNyixJNFR8ME,1883
19
27
  numcodecs/quantize.py,sha256=4mPx4kWanv5wGa22HvEiP893xqG5dDDtN-oKChj6nfE,3016
20
28
  numcodecs/registry.py,sha256=oRN9uJsWIosZbAZFkOWyUos3GZ-h_zq_cN-t_uPLk0A,1864
21
- numcodecs/blosc.cpython-312-darwin.so,sha256=s4LV5INzmMFL2Vh2KdMGjBPkk35Dq_Hg6afweqXXkQ4,1041880
29
+ numcodecs/blosc.cpython-312-darwin.so,sha256=bpqT9eovZ4t2PrWoqymZ3hHm0FB-zl1tx4p5Bk4lgi0,1026744
22
30
  numcodecs/pickles.py,sha256=LtcMa6cK-V5TUYJNR4dRDsWWRmLfNv0syZddbrbRv3A,1290
23
31
  numcodecs/fixedscaleoffset.py,sha256=fQwP_H-P3Mq4_LXtMQw5CLYeMjCBUdTtV-AKWVAIzkY,4188
24
- numcodecs/lz4.cpython-312-darwin.so,sha256=fhQui0mYONVOVugGm8Qgkhhm7zNmePjYMIIPm401T8E,248824
32
+ numcodecs/lz4.cpython-312-darwin.so,sha256=fjjEfnXCOl45nyMSuqH0Y02erHIN3z1htDWQCDAkMWo,233528
25
33
  numcodecs/__init__.py,sha256=cgA3s5JGgVs9lAu6olFajOWgHpsCYtnLih10kMBBxS0,3104
26
34
  numcodecs/bitround.py,sha256=4lei39ZG4G2GGkDxl12q29nR5_8a4Icx4T-OgP1A1D4,2845
27
- numcodecs/vlen.cpython-312-darwin.so,sha256=rAiRSHLKwyqxdZDWQ6AE7BzWpUr1KJxz4W4ojgT5qgU,262120
35
+ numcodecs/vlen.cpython-312-darwin.so,sha256=MkijtLydRl5RIY9OQeHCnAlauvXAhtbqnFwDtl4IzyE,247128
28
36
  numcodecs/zlib.py,sha256=gLPUICEQc5p6DICC_63nOsbUqxzJH_5ynuzenTQXzOQ,1049
29
37
  numcodecs/shuffle.py,sha256=hYOFJOCEeDSNI-TqT1JrbQxbprkQD4R8VfSzD4IPI3I,1575
30
- numcodecs/zarr3.py,sha256=SG3H69Xj3jUwo2ArGOrPW3zZ0B_Hw4zcQf6Ve_GrpsE,14675
38
+ numcodecs/zarr3.py,sha256=fcLc0w3YSxujquhvdABOoc0Z0QfO2rK8BwSLH0MFisM,13117
31
39
  numcodecs/delta.py,sha256=x0PjNiuX48rmh9M6ZHoYkI9bKOq00Aiyz_jLrVlAq8w,2791
32
- numcodecs/zfpy.py,sha256=--TCrXOsSJ-2uU_7d-0YwHpk8Hti98hofB4jht5helk,3900
40
+ numcodecs/zfpy.py,sha256=2GRLkDnDQf_VbxXYn34MQTYVZfrsTuGR4-_vWdpya00,3869
33
41
  numcodecs/msgpacks.py,sha256=GkTcFJrhKdpWnwQn4-282q4_edqlzZFdJFux2LtNk30,2619
34
42
  numcodecs/errors.py,sha256=IV0B9fw_Wn8k3fjLtXOOU_-0_Al-dWY_dizvqFiNwkk,663
35
- numcodecs/fletcher32.cpython-312-darwin.so,sha256=_6uc-5guAiy1tdP1UWnluGsXlL6qb12JA7WpRa0ommc,206800
36
- numcodecs/compat_ext.cpython-312-darwin.so,sha256=20-oYoRFJ2w3IZpzh8GqOGlAVQ5Rd-_237zqsXnzZ0E,57408
43
+ numcodecs/fletcher32.cpython-312-darwin.so,sha256=5xtel0o2p2MBsZPmtG9SntSJRWmg7vqoWZprpcyWE-Y,207952
44
+ numcodecs/compat_ext.cpython-312-darwin.so,sha256=2FAxsMzhcn4bHaWdnFXuwuBiK9C2BTjS5yc71FVnWpU,57456
37
45
  numcodecs/packbits.py,sha256=L7gM-8AQQTPC2IOPbatzNp-tH67EUp0Tonx_JSYHje4,1993
38
46
  numcodecs/categorize.py,sha256=jPipT6mVrpGSe9QuI-MeVzTZuUKAZWF0XN5Wj_8Ifng,2948
39
47
  numcodecs/json.py,sha256=WQcDcDPVxAQm-sxUg_XD70InKLD4iyjQOBiHPn2N3VE,3393
40
- numcodecs/abc.py,sha256=13vRquZ-u_n1YqM9SYx8sBDseJlH9A_A57_Z2QE-4KY,4504
48
+ numcodecs/abc.py,sha256=HGQVq7pPTByqylBqjbLhhDVE71OIAzMOfWnQ1MSTO2s,4473
41
49
  numcodecs/pcodec.py,sha256=ZB2Hw5l7aOKi0hOQ3M7GOAwaTNCBRiNr_8IpJPdrcE4,4714
42
50
  numcodecs/tests/test_categorize.py,sha256=ftL-LSVq63R-kGuQxUb96uL1e563mlF9CWAf3yQB-Bk,2756
43
51
  numcodecs/tests/test_registry.py,sha256=9Wp-VxGtEtNvwj46Edv6R8Jc4WPu80yWP7mRZyxepJ4,1116
44
52
  numcodecs/tests/test_vlen_utf8.py,sha256=H92YtqNY0kpO2Icu1Ey2iItK38ZhKMnJi_2FBwcKSvU,2474
45
53
  numcodecs/tests/test_bitround.py,sha256=ayCuANNDA0cP3mqZkJ90QU9eI7ws4-lPRKU_gkflOlg,2349
46
54
  numcodecs/tests/test_gzip.py,sha256=I685q0_vu3b_JibUz3nhW1mQtlLSQzGdgGD2twbGPXc,2925
47
- numcodecs/tests/test_zarr3.py,sha256=LbOuTVEn1XGhtLNx3Sv3wUu3gl0kV7ne_gE_cloUYIE,8483
55
+ numcodecs/tests/test_zarr3.py,sha256=2d8P6iuJql3lmCVIcCKUQ-lKh7I2ahUNbk44Vy9-zRc,9366
48
56
  numcodecs/tests/test_delta.py,sha256=1_XnV1JYMEnxO0iXDXVSzTltjRPtdoEb4Y8TpmllS-o,1636
49
57
  numcodecs/tests/test_lzma.py,sha256=mPj5MebkWg1h0W4ClFF_34cJ0_Toje7z7JZ8gOMngzs,2723
50
58
  numcodecs/tests/test_bz2.py,sha256=pefO_YlOLr-RIswHas8DAQ4j81jhqLT5XGEuQ2i8DtI,1889
@@ -59,21 +67,22 @@ numcodecs/tests/test_astype.py,sha256=Wu1HtHZA6K_rW-JCxSWmU4Wwp9U83JUbUZ2ro9xDk9
59
67
  numcodecs/tests/test_jenkins.py,sha256=DoOXdTLD25aXA0nwiO1zk_vG4N2UI6Wc3C72yqIByNc,4446
60
68
  numcodecs/tests/test_fletcher32.py,sha256=hNf2zSAi16k4222qI2k-n5X4GgswVBfOqvKHSgSoRxQ,1456
61
69
  numcodecs/tests/test_packbits.py,sha256=8B2sQnM-DiAEtehCEm5xm7fQ1xWm0rMk_z7Uk8OXvGI,989
62
- numcodecs/tests/common.py,sha256=5U3kGYIpVLSBbjqRONDDZxzg2eIlTS5EVmn5Lzp9E4I,9336
70
+ numcodecs/tests/common.py,sha256=_aRsy2opNa4t4byfvsUgMe4lxH_Oua125tfQWR1gBgI,9307
63
71
  numcodecs/tests/test_base64.py,sha256=QseE5-aDwz7yv5-0dAG_6vTjeN3OpFvgcg8IhklRA4Y,2315
64
72
  numcodecs/tests/test_shuffle.py,sha256=uFWTuBbdcqwnWbyh2knwc46klZ00VekzWh8Ya0I2HiE,4659
65
73
  numcodecs/tests/test_fixedscaleoffset.py,sha256=3RclYFw3WFu36WUIciZ23gNIiBmzboXvrEugMw1311A,2536
66
74
  numcodecs/tests/test_compat.py,sha256=YdaGiNsXgounzSX7uFXOz_7uh6Wf1n6kO0Ql6eICtIY,3728
75
+ numcodecs/tests/test_pyzstd.py,sha256=NQRPeMw_TqLK91faoedBfe2rvCB79cfNj4e9cwiYmnU,2614
67
76
  numcodecs/tests/test_zlib.py,sha256=TFa-I15xHd4h2nNC2goChWdlB_xZLbK_vAL7s4upPWI,2539
68
77
  numcodecs/tests/test_json.py,sha256=od5MZbSclKFWM_RjS2DsVWGIYlJXG6-wm0yQLdkBTh0,2292
69
78
  numcodecs/tests/test_ndarray_like.py,sha256=Bh8wDqkbSL-yr_MDQqE5XUoWzZav5J_VzC8Lfv3BBlA,1273
70
79
  numcodecs/tests/test_vlen_array.py,sha256=QaWVuflGxQUFToVcWVIzZHG_b8Vm4JJG6mBZVGNasK0,2477
71
- numcodecs/tests/test_zstd.py,sha256=79R6VMhni-6kg9LmlmBzGe22HXhg0RvSVjw4jVNPMJQ,2610
72
- numcodecs/tests/test_vlen_bytes.py,sha256=jmjWdWHhB2pbVKMCVlqwP0Ztnnc1UVZbA3rInucP6KE,2697
80
+ numcodecs/tests/test_zstd.py,sha256=yca-1BY9kh82ini_gabj5THf3udeUhwxnzW23ZN4xBA,5610
81
+ numcodecs/tests/test_vlen_bytes.py,sha256=BpASj3-ap_ZjyK_nYP7YQSZg4gsECCh5DW_4pdNlhRs,2473
73
82
  numcodecs/tests/test_entrypoints.py,sha256=zWbyosPRhbSevwp4grlfjfnEyIneny-u7XmMe1xcoLI,504
74
83
  numcodecs/tests/test_zarr3_import.py,sha256=JBDyrL57lbZMI9axb9eA1OZnd_Lg-ppfsNV3VvxwVxk,332
75
84
  numcodecs/tests/test_checksum32.py,sha256=D0BV_p3XQ2Dv9jIoI9zEQel-PO25KWYIpUDgrhr6Cf8,4601
76
85
  numcodecs/tests/test_zfpy.py,sha256=g_2txraHDbnBPtbymJXsgAiD6MBH44-JYRkNx9tttYw,2762
77
- numcodecs/tests/test_blosc.py,sha256=Ym1JtkbUhsXY_zEkyNU6lt4hbR_zZnM0WzbT33dZs7k,9496
86
+ numcodecs/tests/test_blosc.py,sha256=zm9zPNk-Si3TjoMG3c2T_y3V7szH7sxNrDLAeM3qElY,9663
78
87
  numcodecs/tests/package_with_entrypoint-0.1.dist-info/entry_points.txt,sha256=wel2k9KStuNez__clm2tjAwrcXiP17De8yNScHYtQZU,60
79
88
  numcodecs/tests/package_with_entrypoint/__init__.py,sha256=wLyrk73nqKO8rcFtA_sXlcC8PKMzdYbbBRY8eH8Xc10,212
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (78.1.0)
2
+ Generator: setuptools (80.9.0)
3
3
  Root-Is-Purelib: false
4
4
  Tag: cp312-cp312-macosx_11_0_arm64
5
5
  Generator: delocate 0.13.0
@@ -0,0 +1,31 @@
1
+ BSD License
2
+
3
+ For Blosc - A blocking, shuffling and lossless compression library
4
+
5
+ Copyright (c) 2009-2018 Francesc Alted <francesc@blosc.org>
6
+ Copyright (c) 2019-present Blosc Development Team <blosc@blosc.org>
7
+
8
+ Redistribution and use in source and binary forms, with or without modification,
9
+ are permitted provided that the following conditions are met:
10
+
11
+ * Redistributions of source code must retain the above copyright notice, this
12
+ list of conditions and the following disclaimer.
13
+
14
+ * Redistributions in binary form must reproduce the above copyright notice,
15
+ this list of conditions and the following disclaimer in the documentation
16
+ and/or other materials provided with the distribution.
17
+
18
+ * Neither the name Francesc Alted nor the names of its contributors may be used
19
+ to endorse or promote products derived from this software without specific
20
+ prior written permission.
21
+
22
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
23
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
24
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
25
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
26
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
27
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
29
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
31
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,21 @@
1
+ Bitshuffle - Filter for improving compression of typed binary data.
2
+
3
+ Copyright (c) 2014 Kiyoshi Masui (kiyo@physics.ubc.ca)
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,20 @@
1
+ FastLZ - Byte-aligned LZ77 compression library
2
+ Copyright (C) 2005-2020 Ariya Hidayat <ariya.hidayat@gmail.com>
3
+
4
+ Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ of this software and associated documentation files (the "Software"), to deal
6
+ in the Software without restriction, including without limitation the rights
7
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ copies of the Software, and to permit persons to whom the Software is
9
+ furnished to do so, subject to the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be included in
12
+ all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20
+ THE SOFTWARE.
@@ -0,0 +1,25 @@
1
+
2
+ LZ4 Library
3
+ Copyright (c) 2011-2020, Yann Collet
4
+ All rights reserved.
5
+
6
+ Redistribution and use in source and binary forms, with or without modification,
7
+ are permitted provided that the following conditions are met:
8
+
9
+ * Redistributions of source code must retain the above copyright notice, this
10
+ list of conditions and the following disclaimer.
11
+
12
+ * Redistributions in binary form must reproduce the above copyright notice, this
13
+ list of conditions and the following disclaimer in the documentation and/or
14
+ other materials provided with the distribution.
15
+
16
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
20
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
23
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,28 @@
1
+ Copyright 2011, Google Inc.
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without
5
+ modification, are permitted provided that the following conditions are
6
+ met:
7
+
8
+ * Redistributions of source code must retain the above copyright
9
+ notice, this list of conditions and the following disclaimer.
10
+ * Redistributions in binary form must reproduce the above
11
+ copyright notice, this list of conditions and the following disclaimer
12
+ in the documentation and/or other materials provided with the
13
+ distribution.
14
+ * Neither the name of Google Inc. nor the names of its
15
+ contributors may be used to endorse or promote products derived from
16
+ this software without specific prior written permission.
17
+
18
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,29 @@
1
+ ISO C9x compliant stdint.h for Microsoft Visual Studio
2
+ Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124
3
+
4
+ Copyright (c) 2006-2013 Alexander Chemeris
5
+
6
+ Redistribution and use in source and binary forms, with or without
7
+ modification, are permitted provided that the following conditions are met:
8
+
9
+ 1. Redistributions of source code must retain the above copyright notice,
10
+ this list of conditions and the following disclaimer.
11
+
12
+ 2. Redistributions in binary form must reproduce the above copyright
13
+ notice, this list of conditions and the following disclaimer in the
14
+ documentation and/or other materials provided with the distribution.
15
+
16
+ 3. Neither the name of the product nor the names of its contributors may
17
+ be used to endorse or promote products derived from this software
18
+ without specific prior written permission.
19
+
20
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
21
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
22
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
23
+ EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
26
+ OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
27
+ WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
28
+ OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
29
+ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,17 @@
1
+ (C) 1995-2013 Jean-loup Gailly and Mark Adler
2
+
3
+ This software is provided 'as-is', without any express or implied
4
+ warranty. In no event will the authors be held liable for any damages
5
+ arising from the use of this software.
6
+
7
+ Permission is granted to anyone to use this software for any purpose,
8
+ including commercial applications, and to alter it and redistribute it
9
+ freely, subject to the following restrictions:
10
+
11
+ 1. The origin of this software must not be misrepresented; you must not
12
+ claim that you wrote the original software. If you use this software
13
+ in a product, an acknowledgment in the product documentation would be
14
+ appreciated but is not required.
15
+ 2. Altered source versions must be plainly marked as such, and must not be
16
+ misrepresented as being the original software.
17
+ 3. This notice may not be removed or altered from any source distribution.
@@ -0,0 +1,22 @@
1
+ Copyright notice:
2
+
3
+ (C) 1995-2022 Jean-loup Gailly and Mark Adler
4
+
5
+ This software is provided 'as-is', without any express or implied
6
+ warranty. In no event will the authors be held liable for any damages
7
+ arising from the use of this software.
8
+
9
+ Permission is granted to anyone to use this software for any purpose,
10
+ including commercial applications, and to alter it and redistribute it
11
+ freely, subject to the following restrictions:
12
+
13
+ 1. The origin of this software must not be misrepresented; you must not
14
+ claim that you wrote the original software. If you use this software
15
+ in a product, an acknowledgment in the product documentation would be
16
+ appreciated but is not required.
17
+ 2. Altered source versions must be plainly marked as such, and must not be
18
+ misrepresented as being the original software.
19
+ 3. This notice may not be removed or altered from any source distribution.
20
+
21
+ Jean-loup Gailly Mark Adler
22
+ jloup@gzip.org madler@alumni.caltech.edu