Browse Source

add lzma ("xz") compressor (not used yet)

lzma (known from .xz files) can compress better than zlib, but takes significantly more time for that.

Note:
compressor is set up in attic.key.KeyBase and currently still uses ZlibCompressor.

 This changeset is primarily for experimenting with lzma and also to keep changesets clean.
Selection, auto-detection and parametrization of compression method is still TODO.
Thomas Waldmann 10 năm trước cách đây
mục cha
commit
61af8a4bab
2 tập tin đã thay đổi với 28 bổ sung4 xóa
  1. 23 3
      attic/key.py
  2. 5 1
      setup.py

+ 23 - 3
attic/key.py

@@ -7,6 +7,14 @@ import hmac
 from hashlib import sha256
 import zlib
 
+try:
+    import lzma  # python >= 3.3
+except ImportError:
+    try:
+        from backports import lzma  # backports.lzma from pypi
+    except ImportError:
+        lzma = None
+
 from attic.crypto import pbkdf2_sha256, get_random_bytes, AES, bytes_to_long, long_to_bytes, bytes_to_int, num_aes_blocks
 from attic.helpers import IntegrityError, get_keys_dir, Error
 
@@ -44,7 +52,7 @@ def key_factory(repository, manifest_data):
         raise UnsupportedPayloadError(manifest_data[0])
 
 
-class CompressionBase(object):
+class CompressorBase(object):
     def compress(self, data):
         pass
 
@@ -52,7 +60,7 @@ class CompressionBase(object):
         pass
 
 
-class ZlibCompression(CompressionBase):
+class ZlibCompressor(CompressorBase):
     def compress(self, data):
         return zlib.compress(data)
 
@@ -60,11 +68,23 @@ class ZlibCompression(CompressionBase):
         return zlib.decompress(data)
 
 
+class LzmaCompressor(CompressorBase):
+    def __init__(self):
+        if lzma is None:
+            raise NotImplemented("lzma compression needs Python >= 3.3 or backports.lzma from PyPi")
+
+    def compress(self, data):
+        return lzma.compress(data)
+
+    def decompress(self, data):
+        return lzma.decompress(data)
+
+
 class KeyBase(object):
 
     def __init__(self):
         self.TYPE_STR = bytes([self.TYPE])
-        self.compressor = ZlibCompression()
+        self.compressor = ZlibCompressor()
 
     def id_hash(self, data):
         """Return HMAC hash using the "id" HMAC key

+ 5 - 1
setup.py

@@ -96,6 +96,10 @@ elif platform == 'FreeBSD':
 elif platform == 'Darwin':
     ext_modules.append(Extension('attic.platform_darwin', [platform_darwin_source]))
 
+install_requires = ['msgpack-python']
+if sys.version_info < (3, 3):
+    install_requires.append('backports.lzma')
+
 setup(
     name='Attic',
     version=versioneer.get_version(),
@@ -122,5 +126,5 @@ setup(
     scripts=['scripts/attic'],
     cmdclass=cmdclass,
     ext_modules=ext_modules,
-    install_requires=['msgpack-python']
+    install_requires=install_requires,
 )