Source code for reqwire.helpers.cli
"""Helpers for command-line applications."""
from __future__ import absolute_import
import io
import re
import sys
import click
import emoji
MYPY = False
if MYPY: # pragma: no cover
from typing import Any, Iterator, Tuple # noqa: F401
__all__ = (
'ConsoleWriter',
'emojize',
)
[docs]def emojize(message, **kwargs):
# type: (str, Any) -> str
"""Wrapper around :func:`emoji.emojize` for Windows compatibility.
Emoji are not well supported under Windows. This function not only
checks :data:`sys.platform`, but the file ``/proc/version`` as well
to prevent *"emojification"* on the Windows Subsystem for Linux
(WSL, otherwise known as Ubuntu on Windows).
Args:
message: The format string. See :func:`emoji.emojize` for more
information. Any emoji placeholders will be removed if
Windows or WSL are detected.
**kwargs: Passed to :func:`emoji.emojize`.
"""
emoji_pattern = r':(.+?):'
if sys.platform == 'win32':
return re.sub(emoji_pattern, '', message).strip()
elif sys.platform.startswith('linux'):
try:
with io.open('/proc/version') as f:
if 'Microsoft' in f.read():
return re.sub(emoji_pattern, '', message).strip()
except IOError:
pass
return emoji.emojize(message, **kwargs)
[docs]class ConsoleWriter(object):
"""Facilitates writing formatted, informational messages to a TTY."""
format_strings = {
'error': click.style(':skull: {msg}', fg='red'),
'fatal': click.style(':skull: {msg}', fg='red'),
'warn': click.style(':warning: {msg}', fg='yellow'),
'warning': click.style(':warning: {msg}', fg='yellow'),
}
def __init__(self, verbose=True):
# type: (bool) -> None
"""Constructs a new :class:`ConsoleWriter`.
Args:
verbose: Sets verbosity for all future messages.
"""
self.verbose = verbose
[docs] def echo(self, message, *args, **kwargs):
# type: (str, Any, Any) -> None
"""Wraps :func:`click.echo`.
Args:
message: The message to write to stdout.
*args: Used to format message.
**kwargs: Used to format message.
"""
if self.verbose:
click.echo(emojize(message.format(*args, **kwargs)))
[docs] def error(self, message, *args, **kwargs):
# type: (str, Any, Any) -> None
"""Prints an error message.
Args:
message: The message to write to stdout.
*args: Used to format message.
**kwargs: Used to format message.
"""
self._echo_formatted('error', message, *args, **kwargs)
[docs] def fatal(self, message, *args, **kwargs):
# type: (str, Any, Any) -> None
"""Prints a fatal message.
Args:
message: The message to write to stdout.
*args: Used to format message.
**kwargs: Used to format message.
"""
self._echo_formatted('fatal', message, *args, **kwargs)
[docs] def info(self, message, *args, **kwargs):
# type: (str, Any, Any) -> None
"""Prints an informational message.
Args:
message: The message to write to stdout.
*args: Used to format message.
**kwargs: Used to format message.
"""
self._echo_formatted('info', message, *args, **kwargs)
[docs] def warn(self, message, *args, **kwargs):
# type: (str, Any, Any) -> None
"""Prints a warning message.
Args:
message: The message to write to stdout.
*args: Used to format message.
**kwargs: Used to format message.
"""
self._echo_formatted('warn', message, *args, **kwargs)
[docs] def warning(self, message, *args, **kwargs):
# type: (str, Any, Any) -> None
"""Prints a warning message.
Args:
message: The message to write to stdout.
*args: Used to format message.
**kwargs: Used to format message.
"""
self._echo_formatted('warn', message, *args, **kwargs)
def _echo_formatted(self, format_key, message, *args, **kwargs):
# type: (str, str, Any, Any) -> None
fmt = self.format_strings.get(format_key, '{msg}')
self.echo(fmt.format(msg=message), *args, **kwargs)