|
from datetime import datetime |
|
from contextlib import contextmanager |
|
import sys |
|
import pytz |
|
import os |
|
|
|
class CustomParams: |
|
""" |
|
Class for custom parameters where dictionary elements can be accessed as attributes |
|
""" |
|
def __init__(self, **kwargs): |
|
self.__dict__.update(kwargs) |
|
|
|
def print_config(self,indent=''): |
|
for attr, value in self.__dict__.items(): |
|
print(f"{indent}{attr}: {value}") |
|
|
|
def log_update(text: str): |
|
""" |
|
Logs input text to an output file |
|
|
|
Args: |
|
text (str): the text to be logged |
|
""" |
|
print(text) |
|
sys.stdout.flush() |
|
|
|
@contextmanager |
|
def open_logfile(log_path,mode='w'): |
|
""" |
|
Open log-file for real-time logging of the most important updates |
|
""" |
|
log_file = open(log_path, mode) |
|
original_stdout = sys.stdout |
|
sys.stdout = log_file |
|
try: |
|
yield log_file |
|
finally: |
|
sys.stdout = original_stdout |
|
log_file.close() |
|
|
|
@contextmanager |
|
def open_errfile(log_path,mode='w'): |
|
""" |
|
Redirects stderr (error messages) to a separate log file. |
|
""" |
|
log_file = open(log_path, mode) |
|
original_stderr = sys.stderr |
|
sys.stderr = log_file |
|
try: |
|
yield log_file |
|
finally: |
|
sys.stderr = original_stderr |
|
log_file.close() |
|
|
|
def print_configpy(module): |
|
""" |
|
Prints all the configurations in a config.py file |
|
""" |
|
log_update("All configurations:") |
|
|
|
for attribute in dir(module): |
|
|
|
if not attribute.startswith("__"): |
|
value = getattr(module, attribute) |
|
log_update(f"\t{attribute}: {value}") |
|
|
|
def get_local_time(timezone_str='US/Eastern'): |
|
""" |
|
Get current time in the specified timezone. |
|
|
|
Args: |
|
timezone_str (str): The timezone to retrieve time for. Defaults to 'US/Eastern'. |
|
|
|
Returns: |
|
str: The formatted current time in the specified timezone. |
|
""" |
|
try: |
|
timezone = pytz.timezone(timezone_str) |
|
except pytz.UnknownTimeZoneError: |
|
return f"Unknown timezone: {timezone_str}" |
|
|
|
current_datetime = datetime.now(pytz.utc).astimezone(timezone) |
|
return current_datetime.strftime('%m-%d-%Y-%H:%M:%S') |
|
|
|
def get_local_date_yr(timezone_str='US/Eastern'): |
|
""" |
|
Get current time in the specified timezone. |
|
|
|
Args: |
|
timezone_str (str): The timezone to retrieve time for. Defaults to 'US/Eastern'. |
|
|
|
Returns: |
|
str: The formatted current time in the specified timezone. |
|
""" |
|
try: |
|
timezone = pytz.timezone(timezone_str) |
|
except pytz.UnknownTimeZoneError: |
|
return f"Unknown timezone: {timezone_str}" |
|
|
|
current_datetime = datetime.now(pytz.utc).astimezone(timezone) |
|
return current_datetime.strftime('%m_%d_%Y') |
|
|
|
def find_fuson_plm_directory(): |
|
""" |
|
Constructs a path backwards to fuson_plm directory so we don't have to use absolute paths (helps for docker containers) |
|
""" |
|
current_dir = os.path.abspath(os.getcwd()) |
|
|
|
while True: |
|
if 'fuson_plm' in os.listdir(current_dir): |
|
return os.path.join(current_dir, 'fuson_plm') |
|
parent_dir = os.path.abspath(os.path.join(current_dir, '..')) |
|
if parent_dir == current_dir: |
|
raise FileNotFoundError("fuson_plm directory not found.") |
|
current_dir = parent_dir |