From 154adc580776cd3a9742ad48a142e7c2918da60f Mon Sep 17 00:00:00 2001 From: Evan Shaw Date: Sat, 25 Feb 2017 13:48:02 +1300 Subject: [PATCH] Align status output for parallel_execute Previously docker-compose would output lines that looked like: Starting service ... done Starting short ... Starting service-with-a-long-name ... done It's difficult to scan down this output and get an idea of what's happening. Now the statuses are aligned, and output looks like this: Starting service ... done Starting short ... Starting service-with-a-long-name ... done To me, this is quite a bit easier to read. Signed-off-by: Evan Shaw --- compose/parallel.py | 18 +++++++++++++----- tests/unit/parallel_test.py | 15 +++++++++++++++ 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/compose/parallel.py b/compose/parallel.py index 34fef71db..a611fd6e0 100644 --- a/compose/parallel.py +++ b/compose/parallel.py @@ -38,7 +38,8 @@ def parallel_execute(objects, func, get_name, msg, get_deps=None, limit=None): writer = ParallelStreamWriter(stream, msg) for obj in objects: - writer.initialize(get_name(obj)) + writer.add_object(get_name(obj)) + writer.write_initial() events = parallel_execute_iter(objects, func, get_deps, limit) @@ -224,12 +225,18 @@ class ParallelStreamWriter(object): self.stream = stream self.msg = msg self.lines = [] + self.width = 0 - def initialize(self, obj_index): + def add_object(self, obj_index): + self.lines.append(obj_index) + self.width = max(self.width, len(obj_index)) + + def write_initial(self): if self.msg is None: return - self.lines.append(obj_index) - self.stream.write("{} {} ... \r\n".format(self.msg, obj_index)) + for line in self.lines: + self.stream.write("{} {:<{width}} ... \r\n".format(self.msg, line, + width=self.width)) self.stream.flush() def write(self, obj_index, status): @@ -241,7 +248,8 @@ class ParallelStreamWriter(object): self.stream.write("%c[%dA" % (27, diff)) # erase self.stream.write("%c[2K\r" % 27) - self.stream.write("{} {} ... {}\r".format(self.msg, obj_index, status)) + self.stream.write("{} {:<{width}} ... {}\r".format(self.msg, obj_index, + status, width=self.width)) # move back down self.stream.write("%c[%dB" % (27, diff)) self.stream.flush() diff --git a/tests/unit/parallel_test.py b/tests/unit/parallel_test.py index d10948eb0..73728fdfd 100644 --- a/tests/unit/parallel_test.py +++ b/tests/unit/parallel_test.py @@ -115,3 +115,18 @@ def test_parallel_execute_with_upstream_errors(): assert (data_volume, None, APIError) in events assert (db, None, UpstreamError) in events assert (web, None, UpstreamError) in events + + +def test_parallel_execute_alignment(capsys): + results, errors = parallel_execute( + objects=["short", "a very long name"], + func=lambda x: x, + get_name=six.text_type, + msg="Aligning", + ) + + assert errors == {} + + _, err = capsys.readouterr() + a, b = err.split('\n')[:2] + assert a.index('...') == b.index('...')