Merge pull request #201 from orchardup/better-log-printing

Better log printing
This commit is contained in:
Aanand Prasad 2014-04-29 10:57:56 +01:00
commit c78b952c3d
2 changed files with 44 additions and 4 deletions

View File

@ -13,6 +13,7 @@ class LogPrinter(object):
def __init__(self, containers, attach_params=None):
self.containers = containers
self.attach_params = attach_params or {}
self.prefix_width = self._calculate_prefix_width(containers)
self.generators = self._make_log_generators()
def run(self):
@ -20,6 +21,19 @@ class LogPrinter(object):
for line in mux.loop():
sys.stdout.write(line.encode(sys.__stdout__.encoding or 'utf-8'))
def _calculate_prefix_width(self, containers):
"""
Calculate the maximum width of container names so we can make the log
prefixes line up like so:
db_1 | Listening
web_1 | Listening
"""
prefix_width = 0
for container in containers:
prefix_width = max(prefix_width, len(container.name_without_project))
return prefix_width
def _make_log_generators(self):
color_fns = cycle(colors.rainbow())
generators = []
@ -31,7 +45,7 @@ class LogPrinter(object):
return generators
def _make_log_generator(self, container, color_fn):
prefix = color_fn(container.name + " | ")
prefix = color_fn(self._generate_prefix(container))
# Attach to container before log printer starts running
line_generator = split_buffer(self._attach(container), '\n')
@ -42,6 +56,14 @@ class LogPrinter(object):
yield color_fn("%s exited with code %s\n" % (container.name, exit_code))
yield STOP
def _generate_prefix(self, container):
"""
Generate the prefix for a log line without colour
"""
name = container.name_without_project
padding = ' ' * (self.prefix_width - len(name))
return ''.join([name, padding, ' | '])
def _attach(self, container):
params = {
'stdout': True,

View File

@ -13,12 +13,12 @@ class ContainerTest(unittest.TestCase):
"Ports":None,
"SizeRw":0,
"SizeRootFs":0,
"Names":["/db_1"]
"Names":["/figtest_db_1"]
}, has_been_inspected=True)
self.assertEqual(container.dictionary, {
"ID": "abc",
"Image":"ubuntu:12.04",
"Name": "/db_1",
"Name": "/figtest_db_1",
})
def test_environment(self):
@ -46,6 +46,24 @@ class ContainerTest(unittest.TestCase):
"Ports":None,
"SizeRw":0,
"SizeRootFs":0,
"Names":["/db_1"]
"Names":["/figtest_db_1"]
}, has_been_inspected=True)
self.assertEqual(container.number, 1)
def test_name(self):
container = Container.from_ps(None, {
"Id":"abc",
"Image":"ubuntu:12.04",
"Command":"sleep 300",
"Names":["/figtest_db_1"]
}, has_been_inspected=True)
self.assertEqual(container.name, "figtest_db_1")
def test_name_without_project(self):
container = Container.from_ps(None, {
"Id":"abc",
"Image":"ubuntu:12.04",
"Command":"sleep 300",
"Names":["/figtest_db_1"]
}, has_been_inspected=True)
self.assertEqual(container.name_without_project, "db_1")