--- /dev/null
+# Stubs for subprocess\r
+\r
+# Based on http://docs.python.org/3.6/library/subprocess.html\r
+import sys\r
+from typing import Sequence, Any, Mapping, Callable, Tuple, IO, Optional, Union, List, Type, Text\r
+from types import TracebackType\r
+\r
+# We prefer to annotate inputs to methods (eg subprocess.check_call) with these\r
+# union types. However, outputs (eg check_call return) and class attributes\r
+# (eg TimeoutError.cmd) we prefer to annotate with Any, so the caller does not\r
+# have to use an assertion to confirm which type.\r
+#\r
+# For example:\r
+#\r
+# try:\r
+# x = subprocess.check_output(["ls", "-l"])\r
+# reveal_type(x) # Any, but morally is _TXT\r
+# except TimeoutError as e:\r
+# reveal_type(e.cmd) # Any, but morally is _CMD\r
+_FILE = Union[None, int, IO[Any]]\r
+_TXT = Union[bytes, Text]\r
+if sys.version_info >= (3, 6):\r
+ from builtins import _PathLike\r
+ _PATH = Union[bytes, Text, _PathLike]\r
+else:\r
+ _PATH = Union[bytes, Text]\r
+# Python 3.6 does't support _CMD being a single PathLike.\r
+# See: https://bugs.python.org/issue31961\r
+_CMD = Union[_TXT, Sequence[_PATH]]\r
+_ENV = Union[Mapping[bytes, _TXT], Mapping[Text, _TXT]]\r
+\r
+if sys.version_info >= (3, 5):\r
+ class CompletedProcess:\r
+ # morally: _CMD\r
+ args = ... # type: Any\r
+ returncode = ... # type: int\r
+ # morally: Optional[_TXT]\r
+ stdout = ... # type: Any\r
+ stderr = ... # type: Any\r
+ def __init__(self, args: _CMD,\r
+ returncode: int,\r
+ stdout: Optional[_TXT] = ...,\r
+ stderr: Optional[_TXT] = ...) -> None: ...\r
+ def check_returncode(self) -> None: ...\r
+\r
+ if sys.version_info >= (3, 6):\r
+ # Nearly same args as Popen.__init__ except for timeout, input, and check\r
+ def run(args: _CMD,\r
+ timeout: Optional[float] = ...,\r
+ input: Optional[_TXT] = ...,\r
+ check: bool = ...,\r
+ bufsize: int = ...,\r
+ executable: _PATH = ...,\r
+ stdin: _FILE = ...,\r
+ stdout: _FILE = ...,\r
+ stderr: _FILE = ...,\r
+ preexec_fn: Callable[[], Any] = ...,\r
+ close_fds: bool = ...,\r
+ shell: bool = ...,\r
+ cwd: Optional[_PATH] = ...,\r
+ env: Optional[_ENV] = ...,\r
+ universal_newlines: bool = ...,\r
+ startupinfo: Any = ...,\r
+ creationflags: int = ...,\r
+ restore_signals: bool = ...,\r
+ start_new_session: bool = ...,\r
+ pass_fds: Any = ...,\r
+ *,\r
+ encoding: Optional[str] = ...,\r
+ errors: Optional[str] = ...) -> CompletedProcess: ...\r
+ else:\r
+ # Nearly same args as Popen.__init__ except for timeout, input, and check\r
+ def run(args: _CMD,\r
+ timeout: Optional[float] = ...,\r
+ input: Optional[_TXT] = ...,\r
+ check: bool = ...,\r
+ bufsize: int = ...,\r
+ executable: _PATH = ...,\r
+ stdin: _FILE = ...,\r
+ stdout: _FILE = ...,\r
+ stderr: _FILE = ...,\r
+ preexec_fn: Callable[[], Any] = ...,\r
+ close_fds: bool = ...,\r
+ shell: bool = ...,\r
+ cwd: Optional[_PATH] = ...,\r
+ env: Optional[_ENV] = ...,\r
+ universal_newlines: bool = ...,\r
+ startupinfo: Any = ...,\r
+ creationflags: int = ...,\r
+ restore_signals: bool = ...,\r
+ start_new_session: bool = ...,\r
+ pass_fds: Any = ...) -> CompletedProcess: ...\r
+\r
+# Same args as Popen.__init__\r
+def call(args: _CMD,\r
+ bufsize: int = ...,\r
+ executable: _PATH = ...,\r
+ stdin: _FILE = ...,\r
+ stdout: _FILE = ...,\r
+ stderr: _FILE = ...,\r
+ preexec_fn: Callable[[], Any] = ...,\r
+ close_fds: bool = ...,\r
+ shell: bool = ...,\r
+ cwd: Optional[_PATH] = ...,\r
+ env: Optional[_ENV] = ...,\r
+ universal_newlines: bool = ...,\r
+ startupinfo: Any = ...,\r
+ creationflags: int = ...,\r
+ restore_signals: bool = ...,\r
+ start_new_session: bool = ...,\r
+ pass_fds: Any = ...,\r
+ timeout: float = ...) -> int: ...\r
+\r
+# Same args as Popen.__init__\r
+def check_call(args: _CMD,\r
+ bufsize: int = ...,\r
+ executable: _PATH = ...,\r
+ stdin: _FILE = ...,\r
+ stdout: _FILE = ...,\r
+ stderr: _FILE = ...,\r
+ preexec_fn: Callable[[], Any] = ...,\r
+ close_fds: bool = ...,\r
+ shell: bool = ...,\r
+ cwd: Optional[_PATH] = ...,\r
+ env: Optional[_ENV] = ...,\r
+ universal_newlines: bool = ...,\r
+ startupinfo: Any = ...,\r
+ creationflags: int = ...,\r
+ restore_signals: bool = ...,\r
+ start_new_session: bool = ...,\r
+ pass_fds: Any = ...,\r
+ timeout: float = ...) -> int: ...\r
+\r
+if sys.version_info >= (3, 6):\r
+ # 3.6 added encoding and errors\r
+ def check_output(args: _CMD,\r
+ bufsize: int = ...,\r
+ executable: _PATH = ...,\r
+ stdin: _FILE = ...,\r
+ stderr: _FILE = ...,\r
+ preexec_fn: Callable[[], Any] = ...,\r
+ close_fds: bool = ...,\r
+ shell: bool = ...,\r
+ cwd: Optional[_PATH] = ...,\r
+ env: Optional[_ENV] = ...,\r
+ universal_newlines: bool = ...,\r
+ startupinfo: Any = ...,\r
+ creationflags: int = ...,\r
+ restore_signals: bool = ...,\r
+ start_new_session: bool = ...,\r
+ pass_fds: Any = ...,\r
+ *,\r
+ timeout: float = ...,\r
+ input: _TXT = ...,\r
+ encoding: Optional[str] = ...,\r
+ errors: Optional[str] = ...,\r
+ ) -> Any: ... # morally: -> _TXT\r
+else:\r
+ def check_output(args: _CMD,\r
+ bufsize: int = ...,\r
+ executable: _PATH = ...,\r
+ stdin: _FILE = ...,\r
+ stderr: _FILE = ...,\r
+ preexec_fn: Callable[[], Any] = ...,\r
+ close_fds: bool = ...,\r
+ shell: bool = ...,\r
+ cwd: Optional[_PATH] = ...,\r
+ env: Optional[_ENV] = ...,\r
+ universal_newlines: bool = ...,\r
+ startupinfo: Any = ...,\r
+ creationflags: int = ...,\r
+ restore_signals: bool = ...,\r
+ start_new_session: bool = ...,\r
+ pass_fds: Any = ...,\r
+ timeout: float = ...,\r
+ input: _TXT = ...,\r
+ ) -> Any: ... # morally: -> _TXT\r
+\r
+\r
+PIPE = ... # type: int\r
+STDOUT = ... # type: int\r
+DEVNULL = ... # type: int\r
+class SubprocessError(Exception): ...\r
+class TimeoutExpired(SubprocessError):\r
+ # morally: _CMD\r
+ cmd = ... # type: Any\r
+ timeout = ... # type: float\r
+ # morally: Optional[_TXT]\r
+ output = ... # type: Any\r
+ stdout = ... # type: Any\r
+ stderr = ... # type: Any\r
+\r
+\r
+class CalledProcessError(Exception):\r
+ returncode = 0\r
+ # morally: _CMD\r
+ cmd = ... # type: Any\r
+ # morally: Optional[_TXT]\r
+ output = ... # type: Any\r
+\r
+ if sys.version_info >= (3, 5):\r
+ # morally: Optional[_TXT]\r
+ stdout = ... # type: Any\r
+ stderr = ... # type: Any\r
+\r
+ def __init__(self,\r
+ returncode: int,\r
+ cmd: _CMD,\r
+ output: Optional[_TXT] = ...,\r
+ stderr: Optional[_TXT] = ...) -> None: ...\r
+\r
+class Popen:\r
+ args = ... # type: _CMD\r
+ stdin = ... # type: IO[Any]\r
+ stdout = ... # type: IO[Any]\r
+ stderr = ... # type: IO[Any]\r
+ pid = 0\r
+ returncode = 0\r
+\r
+ if sys.version_info >= (3, 6):\r
+ def __init__(self,\r
+ args: _CMD,\r
+ bufsize: int = ...,\r
+ executable: Optional[_PATH] = ...,\r
+ stdin: Optional[_FILE] = ...,\r
+ stdout: Optional[_FILE] = ...,\r
+ stderr: Optional[_FILE] = ...,\r
+ preexec_fn: Optional[Callable[[], Any]] = ...,\r
+ close_fds: bool = ...,\r
+ shell: bool = ...,\r
+ cwd: Optional[_PATH] = ...,\r
+ env: Optional[_ENV] = ...,\r
+ universal_newlines: bool = ...,\r
+ startupinfo: Optional[Any] = ...,\r
+ creationflags: int = ...,\r
+ restore_signals: bool = ...,\r
+ start_new_session: bool = ...,\r
+ pass_fds: Any = ...,\r
+ *,\r
+ encoding: Optional[str] = ...,\r
+ errors: Optional[str] = ...) -> None: ...\r
+ else:\r
+ def __init__(self,\r
+ args: _CMD,\r
+ bufsize: int = ...,\r
+ executable: Optional[_PATH] = ...,\r
+ stdin: Optional[_FILE] = ...,\r
+ stdout: Optional[_FILE] = ...,\r
+ stderr: Optional[_FILE] = ...,\r
+ preexec_fn: Optional[Callable[[], Any]] = ...,\r
+ close_fds: bool = ...,\r
+ shell: bool = ...,\r
+ cwd: Optional[_PATH] = ...,\r
+ env: Optional[_ENV] = ...,\r
+ universal_newlines: bool = ...,\r
+ startupinfo: Optional[Any] = ...,\r
+ creationflags: int = ...,\r
+ restore_signals: bool = ...,\r
+ start_new_session: bool = ...,\r
+ pass_fds: Any = ...) -> None: ...\r
+\r
+ def poll(self) -> int: ...\r
+ def wait(self, timeout: Optional[float] = ...) -> int: ...\r
+ # Return str/bytes\r
+ def communicate(self,\r
+ input: Optional[_TXT] = ...,\r
+ timeout: Optional[float] = ...,\r
+ # morally: -> Tuple[Optional[_TXT], Optional[_TXT]]\r
+ ) -> Tuple[Any, Any]: ...\r
+ def send_signal(self, signal: int) -> None: ...\r
+ def terminate(self) -> None: ...\r
+ def kill(self) -> None: ...\r
+ def __enter__(self) -> 'Popen': ...\r
+ def __exit__(self, type: Optional[Type[BaseException]], value: Optional[BaseException], traceback: Optional[TracebackType]) -> bool: ...\r
+\r
+# The result really is always a str.\r
+def getstatusoutput(cmd: _TXT) -> Tuple[int, str]: ...\r
+def getoutput(cmd: _TXT) -> str: ...\r
+\r
+def list2cmdline(seq: Sequence[str]) -> str: ... # undocumented\r
+\r
+if sys.platform == 'win32':\r
+ class STARTUPINFO:\r
+ if sys.version_info >= (3, 7):\r
+ def __init__(self, *, dwFlags: int = ..., hStdInput: Optional[Any] = ..., hStdOutput: Optional[Any] = ..., hStdError: Optional[Any] = ..., wShowWindow: int = ..., lpAttributeList: Optional[Mapping[str, Any]] = ...) -> None: ...\r
+ dwFlags: int\r
+ hStdInput: Optional[Any]\r
+ hStdOutput: Optional[Any]\r
+ hStdError: Optional[Any]\r
+ wShowWindow: int\r
+ if sys.version_info >= (3, 7):\r
+ lpAttributeList: Mapping[str, Any]\r
+\r
+ STD_INPUT_HANDLE: Any\r
+ STD_OUTPUT_HANDLE: Any\r
+ STD_ERROR_HANDLE: Any\r
+ SW_HIDE: int\r
+ STARTF_USESTDHANDLES: int\r
+ STARTF_USESHOWWINDOW: int\r
+ CREATE_NEW_CONSOLE: int\r
+ CREATE_NEW_PROCESS_GROUP: int\r
+ if sys.version_info >= (3, 7):\r
+ ABOVE_NORMAL_PRIORITY_CLASS: int\r
+ BELOW_NORMAL_PRIORITY_CLASS: int\r
+ HIGH_PRIORITY_CLASS: int\r
+ IDLE_PRIORITY_CLASS: int\r
+ NORMAL_PRIORITY_CLASS: int\r
+ REALTIME_PRIORITY_CLASS: int\r
+ CREATE_NO_WINDOW: int\r
+ DETACHED_PROCESS: int\r
+ CREATE_DEFAULT_ERROR_MODE: int\r
+ CREATE_BREAKAWAY_FROM_JOB: int\r