59 lines
1.5 KiB
Python
59 lines
1.5 KiB
Python
|
import sys
|
||
|
from typing import Optional, TextIO
|
||
|
|
||
|
from prompt_toolkit.utils import is_windows
|
||
|
|
||
|
from .base import Input, PipeInput
|
||
|
|
||
|
__all__ = [
|
||
|
"create_input",
|
||
|
"create_pipe_input",
|
||
|
]
|
||
|
|
||
|
|
||
|
def create_input(
|
||
|
stdin: Optional[TextIO] = 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 is_windows():
|
||
|
from .win32 import Win32Input
|
||
|
|
||
|
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 io in [sys.stdin, sys.stdout, sys.stderr]:
|
||
|
if io.isatty():
|
||
|
stdin = io
|
||
|
break
|
||
|
|
||
|
return Vt100Input(stdin)
|
||
|
|
||
|
|
||
|
def create_pipe_input() -> PipeInput:
|
||
|
"""
|
||
|
Create an input pipe.
|
||
|
This is mostly useful for unit testing.
|
||
|
"""
|
||
|
if is_windows():
|
||
|
from .win32_pipe import Win32PipeInput
|
||
|
|
||
|
return Win32PipeInput()
|
||
|
else:
|
||
|
from .posix_pipe import PosixPipeInput
|
||
|
|
||
|
return PosixPipeInput()
|