Source code for zyra.utils.io_utils
# SPDX-License-Identifier: Apache-2.0
import sys
from contextlib import contextmanager
from pathlib import Path
from typing import BinaryIO, Iterator
[docs]
@contextmanager
def open_input(path_or_dash: str) -> Iterator[BinaryIO]:
"""Yield a readable binary file-like for path or '-' (stdin) without closing stdin.
When ``path_or_dash`` is '-', yields ``sys.stdin.buffer`` and does not close it on exit.
Otherwise opens the given path and closes it when the context exits.
"""
if path_or_dash == "-":
yield sys.stdin.buffer
else:
with Path(path_or_dash).open("rb") as f:
yield f
[docs]
@contextmanager
def open_output(path_or_dash: str) -> Iterator[BinaryIO]:
"""Yield a writable binary file-like for path or '-' (stdout) without closing stdout.
When ``path_or_dash`` is '-', yields ``sys.stdout.buffer`` and does not close it on exit.
Otherwise opens the given path and closes it when the context exits.
"""
if path_or_dash == "-":
yield sys.stdout.buffer
else:
with Path(path_or_dash).open("wb") as f:
yield f
[docs]
def open_input_file(path_or_dash: str) -> BinaryIO:
"""Backward-compatible factory returning a readable binary stream.
- When ``path_or_dash`` is '-', returns ``sys.stdin.buffer``; caller must
NOT close it.
- Otherwise returns an open file object in ``'rb'`` mode; caller is
responsible for closing it.
Prefer ``open_input`` (context manager) in new code to avoid leaking file
descriptors and to ensure stdout/stdin are not accidentally closed.
"""
# Returning an open file object is intentional for backwards compatibility.
return sys.stdin.buffer if path_or_dash == "-" else Path(path_or_dash).open("rb") # noqa: SIM115
[docs]
def open_output_file(path_or_dash: str) -> BinaryIO:
"""Backward-compatible factory returning a writable binary stream.
- When ``path_or_dash`` is '-', returns ``sys.stdout.buffer``; caller must
NOT close it.
- Otherwise returns an open file object in ``'wb'`` mode; caller is
responsible for closing it.
Prefer ``open_output`` (context manager) in new code to avoid leaking file
descriptors and to ensure stdout/stdin are not accidentally closed.
"""
# Returning an open file object is intentional for backwards compatibility.
return sys.stdout.buffer if path_or_dash == "-" else Path(path_or_dash).open("wb") # noqa: SIM115