Skip to content

Commit c78b952

Browse files
committed
Merge pull request #201 from orchardup/better-log-printing
Better log printing
2 parents 8f1793d + fff5e51 commit c78b952

2 files changed

Lines changed: 44 additions & 4 deletions

File tree

fig/cli/log_printer.py

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,27 @@ class LogPrinter(object):
1313
def __init__(self, containers, attach_params=None):
1414
self.containers = containers
1515
self.attach_params = attach_params or {}
16+
self.prefix_width = self._calculate_prefix_width(containers)
1617
self.generators = self._make_log_generators()
1718

1819
def run(self):
1920
mux = Multiplexer(self.generators)
2021
for line in mux.loop():
2122
sys.stdout.write(line.encode(sys.__stdout__.encoding or 'utf-8'))
2223

24+
def _calculate_prefix_width(self, containers):
25+
"""
26+
Calculate the maximum width of container names so we can make the log
27+
prefixes line up like so:
28+
29+
db_1 | Listening
30+
web_1 | Listening
31+
"""
32+
prefix_width = 0
33+
for container in containers:
34+
prefix_width = max(prefix_width, len(container.name_without_project))
35+
return prefix_width
36+
2337
def _make_log_generators(self):
2438
color_fns = cycle(colors.rainbow())
2539
generators = []
@@ -31,7 +45,7 @@ def _make_log_generators(self):
3145
return generators
3246

3347
def _make_log_generator(self, container, color_fn):
34-
prefix = color_fn(container.name + " | ")
48+
prefix = color_fn(self._generate_prefix(container))
3549
# Attach to container before log printer starts running
3650
line_generator = split_buffer(self._attach(container), '\n')
3751

@@ -42,6 +56,14 @@ def _make_log_generator(self, container, color_fn):
4256
yield color_fn("%s exited with code %s\n" % (container.name, exit_code))
4357
yield STOP
4458

59+
def _generate_prefix(self, container):
60+
"""
61+
Generate the prefix for a log line without colour
62+
"""
63+
name = container.name_without_project
64+
padding = ' ' * (self.prefix_width - len(name))
65+
return ''.join([name, padding, ' | '])
66+
4567
def _attach(self, container):
4668
params = {
4769
'stdout': True,

tests/unit/container_test.py

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,12 @@ def test_from_ps(self):
1313
"Ports":None,
1414
"SizeRw":0,
1515
"SizeRootFs":0,
16-
"Names":["/db_1"]
16+
"Names":["/figtest_db_1"]
1717
}, has_been_inspected=True)
1818
self.assertEqual(container.dictionary, {
1919
"ID": "abc",
2020
"Image":"ubuntu:12.04",
21-
"Name": "/db_1",
21+
"Name": "/figtest_db_1",
2222
})
2323

2424
def test_environment(self):
@@ -46,6 +46,24 @@ def test_number(self):
4646
"Ports":None,
4747
"SizeRw":0,
4848
"SizeRootFs":0,
49-
"Names":["/db_1"]
49+
"Names":["/figtest_db_1"]
5050
}, has_been_inspected=True)
5151
self.assertEqual(container.number, 1)
52+
53+
def test_name(self):
54+
container = Container.from_ps(None, {
55+
"Id":"abc",
56+
"Image":"ubuntu:12.04",
57+
"Command":"sleep 300",
58+
"Names":["/figtest_db_1"]
59+
}, has_been_inspected=True)
60+
self.assertEqual(container.name, "figtest_db_1")
61+
62+
def test_name_without_project(self):
63+
container = Container.from_ps(None, {
64+
"Id":"abc",
65+
"Image":"ubuntu:12.04",
66+
"Command":"sleep 300",
67+
"Names":["/figtest_db_1"]
68+
}, has_been_inspected=True)
69+
self.assertEqual(container.name_without_project, "db_1")

0 commit comments

Comments
 (0)