# 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 logging class LineLogger(object): # pragma: no cover def __init__(self, progress, logger): self._progress = progress self._progress_lines = [] self._logger = logger self._buffer = '' self._lineno = 0 def log_lines(self, text): self._buffer += text while '\n' in self._buffer: line, self._buffer = self._buffer.split('\n', 1) self._log_line(line) # Return empty string so that cliapp doesn't collect # potentially large amounts of text pointlessly. return '' def _log_line(self, line): self._lineno += 1 line = '{lineno:>04}: {line}'.format(lineno=self._lineno, line=line) logging.debug('STDOUT: %s', line) self._logger.chatty('{line}', line=line) lines = self._progress_lines max_lines = self._progress.max_output_lines lines.append(line) if len(lines) > max_lines: del lines[:-max_lines] for i, line in enumerate(lines): self._progress['line%d' % i] = line for i in range(len(lines), max_lines + 1): self._progress['line%d' % i] = '' def log_rest(self): if self._buffer: self._log_line(self._buffer)