import os
from datetime import datetime
from distutils.version import LooseVersion
from aziona.core.conf import const
DEFAULT = {
"AZIONA_TEMPLATE_FILE_NAME": ".aziona.yml",
"AZIONA_VERBOSITY": "1",
"AZIONA_SESSION_FILENAME": "/tmp/aziona-session",
"AZIONA_LOGGING_NAME": "main",
"AZIONA_PATH": os.environ["HOME"] + "/.aziona",
"AZIONA_MODULES_PATH": os.environ["HOME"] + "/.aziona/modules",
"AZIONA_TERRAFORM_MODULES_PATH": os.environ["HOME"] + "/.aziona/terraform-modules",
"AZIONA_LOGGING_PATH": os.environ["HOME"] + "/.aziona/logs",
"AZIONA_LOGGING_FORMAT": "%(asctime)s - %(name)s - %(levelname)s - %(message)s",
"AZIONA_DATA": str(datetime.now().strftime("%Y-%m-%d")),
"AZIONA_DATATIME_START": str(datetime.now().strftime("%Y-%m-%d %H:%m:%s")),
}
RUNTIME_ENV = {}
[documenti]def getconst(key: str = None, default=None):
return const.getconst(key, default)
[documenti]def environ(**kargs: str) -> dict:
"""Restituisce l'ambiente dell'intero processo run-time, unendo:
1. os.environ
2. aziona.core.conf.config (solo ed esclusivamente i valore stringa)
3. gli argomenti passati alla funzione
Args:
**kargs(str): valori da aggiungere all'environ
Returns:
dict: environ completo
"""
# Recupera le varibili env del processo
environ = {**os.environ.copy()}
# Recupera i valori degli argomenti
for key, value in kargs.items():
if isinstance(value, str):
environ[key] = value
return environ
[documenti]def getenv(key: str, default=None) -> str:
return environ().get(key, default)
[documenti]def get_data() -> str:
return getenv(key="AZIONA_DATA")
[documenti]def get_execution_start() -> str:
return getenv(key="AZIONA_DATATIME_START")
[documenti]def get_logging_basepath() -> str:
return getenv(key="AZIONA_LOGGING_PATH")
[documenti]def get_logging_name() -> str:
return getenv(key="AZIONA_LOGGING_NAME")
[documenti]def get_logging_filepath() -> str:
return get_logging_basepath() + "/" + get_logging_name() + "-" + get_data() + ".log"
[documenti]def get_logging_level() -> list:
return ["info", "warning", "error", "debug", "critical", "exception"]
[documenti]def get_aziona_template_name() -> str:
return getenv("AZIONA_TEMPLATE_FILE_NAME")
[documenti]def get_aziona_template_path() -> str:
return getenv("AZIONA_TEMPLATE_PATH")
[documenti]def get_session_path(session_filepath: str = None) -> str:
return session_filepath or getenv("AZIONA_SESSION_FILENAME")
[documenti]def get_verbosity_level() -> LooseVersion:
"""Recupera il livello di verbosità del modulo.
Il valore che ritorna è quello che il modulo ha in quell'instante.
Args:
None
Returns:
int: The return value. Level of verbosity
Raises:
None
"""
value = getenv("AZIONA_VERBOSITY")
if value in getconst("VERBOSITY_LEVEL"):
return LooseVersion(value)
return LooseVersion(DEFAULT["AZIONA_VERBOSITY"])
[documenti]def setenv(key: str, value: str, overwrite: bool = False) -> None:
"""Caricamento di una nuova variabile di ambiente
Args:
key (str): Nome variabili d'ambiente
value (str): Valore
overwrite (bool,optional): Overwrite variabile d'ambiente se esiste già
Returns:
None
"""
if not isinstance(key, str):
raise Exception("ENVIRON KEY is not str")
if not isinstance(value, str):
value = str(value)
key = key.upper()
if key in environ().keys() and overwrite is False:
return
globals()["RUNTIME_ENV"].update({key: value})
os.environ[key] = value
[documenti]def setenv_from_dict(overwrite: bool = False, **kargs) -> None:
"""Caricamento varibili di ambiente a partire da un dict.
Se il valore è un dict verrà caricato con la chiave principale seguita dalla secondaria, KEY_KEYCHILD=VALUECHILD.
Ex. {test:{subtest:'ok'}} => TEST_SUBTEST=ok
Args:
overwrite (bool,optional): Overwrite variabile d'ambiente se esiste già
**kargs: chiave=valore
Returns:
None
"""
for key, value in kargs.items():
if isinstance(kargs[key], str):
setenv(key, value, overwrite)
continue
if isinstance(kargs[key], dict):
[setenv(key + "_" + k, v, overwrite) for k, v in kargs[key].items()]
raise Exception("Errore caricamento env %s=%s"(key, str(value)))
[documenti]def verbose(level: str):
"""DECORATORE - Utilizzato per wrappare le funzioni di i/o
Consente alla funzione wrappata di essere eseguita o no in base al livello di verbosity indicato.
Se il livello richiesto è >= a quello restituito dalla funzione get_verbosity_level() la funzione verrà eseguita.
Se il livello è minore verrà ignorata.
Args:
level (int): Indica il livello in cui la funzione può essere eseguita.
Returns:
function: Ritorna la funzione wrappata se soddisfa le condizioni di verbosity, sennò torna una funzione vuota.
"""
import functools
def actual_decorator(func):
def neutered(*args, **kw):
return
@functools.wraps(func)
def wrapper(*args, **kwargs):
return (
func(*args, **kwargs)
if LooseVersion(str(level)) <= get_verbosity_level()
else neutered
)
return wrapper
return actual_decorator
####
# LOAD DEFAULT ENV
####
setenv_from_dict(overwrite=False, **DEFAULT)