# Copyright 2016 Lars Wirzenius # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # =*= License: GPL-3+ =*= import sys import ttystatus class _Progress(object): def __init__(self): self.max_output_lines = None def __setitem__(self, key, value): raise NotImplementedError() def finish(self): raise NotImplementedError() class QuietProgress(_Progress): def __init__(self): super(QuietProgress, self).__init__() self.max_output_lines = 0 def __setitem__(self, key, value): pass def finish(self): pass class FancyProgress(_Progress): def __init__(self): super(FancyProgress, self).__init__() self._ts = self._setup_ttystatus() def __setitem__(self, key, value): self._ts[key] = value def finish(self): self._ts.finish() def _setup_ttystatus(self): ts = ttystatus.TerminalStatus(period=1) _, height = ts.get_terminal_size() format_lines = [ '%ElapsedTime() ' 'Project %Index(project,projects) %String(project_name)', 'Pipeline: %String(pipeline)', 'Step: %String(step)', 'Target: %String(target)', 'Command: %String(command)', 'Output: %String(line0)', ] self.max_output_lines = height - len(format_lines) for i in range(1, self.max_output_lines): format_lines.append(' : %%String(line%d)' % i) ts.format('\n'.join(format_lines)) return ts class VerboseProgress(_Progress): def __init__(self): super(VerboseProgress, self).__init__() self.max_output_lines = 0 self._values = {} def __setitem__(self, key, value): if key not in self._values or self._values[key] != value: self._values[key] = value self._notify(key, value) def _notify(self, key, value): indent = ' ' * 2 formats = { 'projects': None, 'project': None, 'project_name': 'Project: {value}', 'pipeline': indent + 'pipeline: {value}', 'step': indent * 2 + '{value}', 'target': indent * 3 + '{value}', 'command': indent * 4 + '{value}', 'line': indent * 5 + '{value}', } if key.startswith('line'): key = 'line' fmt = formats[key] if fmt is not None: sys.stdout.write(formats[key].format(key=key, value=value)) sys.stdout.write('\n') elif key in formats: if value: fmt = formats[key] if fmt is not None: sys.stdout.write(formats[key].format(key=key, value=value)) sys.stdout.write('\n') else: sys.stdout.write('==== {}={}\n'.format(key, value)) def finish(self): sys.stdout.write('ick has finished successfully\n')