Fix vistir's encoding of terminal output for python 2

Signed-off-by: Dan Ryan <dan@danryan.co>
This commit is contained in:
Dan Ryan
2019-03-12 01:38:47 -04:00
parent 466fcc0a2a
commit dcd5369117
4 changed files with 46 additions and 30 deletions
+13
View File
@@ -26,6 +26,8 @@ warnings.filterwarnings("ignore", category=DependencyWarning)
warnings.filterwarnings("ignore", category=ResourceWarning)
warnings.filterwarnings("ignore", category=UserWarning)
if sys.version_info >= (3, 1) and sys.version_info <= (3, 6):
if sys.stdout.isatty() and sys.stderr.isatty():
import io
@@ -46,6 +48,17 @@ try:
except Exception:
pass
if sys.version_info >= (3, 0):
stdout = sys.stdout.buffer
stderr = sys.stderr.buffer
else:
stdout = sys.stdout
stderr = sys.stderr
from .vendor.vistir.misc import get_wrapped_stream
sys.stderr = get_wrapped_stream(stderr)
sys.stdout = get_wrapped_stream(stdout)
from .cli import cli
from . import resolver
+3 -2
View File
@@ -923,12 +923,13 @@ def do_create_virtualenv(python=None, site_packages=False, pypi_mirror=None):
)
click.echo(crayons.blue("{0}".format(c.out)), err=True)
if c.returncode != 0:
sp.fail(environments.PIPENV_SPINNER_FAIL_TEXT.format("Failed creating virtual environment"))
sp.fail(environments.PIPENV_SPINNER_FAIL_TEXT.format(u"Failed creating virtual environment"))
raise exceptions.VirtualenvCreationException(
extra=[crayons.blue("{0}".format(c.err)),]
)
else:
sp.green.ok(environments.PIPENV_SPINNER_OK_TEXT.format("Successfully created virtual environment!"))
sp.green.ok(environments.PIPENV_SPINNER_OK_TEXT.format(u"Successfully created virtual environment!"))
# Associate project directory with the environment.
# This mimics Pew's "setproject".
+1
View File
@@ -590,6 +590,7 @@ def decode_for_output(output, target_stream=None, translation_map=None):
try:
output = _encode(output, encoding=encoding, translation_map=translation_map)
except (UnicodeDecodeError, UnicodeEncodeError):
output = to_native_string(output)
output = _encode(
output, encoding=encoding, errors="replace", translation_map=translation_map
)
+29 -28
View File
@@ -14,7 +14,7 @@ import six
from .compat import to_native_string
from .cursor import hide_cursor, show_cursor
from .misc import decode_for_output
from .misc import decode_for_output, to_text
from .termcolors import COLOR_MAP, COLORS, DISABLE_COLORS, colored
try:
@@ -131,9 +131,9 @@ class DummySpinner(object):
target = self.stdout
if text is None or isinstance(text, six.string_types) and text == "None":
pass
target.write(decode_output("\r", target_stream=target))
target.write(decode_output(u"\r", target_stream=target))
self._hide_cursor(target=target)
target.write(decode_output("{0}\n".format(text), target_stream=target))
target.write(decode_output(u"{0}\n".format(text), target_stream=target))
target.write(CLEAR_LINE)
self._show_cursor(target=target)
@@ -146,9 +146,8 @@ class DummySpinner(object):
stdout = self.stdout
else:
stdout = sys.stdout
text = decode_output(text, target_stream=stdout)
stdout.write(decode_output("\r", target_stream=stdout))
line = decode_output("{0}\n".format(text), target_stream=stdout)
stdout.write(decode_output(u"\r", target_stream=stdout))
line = decode_output(u"{0}\n".format(text), target_stream=stdout)
stdout.write(line)
stdout.write(CLEAR_LINE)
@@ -162,9 +161,8 @@ class DummySpinner(object):
print(text)
return
stderr = sys.stderr
text = decode_output(text, target_stream=stderr)
stderr.write(decode_output("\r", target_stream=stderr))
line = decode_output("{0}\n".format(text), target_stream=stderr)
stderr.write(decode_output(u"\r", target_stream=stderr))
line = decode_output(u"{0}\n".format(text), target_stream=stderr)
stderr.write(line)
stderr.write(CLEAR_LINE)
@@ -224,32 +222,32 @@ class VistirSpinner(SpinBase):
if DISABLE_COLORS:
colorama.deinit()
def ok(self, text="OK", err=False):
def ok(self, text=u"OK", err=False):
"""Set Ok (success) finalizer to a spinner."""
# Do not display spin text for ok state
self._text = None
_text = text if text else "OK"
_text = to_text(text) if text else u"OK"
err = err or not self.write_to_stdout
self._freeze(_text, err=err)
def fail(self, text="FAIL", err=False):
def fail(self, text=u"FAIL", err=False):
"""Set fail finalizer to a spinner."""
# Do not display spin text for fail state
self._text = None
_text = text if text else "FAIL"
_text = text if text else u"FAIL"
err = err or not self.write_to_stdout
self._freeze(_text, err=err)
def hide_and_write(self, text, target=None):
if not target:
target = self.stdout
if text is None or isinstance(text, six.string_types) and text == "None":
if text is None or isinstance(text, six.string_types) and text == u"None":
pass
target.write(decode_output("\r"))
target.write(decode_output(u"\r"))
self._hide_cursor(target=target)
target.write(decode_output("{0}\n".format(text)))
target.write(decode_output(u"{0}\n".format(text)))
target.write(CLEAR_LINE)
self._show_cursor(target=target)
@@ -259,24 +257,24 @@ class VistirSpinner(SpinBase):
stdout = self.stdout
if self.stdout.closed:
stdout = sys.stdout
stdout.write(decode_output("\r", target_stream=stdout))
stdout.write(decode_output(u"\r", target_stream=stdout))
stdout.write(decode_output(CLEAR_LINE, target_stream=stdout))
if text is None:
text = ""
text = decode_output("{0}\n".format(text), target_stream=stdout)
text = decode_output(u"{0}\n".format(text), target_stream=stdout)
stdout.write(text)
self.out_buff.write(decode_output(text, target_stream=self.out_buff))
self.out_buff.write(text)
def write_err(self, text):
"""Write error text in the terminal without breaking the spinner."""
stderr = self.stderr
if self.stderr.closed:
stderr = sys.stderr
stderr.write(decode_output("\r", target_stream=stderr))
stderr.write(decode_output(u"\r", target_stream=stderr))
stderr.write(decode_output(CLEAR_LINE, target_stream=stderr))
if text is None:
text = ""
text = decode_output("{0}\n".format(text), target_stream=stderr)
text = decode_output(u"{0}\n".format(text), target_stream=stderr)
self.stderr.write(text)
self.out_buff.write(decode_output(text, target_stream=self.out_buff))
@@ -322,8 +320,9 @@ class VistirSpinner(SpinBase):
target = self.stderr if err else self.stdout
if target.closed:
target = sys.stderr if err else sys.stdout
text = decode_output(final_text, target_stream=target)
self._last_frame = self._compose_out(text, mode="last")
text = to_text(final_text)
last_frame = self._compose_out(text, mode="last")
self._last_frame = decode_output(last_frame, target_stream=target)
# Should be stopped here, otherwise prints after
# self._freeze call will mess up the spinner
@@ -339,19 +338,20 @@ class VistirSpinner(SpinBase):
def _compose_out(self, frame, mode=None):
# Ensure Unicode input
frame = decode_output(frame)
frame = to_text(frame)
if self._text is None:
self._text = ""
text = decode_output(self._text)
self._text = u""
text = to_text(self._text)
if self._color_func is not None:
frame = self._color_func(frame)
if self._side == "right":
frame, text = text, frame
# Mode
frame = to_text(frame)
if not mode:
out = decode_output("\r{0} {1}".format(frame, text))
out = u"\r{0} {1}".format(frame, text)
else:
out = decode_output("{0} {1}\n".format(frame, text))
out = u"{0} {1}\n".format(frame, text)
return out
def _spin(self):
@@ -367,6 +367,7 @@ class VistirSpinner(SpinBase):
# Compose output
spin_phase = next(self._cycle)
out = self._compose_out(spin_phase)
out = decode_output(out, target)
# Write
target.write(out)