1- from collections .abc import Callable
1+ from collections .abc import Callable , Iterator
22from datetime import datetime
3- from typing import BinaryIO
3+ from typing import Any , BinaryIO
44
55
6- class ProgressFile :
6+ class ProgressFile ( BinaryIO ) :
77 """Wraps a file object to track read progress."""
88
99 def __init__ (
1010 self ,
1111 file : BinaryIO ,
1212 progress_callback : Callable [[int ], None ],
1313 update_interval : float = 0.5 ,
14- ):
14+ ) -> None :
1515 self ._file = file
1616 self ._progress_callback = progress_callback
1717 self ._update_interval = update_interval
1818 self ._last_update_time = 0.0
1919 self ._bytes_read = 0
2020
21- def read (self , n = - 1 ):
21+ def read (self , n : int = - 1 ) -> bytes :
2222 data = self ._file .read (n )
2323 self ._bytes_read += len (data )
2424 now_ = datetime .now ().timestamp ()
@@ -28,15 +28,70 @@ def read(self, n=-1):
2828 self ._last_update_time = now_
2929 return data
3030
31- def __iter__ (self ):
32- return self ._file .__iter__ ()
31+ def fileno (self ) -> int :
32+ return self ._file .fileno ()
3333
3434 @property
35- def name (self ):
35+ def name (self ) -> str :
3636 return self ._file .name
3737
38- def seek (self , offset : int , whence : int = 0 , / ) :
38+ def seek (self , offset : int , whence : int = 0 ) -> int :
3939 return self ._file .seek (offset , whence )
4040
41- def tell (self ):
41+ def tell (self ) -> int :
4242 return self ._file .tell ()
43+
44+ def __iter__ (self ) -> Iterator [bytes ]:
45+ return self ._file .__iter__ ()
46+
47+ def __next__ (self ) -> bytes :
48+ return next (self ._file )
49+
50+ @property
51+ def mode (self ) -> str :
52+ return self ._file .mode
53+
54+ def readable (self ) -> bool :
55+ return self ._file .readable ()
56+
57+ def seekable (self ) -> bool :
58+ return self ._file .seekable ()
59+
60+ # Methods below are just to satisfy the BinaryIO interface
61+
62+ def write (self , * _args : Any , ** kwargs : Any ) -> int :
63+ raise NotImplementedError ()
64+
65+ def readline (self , * _args : Any , ** kwargs : Any ) -> bytes :
66+ raise NotImplementedError ()
67+
68+ def readlines (self , * _args : Any , ** kwargs : Any ) -> list [bytes ]:
69+ raise NotImplementedError ()
70+
71+ def writelines (self , * _args : Any , ** kwargs : Any ) -> None :
72+ raise NotImplementedError ()
73+
74+ def __enter__ (self ) -> BinaryIO :
75+ raise NotImplementedError ()
76+
77+ def __exit__ (self , * _args : Any ) -> None :
78+ raise NotImplementedError ()
79+
80+ def close (self ) -> None :
81+ raise NotImplementedError ()
82+
83+ @property
84+ def closed (self ) -> bool :
85+ raise NotImplementedError ()
86+
87+ def flush (self ) -> None :
88+ raise NotImplementedError ()
89+
90+ def isatty (self ) -> bool :
91+ raise NotImplementedError ()
92+
93+ def writable (self ) -> bool :
94+ raise NotImplementedError ()
95+
96+ def truncate (self , * _args : Any , ** kwargs : Any ) -> int :
97+ raise NotImplementedError ()
0 commit comments