|
"""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 |
|
) |
|
|