Skip to content

Commit 8ffbdb8

Browse files
committed
simplify PackEntryReader
1 parent 588bd06 commit 8ffbdb8

1 file changed

Lines changed: 6 additions & 56 deletions

File tree

Lines changed: 6 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,79 +1,29 @@
11
import contextlib
2-
import io
32
from pathlib import Path
4-
from types import TracebackType
5-
from typing import Any, BinaryIO, Generator, Optional, Type
3+
from typing import BinaryIO, Generator
64

75
from 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

7828
class 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

Comments
 (0)