Print errors to stderr

This commit is contained in:
Matt Martz 2017-10-16 09:26:28 -05:00
parent d9642b2047
commit 16054cc3bc
1 changed files with 18 additions and 11 deletions

View File

@ -149,24 +149,25 @@ except ImportError:
import builtins import builtins
from io import TextIOWrapper, FileIO from io import TextIOWrapper, FileIO
class _Py3Utf8Stdout(TextIOWrapper): class _Py3Utf8Output(TextIOWrapper):
"""UTF-8 encoded wrapper around stdout for py3, to override """UTF-8 encoded wrapper around stdout for py3, to override
ASCII stdout ASCII stdout
""" """
def __init__(self, **kwargs): def __init__(self, f, **kwargs):
buf = FileIO(sys.stdout.fileno(), 'w') buf = FileIO(f.fileno(), 'w')
super(_Py3Utf8Stdout, self).__init__( super(_Py3Utf8Output, self).__init__(
buf, buf,
encoding='utf8', encoding='utf8',
errors='strict' errors='strict'
) )
def write(self, s): def write(self, s):
super(_Py3Utf8Stdout, self).write(s) super(_Py3Utf8Output, self).write(s)
self.flush() self.flush()
_py3_print = getattr(builtins, 'print') _py3_print = getattr(builtins, 'print')
_py3_utf8_stdout = _Py3Utf8Stdout() _py3_utf8_stdout = _Py3Utf8Output(sys.stdout)
_py3_utf8_stderr = _Py3Utf8Output(sys.stderr)
def to_utf8(v): def to_utf8(v):
"""No-op encode to utf-8 for py3""" """No-op encode to utf-8 for py3"""
@ -174,7 +175,10 @@ except ImportError:
def print_(*args, **kwargs): def print_(*args, **kwargs):
"""Wrapper function for py3 to print, with a utf-8 encoded stdout""" """Wrapper function for py3 to print, with a utf-8 encoded stdout"""
kwargs['file'] = _py3_utf8_stdout if kwargs.get('file') == sys.stderr:
kwargs['file'] = _py3_utf8_stderr
else:
kwargs['file'] = kwargs.get('file', _py3_utf8_stdout)
_py3_print(*args, **kwargs) _py3_print(*args, **kwargs)
else: else:
del __builtin__ del __builtin__
@ -1577,7 +1581,7 @@ def validate_optional_args(args):
'unavailable' % (info[0], arg)) 'unavailable' % (info[0], arg))
def printer(string, quiet=False, debug=False, **kwargs): def printer(string, quiet=False, debug=False, error=False, **kwargs):
"""Helper function to print a string only when not quiet""" """Helper function to print a string only when not quiet"""
if debug and not DEBUG: if debug and not DEBUG:
@ -1588,6 +1592,9 @@ def printer(string, quiet=False, debug=False, **kwargs):
else: else:
out = string out = string
if error:
kwargs['file'] = sys.stderr
if not quiet: if not quiet:
print_(out, **kwargs) print_(out, **kwargs)
@ -1648,14 +1655,14 @@ def shell():
secure=args.secure secure=args.secure
) )
except (ConfigRetrievalError,) + HTTP_ERRORS: except (ConfigRetrievalError,) + HTTP_ERRORS:
printer('Cannot retrieve speedtest configuration') printer('Cannot retrieve speedtest configuration', error=True)
raise SpeedtestCLIError(get_exception()) raise SpeedtestCLIError(get_exception())
if args.list: if args.list:
try: try:
speedtest.get_servers() speedtest.get_servers()
except (ServersRetrievalError,) + HTTP_ERRORS: except (ServersRetrievalError,) + HTTP_ERRORS:
print_('Cannot retrieve speedtest server list') printer('Cannot retrieve speedtest server list', error=True)
raise SpeedtestCLIError(get_exception()) raise SpeedtestCLIError(get_exception())
for _, servers in sorted(speedtest.servers.items()): for _, servers in sorted(speedtest.servers.items()):
@ -1683,7 +1690,7 @@ def shell():
', '.join('%s' % s for s in args.server) ', '.join('%s' % s for s in args.server)
) )
except (ServersRetrievalError,) + HTTP_ERRORS: except (ServersRetrievalError,) + HTTP_ERRORS:
print_('Cannot retrieve speedtest server list') printer('Cannot retrieve speedtest server list', error=True)
raise SpeedtestCLIError(get_exception()) raise SpeedtestCLIError(get_exception())
except InvalidServerIDType: except InvalidServerIDType:
raise SpeedtestCLIError( raise SpeedtestCLIError(