import gzip
import lzma
import zlib
from enum import Enum
from typing import Protocol
class CompressionLevel(Enum):
NONE = 0
FAST = 1
BALANCED = 6
MAXIMUM = 9
class Compressor(Protocol):
def compress(self, data: bytes, level: int) -> bytes:
...
def decompress(self, data: bytes) -> bytes:
...
class GzipCompressor:
def compress(self, data: bytes, level: int = 6) -> bytes:
return gzip.compress(data, compresslevel=level)
def decompress(self, data: bytes) -> bytes:
return gzip.decompress(data)
class LZMACompressor:
def compress(self, data: bytes, level: int = 6) -> bytes:
return lzma.compress(data, preset=level)
def decompress(self, data: bytes) -> bytes:
return lzma.decompress(data)
class ZlibCompressor:
def compress(self, data: bytes, level: int = 6) -> bytes:
return zlib.compress(data, level=level)
def decompress(self, data: bytes) -> bytes:
return zlib.decompress(data)
def get_compressor(algorithm: str = "gzip") -> Compressor:
compressors = {
"gzip": GzipCompressor(),
"lzma": LZMACompressor(),
"zlib": ZlibCompressor(),
}
if algorithm not in compressors:
raise ValueError(f"Unknown compression algorithm: {algorithm}")
return compressors[algorithm]