"""Handle files using a thread pool executor.""" import asyncio import sys from functools import partial, singledispatch from io import ( BufferedIOBase, BufferedRandom, BufferedReader, BufferedWriter, FileIO, TextIOBase, ) from ..base import AiofilesContextManager from .binary import ( AsyncBufferedIOBase, AsyncBufferedReader, AsyncFileIO, AsyncIndirectBufferedIOBase, ) from .text import AsyncTextIndirectIOWrapper, AsyncTextIOWrapper sync_open = open __all__ = ( "open", "stdin", "stdout", "stderr", "stdin_bytes", "stdout_bytes", "stderr_bytes", ) def open( file, mode="r", buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None, *, loop=None, executor=None, ): return AiofilesContextManager( _open( file, mode=mode, buffering=buffering, encoding=encoding, errors=errors, newline=newline, closefd=closefd, opener=opener, loop=loop, executor=executor, ) ) async def _open( file, mode="r", buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None, *, loop=None, executor=None, ): """Open an asyncio file.""" if loop is None: loop = asyncio.get_running_loop() cb = partial( sync_open, file, mode=mode, buffering=buffering, encoding=encoding, errors=errors, newline=newline, closefd=closefd, opener=opener, ) f = await loop.run_in_executor(executor, cb) return wrap(f, loop=loop, executor=executor) @singledispatch def wrap(file, *, loop=None, executor=None): raise TypeError("Unsupported io type: {}.".format(file)) @wrap.register(TextIOBase) def _(file, *, loop=None, executor=None): return AsyncTextIOWrapper(file, loop=loop, executor=executor) @wrap.register(BufferedWriter) @wrap.register(BufferedIOBase) def _(file, *, loop=None, executor=None): return AsyncBufferedIOBase(file, loop=loop, executor=executor) @wrap.register(BufferedReader) @wrap.register(BufferedRandom) def _(file, *, loop=None, executor=None): return AsyncBufferedReader(file, loop=loop, executor=executor) @wrap.register(FileIO) def _(file, *, loop=None, executor=None): return AsyncFileIO(file, loop=loop, executor=executor) stdin = AsyncTextIndirectIOWrapper("sys.stdin", None, None, indirect=lambda: sys.stdin) stdout = AsyncTextIndirectIOWrapper( "sys.stdout", None, None, indirect=lambda: sys.stdout ) stderr = AsyncTextIndirectIOWrapper( "sys.stderr", None, None, indirect=lambda: sys.stderr ) stdin_bytes = AsyncIndirectBufferedIOBase( "sys.stdin.buffer", None, None, indirect=lambda: sys.stdin.buffer ) stdout_bytes = AsyncIndirectBufferedIOBase( "sys.stdout.buffer", None, None, indirect=lambda: sys.stdout.buffer ) stderr_bytes = AsyncIndirectBufferedIOBase( "sys.stderr.buffer", None, None, indirect=lambda: sys.stderr.buffer )