Browse Source

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

Better log printing
Aanand Prasad 11 years ago
parent
commit
c78b952c3d
2 changed files with 44 additions and 4 deletions
  1. 23 1
      fig/cli/log_printer.py
  2. 21 3
      tests/unit/container_test.py

+ 23 - 1
fig/cli/log_printer.py

@@ -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,

+ 21 - 3
tests/unit/container_test.py

@@ -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")