# HG changeset patch # User Goffi # Date 1487202294 -3600 # Node ID 7cbffd754b4a59c01b240996e3b814accd097d2a # Parent f67434fd88d26f01a3a432f3f4f052c64d8e0a39 core (constants), tools (common/ansi): moved ANSI escape codes to a dedicated class, with helper methods diff -r f67434fd88d2 -r 7cbffd754b4a src/core/constants.py --- a/src/core/constants.py Thu Feb 16 00:40:50 2017 +0100 +++ b/src/core/constants.py Thu Feb 16 00:44:54 2017 +0100 @@ -313,17 +313,6 @@ DEFAULT_MAX_AGE = 1209600 # default max age of cached files, in seconds HASH_SHA1_EMPTY = 'da39a3ee5e6b4b0d3255bfef95601890afd80709' - - ## ANSI escape sequences ## - # XXX: used for logging - # XXX: they will be probably moved in a dedicated module in the future - ANSI_RESET = '\033[0m' - ANSI_NORMAL_WEIGHT = '\033[22m' - ANSI_FG_BLACK, ANSI_FG_RED, ANSI_FG_GREEN, ANSI_FG_YELLOW, ANSI_FG_BLUE, ANSI_FG_MAGENTA, ANSI_FG_CYAN, ANSI_FG_WHITE = ('\033[3%dm' % nb for nb in xrange(8)) - ANSI_BOLD = '\033[1m' - ANSI_BLINK = '\033[5m' - ANSI_BLINK_OFF = '\033[25m' - @classmethod def LOG_OPTIONS(cls): """Return options checked for logs""" diff -r f67434fd88d2 -r 7cbffd754b4a src/core/log.py --- a/src/core/log.py Thu Feb 16 00:40:50 2017 +0100 +++ b/src/core/log.py Thu Feb 16 00:44:54 2017 +0100 @@ -22,6 +22,7 @@ # TODO: change formatting from "%s" style to "{}" when moved to Python 3 from sat.core.constants import Const as C +from sat.tools.common.ansi import ANSI as A from sat.core import exceptions backend = None @@ -235,10 +236,10 @@ for elt in taint_list: elt = elt.upper() try: - ansi = getattr(C, 'ANSI_FG_{}'.format(elt)) + ansi = getattr(A, 'FG_{}'.format(elt)) except AttributeError: try: - ansi = getattr(C, 'ANSI_{}'.format(elt)) + ansi = getattr(A, elt) except AttributeError: # we use raw string if element is unknown ansi = elt @@ -318,9 +319,9 @@ if cls._color_location: return message % {'color_start': start, - 'color_end': C.ANSI_RESET} + 'color_end': A.RESET} else: - return '%s%s%s' % (start, message, C.ANSI_RESET) + return '%s%s%s' % (start, message, A.RESET) @staticmethod def getProfile(): diff -r f67434fd88d2 -r 7cbffd754b4a src/tools/common/ansi.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/tools/common/ansi.py Thu Feb 16 00:44:54 2017 +0100 @@ -0,0 +1,49 @@ +#!/usr/bin/env python2 +# -*- coding: utf-8 -*- + +# SàT: a XMPP client +# Copyright (C) 2009-2016 Jérôme Poisson (goffi@goffi.org) + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero 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 Affero General Public License for more details. + +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +import sys + +class ANSI(object): + + ## ANSI escape sequences ## + RESET = '\033[0m' + NORMAL_WEIGHT = '\033[22m' + FG_BLACK, FG_RED, FG_GREEN, FG_YELLOW, FG_BLUE, FG_MAGENTA, FG_CYAN, FG_WHITE = ('\033[3%dm' % nb for nb in xrange(8)) + BOLD = '\033[1m' + BLINK = '\033[5m' + BLINK_OFF = '\033[25m' + + @classmethod + def color(cls, *args): + """output text using ANSI codes + + this method simply merge arguments, and add RESET if is not the last arguments + """ + # XXX: we expect to have at least on argument + if args[-1] != cls.RESET: + args = list(args) + args.append(cls.RESET) + return u''.join(args) + + +if not sys.stdout.isatty(): + # we don't want ANSI escape codes if we are not outputing to a tty! + for attr in dir(ANSI): + if isinstance(getattr(ANSI, attr), basestring): + setattr(ANSI, attr, u'')