# -*- coding: utf-8 -*-
"""Il modulo io.py gestisce ogni input/output consentendo di uniformare e standardizzare le interazioni. \
Tutte le funzioni di output scrivono nel log, usando rispettivamente il livello della funzione di output, \
il log viene scritto solo se effettivamente la funzione viene eseguita. \
Le funzioni di output sono poste sotto controllo della verbosità, il che vuol dire che l'output viene \
eseguita solo se il grado di verbose (indicato all'esecuzione o quello di default) è uguale o maggiore \
a quello richiesto dalla funzione di print. \
- debug: richiede verbosity 3
- info: richiede verbosity 2
- warning: richiede verbosity 2
- error: richiede verbosity 1
- critical: richiede verbosity 1
- exception: richiede verbosity 1
"""
import json
import sys
from io import StringIO
from aziona.core import log
from aziona.core.conf import errors, settings
[documenti]def confirm(message="Confermi:"):
"""Funzione per la conferma attraverso input
Args:
message (str): Il messaggio che viene stampato a video
Returns:
bool: Ritorna True se ha confermato, False se ha negato.
Raises:
Exception: se i valori inseriti in input non sono validi
"""
yes = ["yes", "y", "si", "s"]
no = ["no", "n"]
choice = std_input(message + " (opzioni " + ",".join(yes + no) + "):").lower()
if choice in yes:
return True
if choice in no:
return False
raise Exception("Inserrire %s oppure %s" % (yes, no))
[documenti]@settings.verbose(level=3)
def debug(message):
"""Funzione per stampare le info di debug
Viene eseguita solo se soddisfa le condizioni del decoratore @verbose.In automatico viene loggata la risposta.
Args:
message (str): Il messaggio che viene stampato a video e nel log
Returns:
void
Raises:
None
"""
log.debug(message)
print("[DEBUG] %s" % message)
[documenti]@settings.verbose(level=2)
def info(message):
"""Funzione per stampare le info
Viene eseguita solo se soddisfa le condizioni del decoratore @verbose.In automatico viene loggata la risposta.
Args:
message (str): Il messaggio che viene stampato a video e nel log
Returns:
void
Raises:
None
"""
log.info(message)
print("[INFO] %s" % message)
[documenti]@settings.verbose(level=2)
def step(message: str, deep: int = 0):
"""Funzione per stampare gli avanzamenti
Viene eseguita solo se soddisfa le condizioni del decoratore @verbose.In automatico viene loggata la risposta.
Args:
message (str): Il messaggio che viene stampato a video e nel log
Returns:
void
Raises:
None
"""
log.info(message)
print("[STEP]%s+-- %s" % (("\t" * deep), message))
[documenti]@settings.verbose(level=2)
def warning(message):
"""Funzione per stampare i warning
Viene eseguita solo se soddisfa le condizioni del decoratore @verbose.In automatico viene loggata la risposta.
Args:
message (str): Il messaggio che viene stampato a video e nel log
Returns:
void
Raises:
None
"""
log.warning(message)
print("[WARNING] %s" % message)
[documenti]@settings.verbose(level=1)
def response(message):
"""Funzione per stampare le risposte
Viene eseguita solo se soddisfa le condizioni del decoratore @verbose.In automatico viene loggata la risposta.
Args:
message (str): Il messaggio che viene stampato a video e nel log
Returns:
void
Raises:
None
"""
log.info(message)
print("[RESPONSE] %s" % message)
[documenti]@settings.verbose(level=1)
def error(message: str):
"""Funzione per stampare errori
Viene eseguita solo se soddisfa le condizioni del decoratore @verbose.In automatico viene loggata la risposta.
Args:
message (str): Il messaggio che viene stampato a video e nel log
Returns:
void
Raises:
Exception: Indica l'errore
"""
log.error(message)
print("[ERROR] %s" % message)
[documenti]@settings.verbose(level=1)
def critical(message: str):
"""Funzione per stampare errori critici
Viene eseguita solo se soddisfa le condizioni del decoratore @verbose. In automatico viene loggata la risposta.
In automatico effettua il raise e bloccando l'esecuzione
Args:
message (str): Il messaggio che viene stampato a video e nel log
Returns:
void
Raises:
Exception: Indica l'errore
"""
try:
raise errors.CriticalError(message=message)
except Exception as e:
exception(e, with_traceback=False)
[documenti]@settings.verbose(level=1)
def exception(
exception: Exception,
message: str = None,
exitcode: int = 1,
with_traceback: bool = True,
):
"""Funzione per stampare le eccezzioni
Viene eseguita solo se soddisfa le condizioni del decoratore @verbose.In automatico viene loggata la risposta.
Args:
exception (exceptions): L'eccezzione cattorata nel except
message (str,optional): Il messaggio aggiuntivo
exitcode (int,optional): Il numero intero con cui terminare il programma
with_traceback (bool,optional): Se true stampa a video il traceback dell'errore
Returns:
void
Raises:
None
"""
def func(exception: Exception, message: str, exitcode: int, with_traceback: bool):
log.exception(message)
print("[EXCEPTION] %s\n%s" % (message, str(exception)))
if with_traceback is True:
import traceback
print(traceback.format_exc())
sys.exit(exitcode if isinstance(exitcode, int) else 1)
try:
if not isinstance(exception, Exception):
raise errors.ExcpetionNotValidError(exception=str(exception))
except Exception as e:
exception = e
func(exception, message, exitcode, with_traceback)
[documenti]class Capturing(list):
def __enter__(self):
self._stdout = sys.stdout
sys.stdout = self._stringio = StringIO()
return self
def __exit__(self, *args):
self.extend(self._stringio.getvalue())
del self._stringio # free up some memory
sys.stdout = self._stdout
def __str__(self):
return "".join(self)
[documenti] def json(self):
return json.dumps(self.__str__())