| | import logging |
| | import multiprocessing |
| | import os |
| | import subprocess |
| |
|
| |
|
| | LOGGER_NAME = "DiffDock" |
| | LOGLEVEL_KEY = "DIFFDOCK_LOGLEVEL" |
| |
|
| |
|
| | def _get_formatter(loglevel="INFO"): |
| | warn_fmt = "[%(asctime)s] %(levelname)s -%(message)s" |
| | debug_fmt = "[%(asctime)s] [%(filename)s:%(lineno)d] %(levelname)s - %(message)s" |
| | fmt = debug_fmt if loglevel.upper() in {"DEBUG", "INFO"} else warn_fmt |
| | return logging.Formatter( |
| | fmt=fmt, |
| | datefmt="%Y-%b-%d %H:%M:%S %Z", |
| | ) |
| |
|
| |
|
| | def remove_all_handlers(logger): |
| | while logger.hasHandlers(): |
| | logger.removeHandler(logger.handlers[0]) |
| |
|
| |
|
| | def configure_logger(loglevel=None, logger_name=LOGGER_NAME, logfile=None): |
| | """Do basic logger configuration and set our main logger""" |
| |
|
| | |
| | if loglevel is None: |
| | loglevel = os.environ.get(LOGLEVEL_KEY, "WARNING") |
| | else: |
| | os.environ[LOGLEVEL_KEY] = loglevel |
| |
|
| | logger = logging.getLogger(logger_name) |
| | logger.setLevel(loglevel) |
| | remove_all_handlers(logger) |
| | logger.propagate = False |
| |
|
| | formatter = _get_formatter(loglevel) |
| | def _prep_handler(handler): |
| | for ex_handler in logger.handlers: |
| | if type(ex_handler) == type(handler): |
| | |
| | logger.removeHandler(ex_handler) |
| | handler.setLevel(loglevel) |
| | handler.setFormatter(formatter) |
| | logger.addHandler(handler) |
| |
|
| | sh = logging.StreamHandler() |
| | _prep_handler(sh) |
| |
|
| | if logfile is not None: |
| | fh = logging.FileHandler(logfile, mode="a") |
| | _prep_handler(fh) |
| |
|
| |
|
| | def get_logger(base_name=LOGGER_NAME): |
| | """ |
| | Return a logger. |
| | Use a different logger in each subprocess, though they should all have the same log level. |
| | """ |
| | pid = os.getpid() |
| | logger_name = f"{base_name}-process-{pid}" |
| | logger = logging.getLogger(logger_name) |
| | if not logger.hasHandlers(): |
| | configure_logger(logger_name=logger_name) |
| | return logger |
| |
|
| |
|
| | def get_git_revision_hash() -> str: |
| | """ |
| | Get the full git revision of the latest HEAD. |
| | Note: This only works if run from git directory. |
| | """ |
| | return subprocess.check_output(["git", "rev-parse", "HEAD"]).decode("ascii").strip() |
| |
|
| |
|
| | def get_git_revision_short_hash() -> str: |
| | """ |
| | Get the short git revision of the latest HEAD. |
| | Note: This only works if run from git directory. |
| | Returns: |
| | |
| | """ |
| | return ( |
| | subprocess.check_output(["git", "rev-parse", "--short", "HEAD"]) |
| | .decode("ascii") |
| | .strip() |
| | ) |
| |
|
| |
|
| | def check_git_uncommitted() -> bool: |
| | changed_files = ( |
| | subprocess.check_output(["git", "status", "-suno"]).decode("ascii").strip() |
| | ) |
| | lines = list(filter(lambda x: x, changed_files.split("\n"))) |
| | return len(lines) > 0 |
| |
|
| |
|