diff --git a/pyrightconfig.stricter.json b/pyrightconfig.stricter.json index 374b5572f..da98607f4 100644 --- a/pyrightconfig.stricter.json +++ b/pyrightconfig.stricter.json @@ -19,6 +19,8 @@ "stdlib/xml/dom/minidom.pyi", "stdlib/xml/dom/pulldom.pyi", "stdlib/xml/sax", + "stubs/aiofiles/aiofiles/tempfile/temptypes.pyi", + "stubs/aiofiles/aiofiles/threadpool/utils.pyi", "stubs/aws-xray-sdk", "stubs/babel", "stubs/backports.ssl_match_hostname", diff --git a/stubs/aiofiles/@tests/stubtest_allowlist.txt b/stubs/aiofiles/@tests/stubtest_allowlist.txt index 694c4fc5e..a79814533 100644 --- a/stubs/aiofiles/@tests/stubtest_allowlist.txt +++ b/stubs/aiofiles/@tests/stubtest_allowlist.txt @@ -49,3 +49,12 @@ aiofiles.ospath.getatime aiofiles.ospath.getctime aiofiles.ospath.samefile aiofiles.ospath.sameopenfile + +# Same issues as above +aiofiles.tempfile.temptypes.AsyncSpooledTemporaryFile.fileno +aiofiles.tempfile.temptypes.AsyncSpooledTemporaryFile.flush +aiofiles.tempfile.temptypes.AsyncSpooledTemporaryFile.isatty +aiofiles.tempfile.temptypes.AsyncSpooledTemporaryFile.newlines +aiofiles.tempfile.temptypes.AsyncSpooledTemporaryFile.rollover +aiofiles.tempfile.temptypes.AsyncSpooledTemporaryFile.tell +aiofiles.tempfile.temptypes.AsyncTemporaryDirectory.cleanup diff --git a/stubs/aiofiles/aiofiles/__init__.pyi b/stubs/aiofiles/aiofiles/__init__.pyi index 2bbbc29a4..468393cba 100644 --- a/stubs/aiofiles/aiofiles/__init__.pyi +++ b/stubs/aiofiles/aiofiles/__init__.pyi @@ -1 +1,2 @@ +from . import tempfile as tempfile from .threadpool import open as open diff --git a/stubs/aiofiles/aiofiles/tempfile/__init__.pyi b/stubs/aiofiles/aiofiles/tempfile/__init__.pyi new file mode 100644 index 000000000..95af3e1c7 --- /dev/null +++ b/stubs/aiofiles/aiofiles/tempfile/__init__.pyi @@ -0,0 +1,260 @@ +from _typeshed import ( + BytesPath, + Incomplete, + OpenBinaryMode, + OpenBinaryModeReading, + OpenBinaryModeUpdating, + OpenBinaryModeWriting, + OpenTextMode, + StrOrBytesPath, + StrPath, +) +from asyncio import AbstractEventLoop +from typing import AnyStr, TypeVar, overload +from typing_extensions import Literal + +from ..base import AiofilesContextManager +from ..threadpool.binary import AsyncBufferedIOBase, AsyncBufferedReader, AsyncFileIO +from ..threadpool.text import AsyncTextIOWrapper +from .temptypes import AsyncTemporaryDirectory + +_T_co = TypeVar("_T_co", covariant=True) +_V_co = TypeVar("_V_co", covariant=True) +_T_contra = TypeVar("_T_contra", contravariant=True) + +# Text mode: always returns AsyncTextIOWrapper +@overload +def NamedTemporaryFile( + mode: OpenTextMode, + buffering: int = ..., + encoding: str | None = ..., + newline: str | None = ..., + suffix: AnyStr | None = ..., + prefix: AnyStr | None = ..., + dir: StrOrBytesPath | None = ..., + delete: bool = ..., + loop: AbstractEventLoop | None = ..., + executor: Incomplete | None = ..., +) -> AiofilesContextManager[None, None, AsyncTextIOWrapper]: ... + +# Unbuffered binary: returns a FileIO +@overload +def NamedTemporaryFile( + mode: OpenBinaryMode, + buffering: Literal[0], + encoding: None = ..., + newline: None = ..., + suffix: AnyStr | None = ..., + prefix: AnyStr | None = ..., + dir: StrOrBytesPath | None = ..., + delete: bool = ..., + loop: AbstractEventLoop | None = ..., + executor: Incomplete | None = ..., +) -> AiofilesContextManager[None, None, AsyncFileIO]: ... + +# Buffered binary reading/updating: AsyncBufferedReader +@overload +def NamedTemporaryFile( + mode: OpenBinaryModeReading | OpenBinaryModeUpdating = ..., + buffering: Literal[-1, 1] = ..., + encoding: None = ..., + newline: None = ..., + suffix: AnyStr | None = ..., + prefix: AnyStr | None = ..., + dir: StrOrBytesPath | None = ..., + delete: bool = ..., + loop: AbstractEventLoop | None = ..., + executor: Incomplete | None = ..., +) -> AiofilesContextManager[None, None, AsyncBufferedReader]: ... + +# Buffered binary writing: AsyncBufferedIOBase +@overload +def NamedTemporaryFile( + mode: OpenBinaryModeWriting, + buffering: Literal[-1, 1] = ..., + encoding: None = ..., + newline: None = ..., + suffix: AnyStr | None = ..., + prefix: AnyStr | None = ..., + dir: StrOrBytesPath | None = ..., + delete: bool = ..., + loop: AbstractEventLoop | None = ..., + executor: Incomplete | None = ..., +) -> AiofilesContextManager[None, None, AsyncBufferedIOBase]: ... + +# Text mode: always returns AsyncTextIOWrapper +@overload +def TemporaryFile( + mode: OpenTextMode, + buffering: int = ..., + encoding: str | None = ..., + newline: str | None = ..., + suffix: AnyStr | None = ..., + prefix: AnyStr | None = ..., + dir: StrOrBytesPath | None = ..., + loop: AbstractEventLoop | None = ..., + executor: Incomplete | None = ..., +) -> AiofilesContextManager[None, None, AsyncTextIOWrapper]: ... + +# Unbuffered binary: returns a FileIO +@overload +def TemporaryFile( + mode: OpenBinaryMode, + buffering: Literal[0], + encoding: None = ..., + newline: None = ..., + suffix: AnyStr | None = ..., + prefix: AnyStr | None = ..., + dir: StrOrBytesPath | None = ..., + loop: AbstractEventLoop | None = ..., + executor: Incomplete | None = ..., +) -> AiofilesContextManager[None, None, AsyncFileIO]: ... + +# Buffered binary reading/updating: AsyncBufferedReader +@overload +def TemporaryFile( + mode: OpenBinaryModeReading | OpenBinaryModeUpdating = ..., + buffering: Literal[-1, 1] = ..., + encoding: None = ..., + newline: None = ..., + suffix: AnyStr | None = ..., + prefix: AnyStr | None = ..., + dir: StrOrBytesPath | None = ..., + loop: AbstractEventLoop | None = ..., + executor: Incomplete | None = ..., +) -> AiofilesContextManager[None, None, AsyncBufferedReader]: ... + +# Buffered binary writing: AsyncBufferedIOBase +@overload +def TemporaryFile( + mode: OpenBinaryModeWriting, + buffering: Literal[-1, 1] = ..., + encoding: None = ..., + newline: None = ..., + suffix: AnyStr | None = ..., + prefix: AnyStr | None = ..., + dir: StrOrBytesPath | None = ..., + loop: AbstractEventLoop | None = ..., + executor: Incomplete | None = ..., +) -> AiofilesContextManager[None, None, AsyncBufferedIOBase]: ... + +# Text mode: always returns AsyncTextIOWrapper +@overload +def SpooledTemporaryFile( + max_size: int = ..., + *, + mode: OpenTextMode, + buffering: int = ..., + encoding: str | None = ..., + newline: str | None = ..., + suffix: AnyStr | None = ..., + prefix: AnyStr | None = ..., + dir: StrOrBytesPath | None = ..., + loop: AbstractEventLoop | None = ..., + executor: Incomplete | None = ..., +) -> AiofilesContextManager[None, None, AsyncTextIOWrapper]: ... +@overload +def SpooledTemporaryFile( + max_size: int, + mode: OpenTextMode, + buffering: int = ..., + encoding: str | None = ..., + newline: str | None = ..., + suffix: AnyStr | None = ..., + prefix: AnyStr | None = ..., + dir: StrOrBytesPath | None = ..., + loop: AbstractEventLoop | None = ..., + executor: Incomplete | None = ..., +) -> AiofilesContextManager[None, None, AsyncTextIOWrapper]: ... + +# Unbuffered binary: returns a FileIO +@overload +def SpooledTemporaryFile( + max_size: int = ..., + mode: OpenBinaryMode = ..., + *, + buffering: Literal[0], + encoding: None = ..., + newline: None = ..., + suffix: AnyStr | None = ..., + prefix: AnyStr | None = ..., + dir: StrOrBytesPath | None = ..., + loop: AbstractEventLoop | None = ..., + executor: Incomplete | None = ..., +) -> AiofilesContextManager[None, None, AsyncFileIO]: ... +@overload +def SpooledTemporaryFile( + max_size: int, + mode: OpenBinaryMode, + buffering: Literal[0], + encoding: None = ..., + newline: None = ..., + suffix: AnyStr | None = ..., + prefix: AnyStr | None = ..., + dir: StrOrBytesPath | None = ..., + loop: AbstractEventLoop | None = ..., + executor: Incomplete | None = ..., +) -> AiofilesContextManager[None, None, AsyncFileIO]: ... + +# Buffered binary reading/updating: AsyncBufferedReader +@overload +def SpooledTemporaryFile( + max_size: int = ..., + mode: OpenBinaryModeReading | OpenBinaryModeUpdating = ..., + buffering: Literal[-1, 1] = ..., + encoding: None = ..., + newline: None = ..., + suffix: AnyStr | None = ..., + prefix: AnyStr | None = ..., + dir: StrOrBytesPath | None = ..., + loop: AbstractEventLoop | None = ..., + executor: Incomplete | None = ..., +) -> AiofilesContextManager[None, None, AsyncBufferedReader]: ... + +# Buffered binary writing: AsyncBufferedIOBase +@overload +def SpooledTemporaryFile( + max_size: int = ..., + *, + mode: OpenBinaryModeWriting, + buffering: Literal[-1, 1] = ..., + encoding: None = ..., + newline: None = ..., + suffix: AnyStr | None = ..., + prefix: AnyStr | None = ..., + dir: StrOrBytesPath | None = ..., + loop: AbstractEventLoop | None = ..., + executor: Incomplete | None = ..., +) -> AiofilesContextManager[None, None, AsyncBufferedIOBase]: ... +@overload +def SpooledTemporaryFile( + max_size: int, + mode: OpenBinaryModeWriting, + buffering: Literal[-1, 1] = ..., + encoding: None = ..., + newline: None = ..., + suffix: AnyStr | None = ..., + prefix: AnyStr | None = ..., + dir: StrOrBytesPath | None = ..., + loop: AbstractEventLoop | None = ..., + executor: Incomplete | None = ..., +) -> AiofilesContextManager[None, None, AsyncBufferedIOBase]: ... +@overload +def TemporaryDirectory( + suffix: str | None = ..., + prefix: str | None = ..., + dir: StrPath | None = ..., + loop: AbstractEventLoop | None = ..., + executor: Incomplete | None = ..., +) -> AiofilesContextManagerTempDir[None, None, AsyncTemporaryDirectory]: ... +@overload +def TemporaryDirectory( + suffix: bytes | None = ..., + prefix: bytes | None = ..., + dir: BytesPath | None = ..., + loop: AbstractEventLoop | None = ..., + executor: Incomplete | None = ..., +) -> AiofilesContextManagerTempDir[None, None, AsyncTemporaryDirectory]: ... + +class AiofilesContextManagerTempDir(AiofilesContextManager[_T_co, _T_contra, _V_co]): + async def __aenter__(self) -> Incomplete: ... diff --git a/stubs/aiofiles/aiofiles/tempfile/temptypes.pyi b/stubs/aiofiles/aiofiles/tempfile/temptypes.pyi new file mode 100644 index 000000000..db6f26b55 --- /dev/null +++ b/stubs/aiofiles/aiofiles/tempfile/temptypes.pyi @@ -0,0 +1,46 @@ +from _typeshed import Incomplete +from asyncio import AbstractEventLoop +from collections.abc import Generator +from types import coroutine as coroutine +from typing import TypeVar + +from ..base import AsyncBase as AsyncBase +from ..threadpool.utils import ( + cond_delegate_to_executor as cond_delegate_to_executor, + delegate_to_executor as delegate_to_executor, + proxy_property_directly as proxy_property_directly, +) + +_T = TypeVar("_T") + +class AsyncSpooledTemporaryFile(AsyncBase[_T]): + def fileno(self) -> Generator[Incomplete, Incomplete, Incomplete]: ... + def rollover(self) -> Generator[Incomplete, Incomplete, Incomplete]: ... + async def flush(self) -> None: ... + async def isatty(self) -> bool: ... + async def read(self, __n: int = ...): ... + async def readline(self, __limit: int | None = ...): ... + async def readlines(self, __hint: int = ...): ... + async def seek(self, offset: int, whence: int = ...) -> int: ... + async def tell(self) -> int: ... + async def truncate(self, size: int | None = ...) -> None: ... + @property + def closed(self): ... + @property + def encoding(self): ... + @property + def mode(self): ... + @property + def name(self): ... + async def newlines(self): ... + @property + def softspace(self): ... + async def write(self, s): ... + async def writelines(self, iterable): ... + +class AsyncTemporaryDirectory: + async def cleanup(self) -> None: ... + @property + def name(self): ... + def __init__(self, file, loop: AbstractEventLoop | None, executor: Incomplete | None) -> None: ... + async def close(self) -> None: ... diff --git a/stubs/aiofiles/aiofiles/threadpool/utils.pyi b/stubs/aiofiles/aiofiles/threadpool/utils.pyi new file mode 100644 index 000000000..341396135 --- /dev/null +++ b/stubs/aiofiles/aiofiles/threadpool/utils.pyi @@ -0,0 +1,6 @@ +from types import coroutine as coroutine + +def delegate_to_executor(*attrs): ... +def proxy_method_directly(*attrs): ... +def proxy_property_directly(*attrs): ... +def cond_delegate_to_executor(*attrs): ...