Skip to content

Commit 0f3df2a

Browse files
committed
Further cleanup
1 parent 2d3fe3d commit 0f3df2a

4 files changed

Lines changed: 18 additions & 13 deletions

File tree

README.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,4 +137,8 @@ How many requests will this module perform to download a member?
137137

138138
* If the full archive content is smaller than **initial\_buffer\_size**, only one request will be needed.
139139
* Normally two requests are needed, one to download the central directory and one to download the archive member.
140-
* If the central directory is bigger than **initial\_buffer\_size**, a third request will be required.
140+
* If the central directory is bigger than **initial\_buffer\_size**, a third request will be required.
141+
142+
## Alternative modules
143+
144+
There is a similar module available for python [pyremotezip](https://github.com/fcvarela/pyremotezip).

remotezip.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33

44
import requests
55

6+
__all__ = ['RemoteIOError', 'RemoteZip']
7+
68

79
class OutOfBound(Exception):
810
pass
@@ -18,7 +20,6 @@ def __init__(self, buffer, offset, size, stream):
1820
self.offset = offset
1921
self.size = size
2022
self.position = offset
21-
self.position_oob = False
2223
self.stream = stream
2324

2425
def __repr__(self):
@@ -49,14 +50,11 @@ def seek(self, offset, whence):
4950
relative_position = self.position - self.offset
5051

5152
if relative_position < 0 or relative_position >= self.size:
52-
self.position_oob = True
5353
raise OutOfBound("Position out of buffer bound")
5454

55-
self.position_oob = False
5655
if self.stream:
5756
buff_pos = self.buffer.tell()
5857
if relative_position < buff_pos:
59-
self.position_oob = True
6058
raise OutOfBound("Negative seek not supported")
6159

6260
skip_bytes = relative_position - buff_pos
@@ -76,6 +74,7 @@ def __init__(self, fetch_fun, initial_buffer_size=64*1024):
7674
self.buffer = None
7775
self.file_size = None
7876
self.position = None
77+
self._seek_succeeded = False
7978
self.member_pos2size = None
8079

8180
def set_pos2size(self, pos2size):
@@ -85,16 +84,15 @@ def read(self, size=0):
8584
if size == 0:
8685
size = self.file_size - self.buffer.position
8786

88-
if self.buffer.position_oob:
87+
if not self._seek_succeeded:
8988
if self.member_pos2size is None:
9089
fetch_size = size
9190
stream = False
9291
else:
9392
fetch_size = self.member_pos2size[self.buffer.position]
94-
if fetch_size is None:
95-
fetch_size = self.file_size - self.buffer.position
9693
stream = True
9794

95+
self._seek_succeeded = True
9896
self.buffer.close()
9997
self.buffer = self.fetch_fun((self.buffer.position, self.buffer.position + fetch_size -1), stream=stream)
10098

@@ -107,8 +105,11 @@ def seek(self, offset, whence=0):
107105
self.file_size = self.buffer.size + self.buffer.position
108106

109107
try:
110-
return self.buffer.seek(offset, whence)
108+
pos = self.buffer.seek(offset, whence)
109+
self._seek_succeeded = True
110+
return pos
111111
except OutOfBound:
112+
self._seek_succeeded = False
112113
return self.buffer.position # we ignore the issue here, we will check if buffer is fine during read
113114

114115
def tell(self):
@@ -134,7 +135,7 @@ def get_position2size(self):
134135
if len(ilist) == 0:
135136
return {}
136137

137-
position2size = {ilist[-1].header_offset: None}
138+
position2size = {ilist[-1].header_offset: self.start_dir - ilist[-1].header_offset}
138139
for i in range(len(ilist) - 1):
139140
m1, m2 = ilist[i: i+2]
140141
position2size[m1.header_offset] = m2.header_offset - m1.header_offset

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
setup(
44
name='remotezip',
5-
version='0.2',
5+
version='0.9',
66
author='Giuseppe Tribulato',
77
author_email='[email protected]',
88
py_modules=['remotezip'],

test_remotezip.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ def test_file_access(self):
137137
rio.seek(0, 2) # eof
138138
curr_buffer = rio.buffer
139139
# we have two file, one at pos 156879 with size 30k and the last at pos
140-
rio.set_pos2size({15687: 30*1024, 50354: None})
140+
rio.set_pos2size({15687: 30*1024, 50354: 63000})
141141
rio.seek(15687, 0)
142142
self.assertEqual(rio.tell(), 15687)
143143
self.assertEqual(rio.read(5), b'sssss')
@@ -154,7 +154,7 @@ def test_file_access(self):
154154
# move to next file
155155
rio.seek(50354, 0)
156156
self.assertEqual(rio.read(4), b'ssss')
157-
self.assertEqual(rio.buffer.size, 154446)
157+
self.assertEqual(rio.buffer.size, 63000)
158158
self.assertIsNot(rio.buffer, curr_buffer) # buffer changed
159159

160160
rio.close()

0 commit comments

Comments
 (0)