170 lines
5.6 KiB
Python
170 lines
5.6 KiB
Python
|
|
# -*- mode:Python -*-
|
|
#
|
|
# This file is part of the Coriolis Software.
|
|
# Copyright (c) Sorbonne Université 2012-2021, All Rights Reserved
|
|
#
|
|
# +-----------------------------------------------------------------+
|
|
# | C O R I O L I S |
|
|
# | Alliance / Hurricane Interface |
|
|
# | |
|
|
# | Author : Jean-Paul Chaput |
|
|
# | E-mail : Jean-Paul.Chaput@lip6.fr |
|
|
# | =============================================================== |
|
|
# | Python : "./crlcore/helpers/io.py" |
|
|
# +-----------------------------------------------------------------+
|
|
|
|
import sys
|
|
import os
|
|
import os.path
|
|
import re
|
|
import traceback
|
|
import Cfg
|
|
import helpers
|
|
from Hurricane import UpdateSession
|
|
import Viewer
|
|
|
|
|
|
# -------------------------------------------------------------------
|
|
# Class : "ErrorMessage".
|
|
|
|
class ErrorMessage ( Exception ):
|
|
|
|
def __init__ ( self, code, *arguments ):
|
|
self.scriptPath = None
|
|
self.trace = traceback.extract_stack()
|
|
self.code = code
|
|
self.errors = [ 'Malformed call to ErrorMessage().'
|
|
, 'args:"{}"'.format(arguments) ]
|
|
|
|
if not isinstance(self.code,int):
|
|
self.errors = [ 'Malformed call to ErrorMessage(), first argument (code) must be an integer.'
|
|
, 'code:"{}"'.format(code)
|
|
, 'args:"{}"'.format(arguments) ]
|
|
return
|
|
|
|
text = None
|
|
if len(arguments) == 1:
|
|
if isinstance(arguments[0],Exception): text = str(arguments[0]).split('\n')
|
|
else:
|
|
self.errors = arguments[0]
|
|
elif len(arguments) > 1:
|
|
sys.stdout.flush()
|
|
text = list(arguments)
|
|
if text:
|
|
self.errors = []
|
|
while len(text) == 0: del text[0]
|
|
|
|
lstrip = 0
|
|
if text[0].startswith('[ERROR]'): lstrip = 8
|
|
|
|
for line in text:
|
|
if line[0:lstrip] == ' '*lstrip or \
|
|
line[0:lstrip-1] == '[ERROR]':
|
|
self.errors += [ line[lstrip:] ]
|
|
else:
|
|
self.errors += [ line.lstrip() ]
|
|
sys.stdout.flush()
|
|
return
|
|
|
|
def __str__ ( self ):
|
|
if not isinstance(self.errors,list):
|
|
return "[ERROR] %s" % self.errors
|
|
formatted = "\n"
|
|
for i in range(len(self.errors)):
|
|
if i == 0: formatted += "[ERROR] %s" % self.errors[i]
|
|
else: formatted += " %s" % self.errors[i]
|
|
if i+1 < len(self.errors): formatted += "\n"
|
|
return formatted
|
|
|
|
def getLinesAsString ( self ):
|
|
if not isinstance(self.errors,list): return self.errors
|
|
lines = ''
|
|
for line in self.errors: lines += line + '\n'
|
|
return lines
|
|
|
|
def addMessage ( self, message ):
|
|
if not isinstance(self.errors,list):
|
|
self.errors = [ self.errors ]
|
|
if isinstance(message,list):
|
|
for line in message:
|
|
self.errors += [ line ]
|
|
else:
|
|
self.errors += [ message ]
|
|
return
|
|
|
|
def terminate ( self ):
|
|
print( self )
|
|
sys.exit( self.code )
|
|
|
|
@staticmethod
|
|
def show ( code, *arguments ):
|
|
e = ErrorMessage( code, *arguments )
|
|
if not Viewer.Graphics.get().isEnabled():
|
|
raise e
|
|
tryCont = Viewer.ErrorWidget.run( e.getLinesAsString()
|
|
, helpers.textStackTrace( e.trace, False, e.scriptPath ))
|
|
if not tryCont: raise e
|
|
return
|
|
|
|
|
|
# -------------------------------------------------------------------
|
|
# Function : "catch()".
|
|
#
|
|
# Try to smartly display any exception on the TTY and the graphic
|
|
# display, if available.
|
|
|
|
def catch ( errorObject ):
|
|
if isinstance(errorObject,ErrorMessage):
|
|
em = errorObject
|
|
else:
|
|
em = ErrorMessage( 2, errorObject )
|
|
em.trace = traceback.extract_tb( sys.exc_info()[2] )
|
|
#em.scriptPath = __file__
|
|
print( em )
|
|
print( helpers.textStackTrace( em.trace, True, em.scriptPath ))
|
|
if Viewer.Graphics.get().isEnabled():
|
|
Viewer.ErrorWidget.run( em.getLinesAsString()
|
|
, helpers.textStackTrace( em.trace, False, em.scriptPath ))
|
|
if UpdateSession.getStackSize() > 0: UpdateSession.close()
|
|
return
|
|
|
|
|
|
# -------------------------------------------------------------------
|
|
# Class : "WarningMessage".
|
|
|
|
class WarningMessage ( Exception ):
|
|
|
|
def __init__ ( self, message ):
|
|
self._warnings = message
|
|
return
|
|
|
|
def __str__ ( self ):
|
|
if not isinstance(self._warnings,list):
|
|
return "[WARNING] %s" % self._warnings
|
|
|
|
formatted = "\n"
|
|
for i in range(len(self._warnings)):
|
|
if i == 0: formatted += "[WARNING] %s" % self._warnings[i]
|
|
else: formatted += " %s" % self._warnings[i]
|
|
if i+1 < len(self._warnings): formatted += "\n"
|
|
return formatted
|
|
|
|
|
|
# -------------------------------------------------------------------
|
|
# Function : "vprint()".
|
|
#
|
|
# Small wrap around print to make use of the verbosity levels.
|
|
|
|
def isVL ( level ):
|
|
confLevel = 0
|
|
if Cfg.getParamBool('misc.verboseLevel1').asBool(): confLevel = 1
|
|
if Cfg.getParamBool('misc.verboseLevel2').asBool(): confLevel = 2
|
|
#print( 'level {} <= confLevel {}'.format(level,confLevel))
|
|
return level <= confLevel
|
|
|
|
|
|
def vprint ( level, message ):
|
|
if isVL(level): print( message )
|
|
return
|