3939    assert "some data" == snappy.uncompress(compressed) 
4040
4141""" 
42- from  __future__ import  absolute_import 
42+ from  __future__ import  absolute_import ,  annotations 
4343
4444import  struct 
45+ from  typing  import  (
46+     Optional , Union , IO , BinaryIO , Protocol , Type , overload , Any ,
47+ )
4548
4649import  cramjam 
4750
@@ -59,7 +62,7 @@ class UncompressError(Exception):
5962    pass 
6063
6164
62- def  isValidCompressed (data ) :
65+ def  isValidCompressed (data :  Union [ str ,  bytes ])  ->   bool :
6366    if  isinstance (data , str ):
6467        data  =  data .encode ('utf-8' )
6568
@@ -71,12 +74,18 @@ def isValidCompressed(data):
7174    return  ok 
7275
7376
74- def  compress (data ,  encoding = 'utf-8' ):
77+ def  compress (data :  Union [ str ,  bytes ],  encoding :  str   =   'utf-8' )  ->   bytes :
7578    if  isinstance (data , str ):
7679        data  =  data .encode (encoding )
7780
7881    return  bytes (_compress (data ))
7982
83+ @overload  
84+ def  uncompress (data : bytes ) ->  bytes : ...
85+ 
86+ @overload  
87+ def  uncompress (data : bytes , decoding : Optional [str ] =  None ) ->  Union [str , bytes ]: ...
88+ 
8089def  uncompress (data , decoding = None ):
8190    if  isinstance (data , str ):
8291        raise  UncompressError ("It's only possible to uncompress bytes" )
@@ -91,6 +100,16 @@ def uncompress(data, decoding=None):
91100
92101decompress  =  uncompress 
93102
103+ 
104+ class  Compressor (Protocol ):
105+     def  add_chunk (self , data ) ->  Any : ...
106+ 
107+ 
108+ class  Decompressor (Protocol ):
109+     def  decompress (self , data ) ->  Any : ...
110+     def  flush (self ): ...
111+ 
112+ 
94113class  StreamCompressor ():
95114
96115    """This class implements the compressor-side of the proposed Snappy framing 
@@ -111,7 +130,7 @@ class StreamCompressor():
111130    def  __init__ (self ):
112131        self .c  =  cramjam .snappy .Compressor ()
113132
114-     def  add_chunk (self , data : bytes , compress = None ):
133+     def  add_chunk (self , data : bytes , compress = None )  ->   bytes :
115134        """Add a chunk, returning a string that is framed and compressed.  
116135         
117136        Outputs a single snappy chunk; if it is the very start of the stream, 
@@ -122,10 +141,10 @@ def add_chunk(self, data: bytes, compress=None):
122141
123142    compress  =  add_chunk 
124143
125-     def  flush (self ):
144+     def  flush (self )  ->   bytes :
126145        return  bytes (self .c .flush ())
127146
128-     def  copy (self ):
147+     def  copy (self )  ->   'StreamCompressor' :
129148        """This method exists for compatibility with the zlib compressobj. 
130149        """ 
131150        return  self 
@@ -159,7 +178,7 @@ def check_format(fin):
159178        except :
160179            return  False 
161180
162-     def  decompress (self , data : bytes ):
181+     def  decompress (self , data : bytes )  ->   bytes :
163182        """Decompress 'data', returning a string containing the uncompressed 
164183        data corresponding to at least part of the data in string. This data 
165184        should be concatenated to the output produced by any preceding calls to 
@@ -191,15 +210,15 @@ def decompress(self, data: bytes):
191210        self .c .decompress (data )
192211        return  self .flush ()
193212
194-     def  flush (self ):
213+     def  flush (self )  ->   bytes :
195214        return  bytes (self .c .flush ())
196215
197-     def  copy (self ):
216+     def  copy (self )  ->   'StreamDecompressor' :
198217        return  self 
199218
200219
201220class  HadoopStreamCompressor ():
202-     def  add_chunk (self , data : bytes , compress = None ):
221+     def  add_chunk (self , data : bytes , compress = None )  ->   bytes :
203222        """Add a chunk, returning a string that is framed and compressed.  
204223         
205224        Outputs a single snappy chunk; if it is the very start of the stream, 
@@ -210,11 +229,11 @@ def add_chunk(self, data: bytes, compress=None):
210229
211230    compress  =  add_chunk 
212231
213-     def  flush (self ):
232+     def  flush (self )  ->   bytes :
214233        # never maintains a buffer 
215234        return  b"" 
216235
217-     def  copy (self ):
236+     def  copy (self )  ->   'HadoopStreamCompressor' :
218237        """This method exists for compatibility with the zlib compressobj. 
219238        """ 
220239        return  self 
@@ -241,7 +260,7 @@ def check_format(fin):
241260        except :
242261            return  False 
243262
244-     def  decompress (self , data : bytes ):
263+     def  decompress (self , data : bytes )  ->   bytes :
245264        """Decompress 'data', returning a string containing the uncompressed 
246265        data corresponding to at least part of the data in string. This data 
247266        should be concatenated to the output produced by any preceding calls to 
@@ -264,18 +283,18 @@ def decompress(self, data: bytes):
264283            data  =  data [8  +  chunk_length :]
265284        return  b"" .join (out )
266285
267-     def  flush (self ):
286+     def  flush (self )  ->   bytes :
268287        return  b"" 
269288
270-     def  copy (self ):
289+     def  copy (self )  ->   'HadoopStreamDecompressor' :
271290        return  self 
272291
273292
274293
275- def  stream_compress (src ,
276-                     dst ,
277-                     blocksize = _STREAM_TO_STREAM_BLOCK_SIZE ,
278-                     compressor_cls = StreamCompressor ):
294+ def  stream_compress (src :  IO ,
295+                     dst :  IO ,
296+                     blocksize :  int   =   _STREAM_TO_STREAM_BLOCK_SIZE ,
297+                     compressor_cls :  Type [ Compressor ]  =   StreamCompressor )  ->   None :
279298    """Takes an incoming file-like object and an outgoing file-like object, 
280299    reads data from src, compresses it, and writes it to dst. 'src' should 
281300    support the read method, and 'dst' should support the write method. 
@@ -290,11 +309,11 @@ def stream_compress(src,
290309        if  buf : dst .write (buf )
291310
292311
293- def  stream_decompress (src ,
294-                       dst ,
295-                       blocksize = _STREAM_TO_STREAM_BLOCK_SIZE ,
296-                       decompressor_cls = StreamDecompressor ,
297-                       start_chunk = None ):
312+ def  stream_decompress (src :  IO ,
313+                       dst :  IO ,
314+                       blocksize :  int   =   _STREAM_TO_STREAM_BLOCK_SIZE ,
315+                       decompressor_cls :  Type [ Decompressor ]  =   StreamDecompressor ,
316+                       start_chunk = None )  ->   None :
298317    """Takes an incoming file-like object and an outgoing file-like object, 
299318    reads data from src, decompresses it, and writes it to dst. 'src' should 
300319    support the read method, and 'dst' should support the write method. 
@@ -319,10 +338,10 @@ def stream_decompress(src,
319338
320339
321340def  hadoop_stream_decompress (
322-     src ,
323-     dst ,
324-     blocksize = _STREAM_TO_STREAM_BLOCK_SIZE ,
325- ):
341+     src :  BinaryIO ,
342+     dst :  BinaryIO ,
343+     blocksize :  int   =   _STREAM_TO_STREAM_BLOCK_SIZE ,
344+ )  ->   None :
326345    c  =  HadoopStreamDecompressor ()
327346    while  True :
328347        data  =  src .read (blocksize )
@@ -335,10 +354,10 @@ def hadoop_stream_decompress(
335354
336355
337356def  hadoop_stream_compress (
338-     src ,
339-     dst ,
340-     blocksize = _STREAM_TO_STREAM_BLOCK_SIZE ,
341- ):
357+     src :  BinaryIO ,
358+     dst :  BinaryIO ,
359+     blocksize :  int   =   _STREAM_TO_STREAM_BLOCK_SIZE ,
360+ )  ->   None :
342361    c  =  HadoopStreamCompressor ()
343362    while  True :
344363        data  =  src .read (blocksize )
@@ -350,11 +369,11 @@ def hadoop_stream_compress(
350369    dst .flush ()
351370
352371
353- def  raw_stream_decompress (src , dst ) :
372+ def  raw_stream_decompress (src :  BinaryIO , dst :  BinaryIO )  ->   None :
354373    data  =  src .read ()
355374    dst .write (decompress (data ))
356375
357376
358- def  raw_stream_compress (src , dst ) :
377+ def  raw_stream_compress (src :  BinaryIO , dst :  BinaryIO )  ->   None :
359378    data  =  src .read ()
360379    dst .write (compress (data ))
0 commit comments