| | """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 types import coroutine |
| |
|
| | 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, |
| | ) |
| | ) |
| |
|
| |
|
| | @coroutine |
| | 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 = yield from 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 |
| | ) |
| |
|