diff --git a/stdlib/2and3/_typeshed/__init__.pyi b/stdlib/2and3/_typeshed/__init__.pyi new file mode 100644 index 000000000000..f75e3f431e49 --- /dev/null +++ b/stdlib/2and3/_typeshed/__init__.pyi @@ -0,0 +1,28 @@ +# Utility types for typeshed + +# This module contains various common types to be used by typeshed. The +# module and its types do not exist at runtime. You can use this module +# outside of typeshed, but no API stability guarantees are made. To use +# it in implementation (.py) files, the following construct must be used: +# +# from typing import TYPE_CHECKING +# if TYPE_CHECKING: +# from _typeshed import ... +# +# If on Python versions < 3.10 and "from __future__ import annotations" +# is not used, types from this module must be quoted. + +import sys +from typing import Text, Union + +# StrPath and AnyPath can be used in places where a +# path can be used instead of a string, starting with Python 3.6. +if sys.version_info >= (3, 6): + from os import PathLike + StrPath = Union[str, PathLike[str]] + BytesPath = Union[bytes, PathLike[bytes]] + AnyPath = Union[str, bytes, PathLike[str], PathLike[bytes]] +else: + StrPath = Text + BytesPath = bytes + AnyPath = Union[Text, bytes] diff --git a/tests/stubtest_whitelists/py3_common.txt b/tests/stubtest_whitelists/py3_common.txt index e011cbf5b28a..8b6461e02b89 100644 --- a/tests/stubtest_whitelists/py3_common.txt +++ b/tests/stubtest_whitelists/py3_common.txt @@ -5,6 +5,7 @@ _importlib_modulespec _operator.methodcaller _threading_local.local.__new__ _types +_typeshed _weakref.CallableProxyType.__getattr__ _weakref.ProxyType.__getattr__ _weakref.ReferenceType.__call__ diff --git a/third_party/2and3/atomicwrites/__init__.pyi b/third_party/2and3/atomicwrites/__init__.pyi index 0a11eda45eb4..2be6a47ab507 100644 --- a/third_party/2and3/atomicwrites/__init__.pyi +++ b/third_party/2and3/atomicwrites/__init__.pyi @@ -1,22 +1,17 @@ import sys from typing import Any, AnyStr, Callable, ContextManager, Generic, IO, Optional, Text, Type, Union - -if sys.version_info >= (3, 6): - from os import PathLike - _Path = Union[str, bytes, PathLike[str], PathLike[bytes]] -else: - _Path = Union[Text, bytes] +from _typeshed import AnyPath def replace_atomic(src: AnyStr, dst: AnyStr) -> None: ... def move_atomic(src: AnyStr, dst: AnyStr) -> None: ... class AtomicWriter(object): - def __init__(self, path: _Path, mode: Text = ..., overwrite: bool = ...) -> None: ... + def __init__(self, path: AnyPath, mode: Text = ..., overwrite: bool = ...) -> None: ... def open(self) -> ContextManager[IO[Any]]: ... def _open(self, get_fileobject: Callable[..., IO[AnyStr]]) -> ContextManager[IO[AnyStr]]: ... - def get_fileobject(self, dir: Optional[_Path] = ..., **kwargs: Any) -> IO[Any]: ... + def get_fileobject(self, dir: Optional[AnyPath] = ..., **kwargs: Any) -> IO[Any]: ... def sync(self, f: IO[Any]) -> None: ... def commit(self, f: IO[Any]) -> None: ... def rollback(self, f: IO[Any]) -> None: ... def atomic_write( - path: _Path, writer_cls: Type[AtomicWriter] = ..., **cls_kwargs: object, + path: AnyPath, writer_cls: Type[AtomicWriter] = ..., **cls_kwargs: object, ) -> ContextManager[IO[Any]]: ... diff --git a/third_party/2and3/jinja2/utils.pyi b/third_party/2and3/jinja2/utils.pyi index c588ce8b30e1..1572080a38c4 100644 --- a/third_party/2and3/jinja2/utils.pyi +++ b/third_party/2and3/jinja2/utils.pyi @@ -1,5 +1,6 @@ import sys from typing import Any, Callable, IO, Iterable, Optional, Protocol, Text, TypeVar, Union +from _typeshed import AnyPath from markupsafe import Markup as Markup, escape as escape, soft_unicode as soft_unicode @@ -13,12 +14,6 @@ if sys.version_info >= (3, 8): else: _True = bool -if sys.version_info >= (3, 6): - from builtins import _PathLike - _PathType = Union[bytes, Text, _PathLike] -else: - _PathType = Union[bytes, Text] - _CallableT = TypeVar("_CallableT", bound=Callable[..., Any]) class _ContextFunction(Protocol[_CallableT]): @@ -42,7 +37,7 @@ def select_autoescape(enabled_extensions: Iterable[str] = ..., disabled_extensio def consume(iterable: Iterable[object]) -> None: ... def clear_caches() -> None: ... def import_string(import_name: str, silent: bool = ...) -> Any: ... -def open_if_exists(filename: _PathType, mode: str = ...) -> Optional[IO[Any]]: ... +def open_if_exists(filename: AnyPath, mode: str = ...) -> Optional[IO[Any]]: ... def object_type_repr(obj: object) -> str: ... def pformat(obj: object, verbose: bool = ...) -> str: ... def urlize(text: Union[Markup, Text], trim_url_limit: Optional[int] = ..., rel: Optional[Union[Markup, Text]] = ..., target: Optional[Union[Markup, Text]] = ...) -> str: ... diff --git a/third_party/2and3/toml.pyi b/third_party/2and3/toml.pyi index 2639178e03dd..d460801b8988 100644 --- a/third_party/2and3/toml.pyi +++ b/third_party/2and3/toml.pyi @@ -1,16 +1,15 @@ from typing import Any, IO, List, Mapping, MutableMapping, Optional, Protocol, Text, Type, Union +from _typeshed import StrPath import datetime import sys -if sys.version_info >= (3, 4): +if sys.version_info >= (3, 6): + _PathLike = StrPath +elif sys.version_info >= (3, 4): import pathlib - if sys.version_info >= (3, 6): - import os - _PathLike = Union[Text, pathlib.PurePath, os.PathLike] - else: - _PathLike = Union[Text, pathlib.PurePath] + _PathLike = Union[StrPath, pathlib.PurePath] else: - _PathLike = Text + _PathLike = StrPath class _Writable(Protocol): def write(self, obj: str) -> Any: ...