11import contextlib
2- import io
32from pathlib import Path
4- from types import TracebackType
5- from typing import Any , BinaryIO , Generator , Optional , Type
3+ from typing import BinaryIO , Generator
64
75from prime_backup .utils import pack_utils
6+ from prime_backup .utils .io_types import SupportsReadBytes
87
98
10- class PackEntryReader ( io . RawIOBase ) :
9+ class PackEntryReader :
1110 def __init__ (self , file_obj : BinaryIO , offset : int , length : int ):
12- self .__file_obj : Any = file_obj
11+ self .__file_obj = file_obj
1312 self .__offset = offset
1413 self .__length = length
1514 self .__position = 0
1615 self .__file_obj .seek (offset )
1716
18- def readable (self ) -> bool :
19- return True
20-
21- def seekable (self ) -> bool :
22- return self .__file_obj .seekable ()
23-
24- def tell (self ) -> int :
25- return self .__position
26-
27- def seek (self , offset : int , whence : int = 0 ) -> int :
28- if whence == 0 :
29- new_position = offset
30- elif whence == 1 :
31- new_position = self .__position + offset
32- elif whence == 2 :
33- new_position = self .__length + offset
34- else :
35- raise ValueError ('invalid whence {}' .format (whence ))
36- if new_position < 0 :
37- raise ValueError ('negative seek position {}' .format (new_position ))
38- if new_position > self .__length :
39- new_position = self .__length
40- self .__file_obj .seek (self .__offset + new_position )
41- self .__position = new_position
42- return self .__position
43-
4417 def read (self , size : int = - 1 ) -> bytes :
4518 remaining = self .__length - self .__position
4619 if remaining <= 0 :
4720 return b''
48- if size is None or size < 0 or size > remaining :
21+ if size < 0 or size > remaining :
4922 size = remaining
5023 data = self .__file_obj .read (size )
5124 self .__position += len (data )
5225 return data
5326
54- def readinto (self , b : Any ) -> int :
55- remaining = self .__length - self .__position
56- if remaining <= 0 :
57- return 0
58- buffer = memoryview (b )
59- if len (buffer ) > remaining :
60- buffer = buffer [:remaining ]
61- n = self .__file_obj .readinto (buffer )
62- if n is None :
63- return 0
64- self .__position += n
65- return n
66-
67- def close (self ):
68- self .__file_obj .close ()
69- super ().close ()
70-
71- def __enter__ (self ) -> 'PackEntryReader' :
72- return self
73-
74- def __exit__ (self , exc_type : Optional [Type [BaseException ]], exc_val : Optional [BaseException ], exc_tb : Optional [TracebackType ]):
75- self .close ()
76-
7727
7828class PackReader :
7929 @staticmethod
@@ -82,7 +32,7 @@ def get_pack_path(pack_id: int) -> Path:
8232
8333 @classmethod
8434 @contextlib .contextmanager
85- def open_entry (cls , pack_id : int , offset : int , length : int ) -> Generator [PackEntryReader , None , None ]:
35+ def open_entry (cls , pack_id : int , offset : int , length : int ) -> Generator [SupportsReadBytes , None , None ]:
8636 pack_path = cls .get_pack_path (pack_id )
8737 with open (pack_path , 'rb' ) as fh :
8838 yield PackEntryReader (fh , offset , length )
0 commit comments