#!/usr/bin/env python # ----------------------------------------------------------------------- # Copyright (C) 2003 Chris Ottrey. # # 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 2 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 MER- # CHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General # Public License for more details. # ----------------------------------------------------------------------- # # This code is part of the pytvgrab project: # http://pytvgrab.sourceforge.net # # ----------------------------------------------------------------------- # Subversion Information, do not edit # # $Rev: 258 $ # $LastChangedDate: 2004-11-13 16:45:05 +1100 (Sat, 13 Nov 2004) $ # $LastChangedRevision: 258 $ # $LastChangedBy: ottrey $ # # $Log: $ # """Messaging service""" DEBUG=1 import sys, os import i18n import enum import output from output import red, green, blue, turquoise, yellow, purple, bold # keep this to help gettext extract strings for us: levels_name=[_( 'ERROR' ), _( 'QUIET' ), _( 'WARNING' ), _( 'INFO' ), _( 'MOREINFO' ), _( 'DEBUG' ) ] levels=[ 'ERROR', 'QUIET', 'WARNING', 'INFO', 'MOREINFO', 'DEBUG' ] color_map={ "ERROR": red, "QUIET": blue, "WARNING": yellow, "INFO": turquoise, "MOREINFO": bold, "DEBUG": purple } verbose_level=enum.Enum(levels) verbose=verbose_level.INFO from grabexceptions import ParseError import config_locale from config_locale import LC_ALL, encoding, toprint def get_value(a): result=None if a in verbose_level.values(): result=verbose_level.__dict__[a] else: raise Exception('Invalid value for verbose: %s\nis not one of %s' % (repr(a), verbose_level.values())) return result # get_value() def message(msg, vl=verbose_level.INFO): """ Internal message handling """ if verbose != None: if verbose >= vl: level = toprint( _( verbose_level[ vl ] ) ) if level: color = color_map[ verbose_level[ vl ] ] sys.stderr.write( color( level ) + ': ' ) msg = toprint( msg ) sys.stderr.write( msg + '\n' ) # message() # Or you could use these. def error( msg ): message(msg, verbose_level.ERROR) if DEBUG: import traceback traceback.print_exc() # error() def warning (msg): message(msg, verbose_level.WARNING) def info (msg): message(msg, verbose_level.INFO) def moreinfo(msg): message(msg, verbose_level.MOREINFO) def debug (msg): message(msg, verbose_level.DEBUG) def exception( e, indent=0 ): TABSPACE=" " if isinstance( e, UnicodeError ): start = e.start - 40 end = e.end + 40 if start < 0: start = 0 if end > len( e.object ): end = len( e.object ) text = e.object[ start : end ] tabs = TABSPACE * indent error( ( tabs + _( "Unicode Error:\n" ) + tabs + _( " Encoding: %s\n" ) + tabs + _( " Reason..: %s\n" ) + tabs + _( " String slice:\n%r\n" ) ) % ( e.encoding, e.reason, text ) ) elif isinstance( e, ParseError ): error( ( TABSPACE * indent ) + _( "Parse Error: %s" ) % e.args[ 0 ] ) if e.exception: # ParseError was caused by another exception exception( e.exception, indent ) if e.contents: debug( "-" * 70 ) debug( e.contents ) debug( "-" * 70 ) elif hasattr( e, 'args' ): error( ( TABSPACE * indent ) + _( "Got exception: %s" ) % e.args[ 0 ] ) else: # Some exceptions does not have any args # (for example HTMLParser.HTMLParseError) error( ( TABSPACE * indent ) + _( "Got exception: %s" ) % repr(e) ) # exception() # -------------- Unit Tests -------------- # using_unittest2=False try: import unittest2 as unittest using_unittest2=True except: import unittest class message_UnitTest(unittest.TestCase): def test01(self): v=get_value('ERROR') ; assert v == verbose_level.ERROR, v def test02(self): v=get_value('WARNING') ; assert v == verbose_level.WARNING, v def test03(self): v=get_value('INFO') ; assert v == verbose_level.INFO, v def test04(self): v=get_value('MOREINFO'); assert v == verbose_level.MOREINFO, v if using_unittest2 or __name__ == '__main__': unittest.main() # -------------- Unit Tests -------------- #