Files
pre-commit/pre_commit/output.py
2014-09-02 16:11:45 -07:00

86 lines
2.4 KiB
Python

from __future__ import unicode_literals
import subprocess
import sys
from pre_commit import color
from pre_commit import five
# TODO: smell: import side-effects
COLS = int(
subprocess.Popen(
['tput', 'cols'], stdout=subprocess.PIPE
).communicate()[0] or
# Default in the case of no terminal
80
)
def get_hook_message(
start,
postfix='',
end_msg=None,
end_len=0,
end_color=None,
use_color=None,
cols=COLS,
):
"""Prints a message for running a hook.
This currently supports three approaches:
# Print `start` followed by dots, leaving 6 characters at the end
>>> print_hook_message('start', end_len=6)
start...............................................................
# Print `start` followed by dots with the end message colored if coloring
# is specified and a newline afterwards
>>> print_hook_message(
'start',
end_msg='end',
end_color=color.RED,
use_color=True,
)
start...................................................................end
# Print `start` followed by dots, followed by the `postfix` message
# uncolored, followed by the `end_msg` colored if specified and a newline
# afterwards
>>> print_hook_message(
'start',
postfix='postfix ',
end_msg='end',
end_color=color.RED,
use_color=True,
)
start...........................................................postfix end
"""
if bool(end_msg) == bool(end_len):
raise ValueError('Expected one of (`end_msg`, `end_len`)')
if end_msg is not None and (end_color is None or use_color is None):
raise ValueError(
'`end_color` and `use_color` are required with `end_msg`'
)
if end_len:
return start + '.' * (cols - len(start) - end_len - 1)
else:
return '{0}{1}{2}{3}\n'.format(
start,
'.' * (cols - len(start) - len(postfix) - len(end_msg) - 1),
postfix,
color.format_color(end_msg, end_color, use_color),
)
def sys_stdout_write_wrapper(s, stream=sys.stdout):
"""Python 2.6 chokes on unicode being passed to sys.stdout.write.
This is an adapter because PY2 is ok with bytes and PY3 requires text.
"""
assert type(s) is five.text
if five.PY2: # pragma: no cover (PY2)
s = s.encode('UTF-8')
stream.write(s)