Skip to content

Commit f78c51b

Browse files
committed
Add support for os.readinto in Python 3.14
1 parent f9380ce commit f78c51b

3 files changed

Lines changed: 36 additions & 4 deletions

File tree

CHANGES.md

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,22 @@ The released versions correspond to PyPI releases.
1313
the real filesystem behavior
1414
* remove support for Python versions before 3.10 (if needed, patches may be backported to the 5.x branch)
1515

16-
### Unreleased
16+
## Unreleased
1717

18-
## Fixes
18+
### Enhancements
19+
* added support for `os.readinto` in Python 3.14
20+
21+
### Fixes
1922
* fixes patching of Debian-specific `tempfile` in Python 3.13 (see [#1214](../../issues/1214))
2023

2124
## [Version 5.9.3](https://pypi.python.org/pypi/pyfakefs/5.9.3) (2025-08-28)
2225
Fixes a utility method.
2326

24-
## Changes
27+
### Changes
2528
* a warning is now issued if trying to create a nested fake filesystem with custom arguments
2629
(custom arguments are ignored in this case, as the existing fake filesystem is used)
2730

28-
## Fixes
31+
### Fixes
2932
* fixed `fake_filesystem.add_package_metadata` that had never worked correctly
3033
(see [#1205](../../issues/1205))
3134

pyfakefs/fake_os.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1406,6 +1406,16 @@ def getgid(self) -> int:
14061406
raise NameError("name 'getgid' is not defined")
14071407
return get_gid()
14081408

1409+
if sys.version_info >= (3, 14):
1410+
1411+
def readinto(self, fd, buffer):
1412+
"""Read from a file descriptor fd into a mutable buffer object buffer."""
1413+
wrapper = self.filesystem.get_open_file(fd)
1414+
contents = wrapper.read(len(buffer))
1415+
count = len(contents)
1416+
buffer[:count] = contents
1417+
return count
1418+
14091419
def fake_functions(self, original_functions) -> Set:
14101420
functions = set()
14111421
for fn in original_functions:

pyfakefs/tests/fake_os_test.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3110,6 +3110,25 @@ def test_dup2_with_new_fd(self):
31103110
self.assertEqual(fd1 + 1, fd3)
31113111
self.assertEqual(fd1 + 3, fd4)
31123112

3113+
@unittest.skipIf(sys.version_info < (3, 14), "Introduced in Python 3.14")
3114+
def test_readinto(self):
3115+
file_path = self.make_path("foo", "bar.txt")
3116+
contents = b"Testing readinto"
3117+
self.create_file(file_path, contents=contents)
3118+
fd = self.os.open(file_path, os.O_RDONLY)
3119+
try:
3120+
buffer = bytearray(b"")
3121+
self.assertEqual(0, self.os.readinto(fd, buffer))
3122+
buffer = bytearray(b" " * 20)
3123+
self.assertEqual(len(contents), self.os.readinto(fd, buffer))
3124+
self.assertEqual(b"Testing readinto ", buffer)
3125+
self.assertEqual(0, self.os.readinto(fd, buffer))
3126+
self.os.lseek(fd, 5, os.SEEK_SET)
3127+
self.assertEqual(len(contents) - 5, self.os.readinto(fd, buffer))
3128+
self.assertEqual(b"ng readintodinto ", buffer)
3129+
finally:
3130+
self.os.close(fd)
3131+
31133132

31143133
class RealOsModuleTest(FakeOsModuleTest):
31153134
def use_real_fs(self):

0 commit comments

Comments
 (0)