Source code for sutools

from sutools import cli_handler, log_handler, meta_handler, bench_handler
import inspect, os, logging, datetime

# init store
store = meta_handler.Store()
benchy = bench_handler.Benchy()


[docs]def register(func): '''register a function to the store :param func: the function to register ''' original_func = getattr(func, "__wrapped__", func) store.add_func(original_func) return func
[docs]def cli(desc = None, logs = False): '''init cli and register to store :param desc: description of the CLI :param logs: enable logging in CLI ''' if store.log: cli_obj = cli_handler.CLI(desc, logs, store.log) else: cli_obj = cli_handler.CLI(desc, logs) cli_obj.add_funcs(store.funcs) cli_obj.parse() store.add_cli(cli_obj) return cli_obj
[docs]def logger(name = os.path.basename(inspect.stack()[-1].filename)[:-3], loggers = None, loglvl = logging.INFO, filename = datetime.datetime.now().strftime('%Y-%m-%d_%H-%M-%S'), filepath = None, filefmt = logging.Formatter('%(asctime)s, %(msecs)d %(name)s %(levelname)s %(message)s', datefmt='%H:%M:%S'), fhandler = None, filecap = None, filetimeout = None, file = True, streamfmt = logging.Formatter('%(asctime)s, %(msecs)d %(name)s %(levelname)s %(message)s', datefmt='%H:%M:%S'), shandler = logging.StreamHandler(), stream = False): '''init logger object and register to store :param name: name of the logger :param loggers: list of names for the logger to create :param loglvl: logging level to use :param filename: name of the log file :param filepath: name of folder to create logs in :param filefmt: format of the file logger :param fhandler: file handler to use for logging :param filecap: maximum number of log files to keep :param filetimeout: define a timeout period for log files to be removed :param file: toggle file logging :param streamfmt: format of the stream logger :param shandler: stream handler to use for logging :param stream: toggle stream logging :Timeout String: <int><time_unit> - '10d': represents 10 days :Time Units: { "m": "minutes", "h": "hours", "d": "days", "o": "months", "y": "years" } ''' # if check for filepath must be inside function because filename is not initialized if not filepath: filepath = os.path.join('logs', name, f'{filename}.log') elif filepath: filepath = os.path.join(filepath, name, f'{filename}.log') # check if log path parent directory has been initialized if not os.path.exists(os.path.dirname(filepath)): os.makedirs(os.path.dirname(filepath)) # make parent directory tree for given filepath # if check for handler must be inside function because filename is not initialized if not fhandler: fhandler = logging.FileHandler(filepath, 'w') # if check for loggers must be inside function because func keys will be empty at initialization if not loggers and store.funcs: log_obj = log_handler.Logger(name, list(store.funcs.keys()), loglvl, filename, filepath, filefmt, fhandler, filecap, filetimeout, file, streamfmt, shandler, stream) else: log_obj = log_handler.Logger(name, loggers, loglvl, filename, filepath, filefmt, fhandler, filecap, filetimeout, file, streamfmt, shandler, stream) store.add_log(log_obj) return log_obj
[docs]def log(): '''retrieve loggers namespace from store''' return store.log.loggers