@@ -2278,6 +2278,24 @@ def mock_open(mock=None, read_data=''):
22782278 `read_data` is a string for the `read` methoddline`, and `readlines` of the
22792279 file handle to return. This is an empty string by default.
22802280 """
2281+ def _readlines_side_effect (* args , ** kwargs ):
2282+ if handle .readlines .return_value is not None :
2283+ return handle .readlines .return_value
2284+ return list (_state [0 ])
2285+
2286+ def _read_side_effect (* args , ** kwargs ):
2287+ if handle .read .return_value is not None :
2288+ return handle .read .return_value
2289+ return '' .join (_state [0 ])
2290+
2291+ def _readline_side_effect ():
2292+ if handle .readline .return_value is not None :
2293+ while True :
2294+ yield handle .readline .return_value
2295+ for line in _state [0 ]:
2296+ yield line
2297+
2298+
22812299 global file_spec
22822300 if file_spec is None :
22832301 import _io
@@ -2286,42 +2304,31 @@ def mock_open(mock=None, read_data=''):
22862304 if mock is None :
22872305 mock = MagicMock (name = 'open' , spec = open )
22882306
2289- def make_handle (* args , ** kwargs ):
2290- # Arg checking is handled by __call__
2291- def _readlines_side_effect (* args , ** kwargs ):
2292- if handle .readlines .return_value is not None :
2293- return handle .readlines .return_value
2294- return list (_data )
2295-
2296- def _read_side_effect (* args , ** kwargs ):
2297- if handle .read .return_value is not None :
2298- return handle .read .return_value
2299- return '' .join (_data )
2300-
2301- def _readline_side_effect ():
2302- if handle .readline .return_value is not None :
2303- while True :
2304- yield handle .readline .return_value
2305- for line in _data :
2306- yield line
2307-
2308- handle = MagicMock (spec = file_spec )
2309- handle .__enter__ .return_value = handle
2310-
2311- _data = _iterate_read_data (read_data )
2312-
2313- handle .write .return_value = None
2314- handle .read .return_value = None
2315- handle .readline .return_value = None
2316- handle .readlines .return_value = None
2317-
2318- handle .read .side_effect = _read_side_effect
2319- handle .readline .side_effect = _readline_side_effect ()
2320- handle .readlines .side_effect = _readlines_side_effect
2321- _check_and_set_parent (mock , handle , None , '()' )
2322- return handle
2323-
2324- mock .side_effect = make_handle
2307+ handle = MagicMock (spec = file_spec )
2308+ handle .__enter__ .return_value = handle
2309+
2310+ _state = [_iterate_read_data (read_data ), None ]
2311+
2312+ handle .write .return_value = None
2313+ handle .read .return_value = None
2314+ handle .readline .return_value = None
2315+ handle .readlines .return_value = None
2316+
2317+ handle .read .side_effect = _read_side_effect
2318+ _state [1 ] = _readline_side_effect ()
2319+ handle .readline .side_effect = _state [1 ]
2320+ handle .readlines .side_effect = _readlines_side_effect
2321+
2322+ def reset_data (* args , ** kwargs ):
2323+ _state [0 ] = _iterate_read_data (read_data )
2324+ if handle .readline .side_effect == _state [1 ]:
2325+ # Only reset the side effect if the user hasn't overridden it.
2326+ _state [1 ] = _readline_side_effect ()
2327+ handle .readline .side_effect = _state [1 ]
2328+ return DEFAULT
2329+
2330+ mock .side_effect = reset_data
2331+ mock .return_value = handle
23252332 return mock
23262333
23272334
0 commit comments