25
25
__version__ = '1.0'
26
26
27
27
28
+ import io
28
29
import inspect
29
30
import pprint
30
31
import sys
@@ -2331,25 +2332,12 @@ def __init__(self, spec, spec_set=False, parent=None,
2331
2332
2332
2333
file_spec = None
2333
2334
2334
- def _iterate_read_data (read_data ):
2335
- # Helper for mock_open:
2336
- # Retrieve lines from read_data via a generator so that separate calls to
2337
- # readline, read, and readlines are properly interleaved
2338
- sep = b'\n ' if isinstance (read_data , bytes ) else '\n '
2339
- data_as_list = [l + sep for l in read_data .split (sep )]
2340
-
2341
- if data_as_list [- 1 ] == sep :
2342
- # If the last line ended in a newline, the list comprehension will have an
2343
- # extra entry that's just a newline. Remove this.
2344
- data_as_list = data_as_list [:- 1 ]
2345
- else :
2346
- # If there wasn't an extra newline by itself, then the file being
2347
- # emulated doesn't have a newline to end the last line remove the
2348
- # newline that our naive format() added
2349
- data_as_list [- 1 ] = data_as_list [- 1 ][:- 1 ]
2350
2335
2351
- for line in data_as_list :
2352
- yield line
2336
+ def _to_stream (read_data ):
2337
+ if isinstance (read_data , bytes ):
2338
+ return io .BytesIO (read_data )
2339
+ else :
2340
+ return io .StringIO (read_data )
2353
2341
2354
2342
2355
2343
def mock_open (mock = None , read_data = '' ):
@@ -2364,20 +2352,23 @@ def mock_open(mock=None, read_data=''):
2364
2352
`read_data` is a string for the `read`, `readline` and `readlines` of the
2365
2353
file handle to return. This is an empty string by default.
2366
2354
"""
2355
+ _read_data = _to_stream (read_data )
2356
+ _state = [_read_data , None ]
2357
+
2367
2358
def _readlines_side_effect (* args , ** kwargs ):
2368
2359
if handle .readlines .return_value is not None :
2369
2360
return handle .readlines .return_value
2370
- return list ( _state [0 ])
2361
+ return _state [0 ]. readlines ( * args , ** kwargs )
2371
2362
2372
2363
def _read_side_effect (* args , ** kwargs ):
2373
2364
if handle .read .return_value is not None :
2374
2365
return handle .read .return_value
2375
- return type ( read_data )(). join ( _state [0 ])
2366
+ return _state [0 ]. read ( * args , ** kwargs )
2376
2367
2377
- def _readline_side_effect ():
2368
+ def _readline_side_effect (* args , ** kwargs ):
2378
2369
yield from _iter_side_effect ()
2379
2370
while True :
2380
- yield type ( read_data )( )
2371
+ yield _state [ 0 ]. readline ( * args , ** kwargs )
2381
2372
2382
2373
def _iter_side_effect ():
2383
2374
if handle .readline .return_value is not None :
@@ -2397,8 +2388,6 @@ def _iter_side_effect():
2397
2388
handle = MagicMock (spec = file_spec )
2398
2389
handle .__enter__ .return_value = handle
2399
2390
2400
- _state = [_iterate_read_data (read_data ), None ]
2401
-
2402
2391
handle .write .return_value = None
2403
2392
handle .read .return_value = None
2404
2393
handle .readline .return_value = None
@@ -2411,7 +2400,7 @@ def _iter_side_effect():
2411
2400
handle .__iter__ .side_effect = _iter_side_effect
2412
2401
2413
2402
def reset_data (* args , ** kwargs ):
2414
- _state [0 ] = _iterate_read_data (read_data )
2403
+ _state [0 ] = _to_stream (read_data )
2415
2404
if handle .readline .side_effect == _state [1 ]:
2416
2405
# Only reset the side effect if the user hasn't overridden it.
2417
2406
_state [1 ] = _readline_side_effect ()
0 commit comments