summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOmer Katz <omer.drow@gmail.com>2019-01-13 09:44:44 +0200
committerGitHub <noreply@github.com>2019-01-13 09:44:44 +0200
commit627964c804407322bc30c91402767652b4659e35 (patch)
treed3d68d4df00c76f832169ec179e7d5ba59d4155e
parent8c88d9276a390c5abdf43247283feaab7841c2e7 (diff)
downloadkombu-627964c804407322bc30c91402767652b4659e35.tar.gz
Added optional support for zstd compression. (#985)
-rw-r--r--kombu/compression.py17
-rw-r--r--requirements/extras/zstd.txt1
-rw-r--r--requirements/test-ci.txt1
-rw-r--r--t/unit/test_compression.py14
4 files changed, 33 insertions, 0 deletions
diff --git a/kombu/compression.py b/kombu/compression.py
index 0f1c43d2..2eeb34cc 100644
--- a/kombu/compression.py
+++ b/kombu/compression.py
@@ -100,3 +100,20 @@ if lzma: # pragma: no cover
register(lzma.compress,
lzma.decompress,
'application/x-lzma', aliases=['lzma', 'xz'])
+
+try:
+ import zstandard as zstd
+except ImportError: # pragma: no cover
+ pass
+else:
+ def zstd_compress(body):
+ c = zstd.ZstdCompressor()
+ return c.compress(body)
+
+ def zstd_decompress(body):
+ d = zstd.ZstdDecompressor()
+ return d.decompress(body)
+
+ register(zstd_compress,
+ zstd_decompress,
+ 'application/zstd', aliases=['zstd', 'zstandard'])
diff --git a/requirements/extras/zstd.txt b/requirements/extras/zstd.txt
new file mode 100644
index 00000000..864700d2
--- /dev/null
+++ b/requirements/extras/zstd.txt
@@ -0,0 +1 @@
+zstandard
diff --git a/requirements/test-ci.txt b/requirements/test-ci.txt
index 143af172..3c0e7e15 100644
--- a/requirements/test-ci.txt
+++ b/requirements/test-ci.txt
@@ -10,4 +10,5 @@ msgpack-python>0.2.0
-r extras/librabbitmq.txt
-r extras/zookeeper.txt
-r extras/brotli.txt
+-r extras/zstd.txt
sqlalchemy
diff --git a/t/unit/test_compression.py b/t/unit/test_compression.py
index 9e3bf4df..1df873d3 100644
--- a/t/unit/test_compression.py
+++ b/t/unit/test_compression.py
@@ -28,6 +28,11 @@ class test_compression:
assert 'application/x-lzma' in compression.encoders()
+ def test_encoders__zstd(self):
+ pytest.importorskip('zstandard')
+
+ assert 'application/zstd' in compression.encoders()
+
def test_compress__decompress__zlib(self):
text = b'The Quick Brown Fox Jumps Over The Lazy Dog'
c, ctype = compression.compress(text, 'zlib')
@@ -65,3 +70,12 @@ class test_compression:
assert text != c
d = compression.decompress(c, ctype)
assert d == text
+
+ def test_compress__decompress__zstd(self):
+ pytest.importorskip('zstandard')
+
+ text = b'The Brown Quick Fox Over The Lazy Dog Jumps'
+ c, ctype = compression.compress(text, 'zstd')
+ assert text != c
+ d = compression.decompress(c, ctype)
+ assert d == text