@@ -1286,14 +1286,40 @@ def _check_open_file(self) -> None:
12861286 def __iter__ (self ) -> Iterator [str ] | Iterator [bytes ]:
12871287 if not self .readable ():
12881288 self ._raise ("File is not open for reading" )
1289- return self ._io .__iter__ ()
1289+ return self ._io .__iter__ () # type: ignore[return-value]
12901290
12911291 def __next__ (self ):
12921292 if not self .readable ():
12931293 self ._raise ("File is not open for reading" )
12941294 return next (self ._io )
12951295
12961296
1297+ class FakeTextFileWrapper (FakeFileWrapper , io .TextIOBase ): # type: ignore[misc]
1298+ """Represents a text file wrapper.
1299+ Derives from io.TextIOBase so it can be used as a file object
1300+ if the type is checked by a library user, while it delegates all calls
1301+ to `FakeFileWrapper`.
1302+ """
1303+
1304+ def __getattribute__ (self , name ): # type: ignore[override]
1305+ if hasattr (FakeFileWrapper , name ) or name in self .__dict__ :
1306+ return FakeFileWrapper .__getattribute__ (self , name )
1307+ return self .__getattr__ (name )
1308+
1309+
1310+ class FakeBinaryFileWrapper (FakeFileWrapper , io .BufferedIOBase ): # type: ignore[misc]
1311+ """Represents a buffered binary file wrapper.
1312+ Derives from io.BufferedIOBase so it can be used as a file object
1313+ if the type is checked by a library user, while it delegates all calls
1314+ to `FakeFileWrapper`.
1315+ """
1316+
1317+ def __getattribute__ (self , name ): # type: ignore[override]
1318+ if hasattr (FakeFileWrapper , name ) or name in self .__dict__ :
1319+ return FakeFileWrapper .__getattribute__ (self , name )
1320+ return self .__getattr__ (name )
1321+
1322+
12971323class StandardStreamWrapper :
12981324 """Wrapper for a system standard stream to be used in open files list."""
12991325
0 commit comments