##// END OF EJS Templates
util: add a stream compression API to compression engines...
Gregory Szorc -
r30356:c86109ef default
parent child Browse files
Show More
@@ -2966,10 +2966,22 b' class compressionengine(object):'
2966 2966 exclude the name from external usage, set the first element to ``None``.
2967 2967
2968 2968 If bundle compression is supported, the class must also implement
2969 ``compressorobj`` and `decompressorreader``.
2969 ``compressstream``, ``compressorobj`` and `decompressorreader``.
2970 2970 """
2971 2971 return None
2972 2972
2973 def compressstream(self, it, opts=None):
2974 """Compress an iterator of chunks.
2975
2976 The method receives an iterator (ideally a generator) of chunks of
2977 bytes to be compressed. It returns an iterator (ideally a generator)
2978 of bytes of chunks representing the compressed output.
2979
2980 Optionally accepts an argument defining how to perform compression.
2981 Each engine treats this argument differently.
2982 """
2983 raise NotImplementedError()
2984
2973 2985 def compressorobj(self):
2974 2986 """(Temporary) Obtain an object used for compression.
2975 2987
@@ -2997,6 +3009,19 b' class _zlibengine(compressionengine):'
2997 3009 def compressorobj(self):
2998 3010 return zlib.compressobj()
2999 3011
3012 def compressstream(self, it, opts=None):
3013 opts = opts or {}
3014
3015 z = zlib.compressobj(opts.get('level', -1))
3016 for chunk in it:
3017 data = z.compress(chunk)
3018 # Not all calls to compress emit data. It is cheaper to inspect
3019 # here than to feed empty chunks through generator.
3020 if data:
3021 yield data
3022
3023 yield z.flush()
3024
3000 3025 def decompressorreader(self, fh):
3001 3026 def gen():
3002 3027 d = zlib.decompressobj()
@@ -3017,6 +3042,16 b' class _bz2engine(compressionengine):'
3017 3042 def compressorobj(self):
3018 3043 return bz2.BZ2Compressor()
3019 3044
3045 def compressstream(self, it, opts=None):
3046 opts = opts or {}
3047 z = bz2.BZ2Compressor(opts.get('level', 9))
3048 for chunk in it:
3049 data = z.compress(chunk)
3050 if data:
3051 yield data
3052
3053 yield z.flush()
3054
3020 3055 def decompressorreader(self, fh):
3021 3056 def gen():
3022 3057 d = bz2.BZ2Decompressor()
@@ -3065,6 +3100,9 b' class _noopengine(compressionengine):'
3065 3100 def compressorobj(self):
3066 3101 return nocompress()
3067 3102
3103 def compressstream(self, it, opts=None):
3104 return it
3105
3068 3106 def decompressorreader(self, fh):
3069 3107 return fh
3070 3108
General Comments 0
You need to be logged in to leave comments. Login now