#!/usr/bin/env python
u"""
utilities.py
Written by Tyler Sutterley (10/2021)
Management utilities for Yet Another Photon Classifier (YAPC)
UPDATE HISTORY:
Written 10/2021
"""
import os
import re
import shutil
import logging
[docs]def build_logger(name, **kwargs):
"""
Builds a logging instance with the specified name
Parameters
----------
name: str
name of the logger
format: str
event description message format
level: int or obj, default logging.CRITICAL
lowest-severity log message logger will handle
propagate: bool, default False
events logged will be passed to higher level handlers
stream: obj or NoneType, default None
specified stream to initialize StreamHandler
"""
# set default arguments
kwargs.setdefault('format', '%(levelname)s:%(name)s:%(message)s')
kwargs.setdefault('level', logging.CRITICAL)
kwargs.setdefault('propagate',False)
kwargs.setdefault('stream',None)
# build logger
logger = logging.getLogger(name)
logger.setLevel(kwargs['level'])
logger.propagate = kwargs['propagate']
# create and add handlers to logger
if not logger.handlers:
# create handler for logger
handler = logging.StreamHandler(stream=kwargs['stream'])
formatter = logging.Formatter(kwargs['format'])
handler.setFormatter(formatter)
# add handler to logger
logger.addHandler(handler)
return logger
# PURPOSE: convert file lines to arguments
[docs]def convert_arg_line_to_args(arg_line):
"""
Convert file lines to arguments
Parameters
----------
arg_line: str
line string containing a single argument and/or comments
"""
# remove commented lines and after argument comments
for arg in re.sub(r'\#(.*?)$',r'',arg_line).split():
if not arg.strip():
continue
yield arg
# PURPOSE: make a copy of a file with all system information
[docs]def copy(source, destination, move=False):
"""
Copy or move a file with all system information
Parameters
----------
source: str
source file
destination: str
copied destination file
move: bool, default False
remove the source file
"""
source = os.path.abspath(os.path.expanduser(source))
destination = os.path.abspath(os.path.expanduser(destination))
shutil.copyfile(source, destination)
shutil.copystat(source, destination)
if move:
os.remove(source)