Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,14 @@
# pyfakefs Release Notes
The released versions correspond to PyPi releases.

## Unreleased

### Fixes
* correctly handle file system space for files opened in write mode
(see [#660](../../issues/660))
* correctly handle reading/writing pipes via file
(see [#661](../../issues/661))

## [Version 4.5.4](https://pypi.python.org/pypi/pyfakefs/4.5.4) (2022-01-12)
Minor bugfix release.

Expand Down
23 changes: 16 additions & 7 deletions pyfakefs/fake_filesystem.py
Original file line number Diff line number Diff line change
Expand Up @@ -439,8 +439,6 @@ def set_initial_contents(self, contents: AnyStr) -> bool:
current_size = self.st_size or 0
self.filesystem.change_disk_usage(
st_size - current_size, self.name, self.st_dev)
if self._byte_contents:
self.size = 0
self._byte_contents = byte_contents
self.st_size = st_size
self.epoch += 1
Expand Down Expand Up @@ -5385,7 +5383,7 @@ def fileno(self) -> int:
return self.filedes
raise OSError(errno.EBADF, 'Invalid file descriptor')

def read(self, n: int) -> bytes:
def read(self, n: int = -1) -> bytes:
return cast(bytes, self._stream_object.read())

def close(self) -> None:
Expand Down Expand Up @@ -5429,12 +5427,16 @@ class FakePipeWrapper:
used in open files list.
"""

def __init__(self, filesystem: FakeFilesystem, fd: int, can_write: bool):
def __init__(self, filesystem: FakeFilesystem,
fd: int, can_write: bool, mode: str = ''):
self._filesystem = filesystem
self.fd = fd # the real file descriptor
self.can_write = can_write
self.file_object = None
self.filedes: Optional[int] = None
self.real_file = None
if mode:
self.real_file = open(fd, mode)

def __enter__(self) -> 'FakePipeWrapper':
"""To support usage of this fake pipe with the 'with' statement."""
Expand All @@ -5456,8 +5458,10 @@ def fileno(self) -> int:
return self.filedes
raise OSError(errno.EBADF, 'Invalid file descriptor')

def read(self, numBytes: int) -> bytes:
def read(self, numBytes: int = -1) -> bytes:
"""Read from the real pipe."""
if self.real_file:
return self.real_file.read(numBytes)
return os.read(self.fd, numBytes)

def flush(self) -> None:
Expand All @@ -5466,6 +5470,8 @@ def flush(self) -> None:

def write(self, contents: bytes) -> int:
"""Write to the real pipe."""
if self.real_file:
return self.real_file.write(contents)
return os.write(self.fd, contents)

def close(self) -> None:
Expand All @@ -5474,7 +5480,10 @@ def close(self) -> None:
open_files = self._filesystem.open_files[self.filedes]
assert open_files is not None
open_files.remove(self)
os.close(self.fd)
if self.real_file:
self.real_file.close()
else:
os.close(self.fd)

def readable(self) -> bool:
"""The pipe end can either be readable or writable."""
Expand Down Expand Up @@ -5573,7 +5582,7 @@ def call(self, file_: Union[AnyStr, int],
existing_wrapper = wrappers[0]
assert isinstance(existing_wrapper, FakePipeWrapper)
wrapper = FakePipeWrapper(self.filesystem, existing_wrapper.fd,
existing_wrapper.can_write)
existing_wrapper.can_write, mode)
file_des = self.filesystem._add_open_file(wrapper)
wrapper.filedes = file_des
return wrapper
Expand Down
Loading