File tree Expand file tree Collapse file tree 6 files changed +31
-2
lines changed Expand file tree Collapse file tree 6 files changed +31
-2
lines changed Original file line number Diff line number Diff line change @@ -10,6 +10,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
10
10
### Added
11
11
12
12
- Missing ` mode ` attribute to ` _MemoryFile ` objects returned by ` MemoryFS.openbin ` .
13
+ - Missing ` readinto ` method for ` MemoryFS ` and ` FTPFS ` file objects. Closes
14
+ [ #380 ] ( https://github.com/PyFilesystem/pyfilesystem2/issues/380 ) .
13
15
14
16
### Changed
15
17
Original file line number Diff line number Diff line change @@ -9,6 +9,7 @@ Many thanks to the following developers for contributing to this project:
9
9
- [ Justin Charlong] ( https://github.com/jcharlong )
10
10
- [ Louis Sautier] ( https://github.com/sbraz )
11
11
- [ Martin Larralde] ( https://github.com/althonos )
12
+ - [ Nick Henderson] ( https://github.com/nwh )
12
13
- [ Will McGugan] ( https://github.com/willmcgugan )
13
14
- [ Zmej Serow] ( https://github.com/zmej-serow )
14
15
- [ Morten Engelhardt Olsen] ( https://github.com/xoriath )
Original file line number Diff line number Diff line change @@ -235,6 +235,13 @@ def read(self, size=-1):
235
235
remaining -= len (chunk )
236
236
return b"" .join (chunks )
237
237
238
+ def readinto (self , buffer ):
239
+ # type: (bytearray) -> int
240
+ data = self .read (len (buffer ))
241
+ bytes_read = len (data )
242
+ buffer [:bytes_read ] = data
243
+ return bytes_read
244
+
238
245
def readline (self , size = - 1 ):
239
246
# type: (int) -> bytes
240
247
return next (line_iterator (self , size )) # type: ignore
Original file line number Diff line number Diff line change @@ -117,7 +117,7 @@ def readinto(self, b):
117
117
except AttributeError :
118
118
data = self ._f .read (len (b ))
119
119
bytes_read = len (data )
120
- b [: len ( data ) ] = data
120
+ b [:bytes_read ] = data
121
121
return bytes_read
122
122
123
123
@typing .no_type_check
@@ -128,7 +128,7 @@ def readinto1(self, b):
128
128
except AttributeError :
129
129
data = self ._f .read1 (len (b ))
130
130
bytes_read = len (data )
131
- b [: len ( data ) ] = data
131
+ b [:bytes_read ] = data
132
132
return bytes_read
133
133
134
134
def readline (self , limit = - 1 ):
Original file line number Diff line number Diff line change @@ -113,12 +113,15 @@ def __iter__(self):
113
113
def next (self ):
114
114
# type: () -> bytes
115
115
with self ._seek_lock ():
116
+ self .on_access ()
116
117
return next (self ._bytes_io )
117
118
118
119
__next__ = next
119
120
120
121
def readline (self , size = - 1 ):
121
122
# type: (int) -> bytes
123
+ if not self ._mode .reading :
124
+ raise IOError ("File not open for reading" )
122
125
with self ._seek_lock ():
123
126
self .on_access ()
124
127
return self ._bytes_io .readline (size )
@@ -142,9 +145,20 @@ def readable(self):
142
145
# type: () -> bool
143
146
return self ._mode .reading
144
147
148
+ def readinto (self , buffer ):
149
+ # type (bytearray) -> Optional[int]
150
+ if not self ._mode .reading :
151
+ raise IOError ("File not open for reading" )
152
+ with self ._seek_lock ():
153
+ self .on_access ()
154
+ return self ._bytes_io .readinto (buffer )
155
+
145
156
def readlines (self , hint = - 1 ):
146
157
# type: (int) -> List[bytes]
158
+ if not self ._mode .reading :
159
+ raise IOError ("File not open for reading" )
147
160
with self ._seek_lock ():
161
+ self .on_access ()
148
162
return self ._bytes_io .readlines (hint )
149
163
150
164
def seekable (self ):
Original file line number Diff line number Diff line change @@ -870,6 +870,11 @@ def test_open_files(self):
870
870
self .assertTrue (f .readable ())
871
871
self .assertFalse (f .closed )
872
872
self .assertEqual (f .readlines (8 ), [b"Hello\n " , b"World\n " ])
873
+ self .assertEqual (f .tell (), 12 )
874
+ buffer = bytearray (4 )
875
+ self .assertEqual (f .readinto (buffer ), 4 )
876
+ self .assertEqual (f .tell (), 16 )
877
+ self .assertEqual (buffer , b"foo\n " )
873
878
with self .assertRaises (IOError ):
874
879
f .write (b"no" )
875
880
self .assertTrue (f .closed )
You can’t perform that action at this time.
0 commit comments