first comit
This commit is contained in:
@@ -0,0 +1,79 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import io
|
||||
import sys
|
||||
from typing import ContextManager, TextIO
|
||||
|
||||
from .base import DummyInput, Input, PipeInput
|
||||
|
||||
__all__ = [
|
||||
"create_input",
|
||||
"create_pipe_input",
|
||||
]
|
||||
|
||||
|
||||
def create_input(stdin: TextIO | None = None, always_prefer_tty: bool = False) -> Input:
|
||||
"""
|
||||
Create the appropriate `Input` object for the current os/environment.
|
||||
|
||||
:param always_prefer_tty: When set, if `sys.stdin` is connected to a Unix
|
||||
`pipe`, check whether `sys.stdout` or `sys.stderr` are connected to a
|
||||
pseudo terminal. If so, open the tty for reading instead of reading for
|
||||
`sys.stdin`. (We can open `stdout` or `stderr` for reading, this is how
|
||||
a `$PAGER` works.)
|
||||
"""
|
||||
if sys.platform == "win32":
|
||||
from .win32 import Win32Input
|
||||
|
||||
# If `stdin` was assigned `None` (which happens with pythonw.exe), use
|
||||
# a `DummyInput`. This triggers `EOFError` in the application code.
|
||||
if stdin is None and sys.stdin is None:
|
||||
return DummyInput()
|
||||
|
||||
return Win32Input(stdin or sys.stdin)
|
||||
else:
|
||||
from .vt100 import Vt100Input
|
||||
|
||||
# If no input TextIO is given, use stdin/stdout.
|
||||
if stdin is None:
|
||||
stdin = sys.stdin
|
||||
|
||||
if always_prefer_tty:
|
||||
for obj in [sys.stdin, sys.stdout, sys.stderr]:
|
||||
if obj.isatty():
|
||||
stdin = obj
|
||||
break
|
||||
|
||||
# If we can't access the file descriptor for the selected stdin, return
|
||||
# a `DummyInput` instead. This can happen for instance in unit tests,
|
||||
# when `sys.stdin` is patched by something that's not an actual file.
|
||||
# (Instantiating `Vt100Input` would fail in this case.)
|
||||
try:
|
||||
stdin.fileno()
|
||||
except io.UnsupportedOperation:
|
||||
return DummyInput()
|
||||
|
||||
return Vt100Input(stdin)
|
||||
|
||||
|
||||
def create_pipe_input() -> ContextManager[PipeInput]:
|
||||
"""
|
||||
Create an input pipe.
|
||||
This is mostly useful for unit testing.
|
||||
|
||||
Usage::
|
||||
|
||||
with create_pipe_input() as input:
|
||||
input.send_text('inputdata')
|
||||
|
||||
Breaking change: In prompt_toolkit 3.0.28 and earlier, this was returning
|
||||
the `PipeInput` directly, rather than through a context manager.
|
||||
"""
|
||||
if sys.platform == "win32":
|
||||
from .win32_pipe import Win32PipeInput
|
||||
|
||||
return Win32PipeInput.create()
|
||||
else:
|
||||
from .posix_pipe import PosixPipeInput
|
||||
|
||||
return PosixPipeInput.create()
|
||||
Reference in New Issue
Block a user